Scripting
在“echo command | ssh server”和“ssh server command”之間混淆
在學習非互動式登錄 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,即使它提示輸入密碼。
如果指定了命令,它將在遠端主機而不是登錄 shell 上執行。
原因是在一種情況下您指定了一個命令,而在另一種情況下您沒有指定,並且
ssh
故意(通過設計)在這些情況下表現不同。在您沒有提供命令的地方,會啟動一個登錄 shell,它會讀取管道輸入並執行它。在您確實提供了命令的地方,它被啟動了。
提示輸入密碼無關。這是在啟動 shell 或命令之前對伺服器進行身份驗證。