在“echo command | ssh server”和“ssh server command”之间混淆

Kar*_*hik 6 scripting login

在我学习非交互式登录 shell 的过程中,我遇到了 2 种通过 SSH 远程执行命令的方法。对我来说,它们看起来都是一样的。但不幸的是,他们不是。

使用命令echo "shopt login_shell; echo \$-" | ssh -l poweruser 192.168.1.67,我得到以下输出。

Pseudo-terminal will not be allocated because stdin is not a terminal.
poweruser@192.168.1.67's password:
login_shell     on 
hBs
Run Code Online (Sandbox Code Playgroud)

但是使用命令ssh -l poweruser 192.168.1.67 "shopt login_shell; echo \$-",我得到了不同的输出。

poweruser@192.168.1.67's password:
login_shell     off
hBc
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么在第二种情况下 shell 不是登录 shell,即使它提示输入密码。

Mic*_*mer 10

man ssh文件

如果指定了命令,它将在远程主机上执行,而不是在登录 shell 上执行。

原因是在一种情况下您指定了命令,而在另一种情况下您没有指定,并且ssh故意(按设计)在这些情况下表现不同。

在您没有提供命令的情况下,启动了一个登录 shell,它读取管道输入并执行它。在您确实提供了命令的地方,它被启动了。

提示输入密码是无关的。这是在启动 shell 或命令之前向服务器验证您的身份。