Scripting

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

  • July 30, 2018

在學習非互動式登錄 shell 的過程中,我遇到了兩種通過 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

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

poweruser@192.168.1.67's password:
login_shell     off
hBc

你能告訴為什麼shell在第二種情況下不是登錄shell,即使它提示輸入密碼。

man ssh文件

如果指定了命令,它將在遠端主機而不是登錄 shell 上執行。

原因是在一種情況下您指定了一個命令,而在另一種情況下您沒有指定,並且ssh故意(通過設計)在這些情況下表現不同。

在您沒有提供命令的地方,會啟動一個登錄 shell,它會讀取管道輸入並執行它。在您確實提供了命令的地方,它被啟動了。

提示輸入密碼無關。這是在啟動 shell 或命令之前對伺服器進行身份驗證。

引用自:https://unix.stackexchange.com/questions/459252