ssh:強制不同的 shell 執行非互動式命令
ssh
如何通過遠端伺服器強制特定的 shell 用於非互動式命令執行?我在遠端伺服器上的預設 shell 是
zsh
,但我需要使用/bin/sh
. 當我執行以下命令時,foo
將由zsh
(如預期的那樣)執行:ssh -tq -l root -o LogLevel=ERROR remote-server "foo"
我試過指定
/bin/sh -c "foo"
,但這只會導致zsh
啟動/bin/sh
然後執行foo
。我需要
/bin/sh
直接使用,而不是通過zsh
是否有一些選項
ssh
,或者一些本地或遠端設置,以便我可以定義不同的外殼?我可以為所有非互動式命令(非登錄 shell)設置不同的 shell 嗎?
按照設計,繞過登錄 shell 是不可能的。您可以設置一個shell 受限的SSH 帳戶(例如,rsh/rksh/rbash/… 中的受限shell,或者只允許某些特定協議的shell,例如rssh 或git-shell)。客戶端不能指定不同的 shell。
要在不同的 shell 中執行程式碼,您必須讓您的登錄 shell 執行該 shell 並將程式碼傳遞給內部 shell。這與使用其他語言(如 perl、python 等)執行解釋程式碼所需的操作沒有什麼不同。注意正確引用。如果您不需要標準輸入,請在標準輸入上傳遞腳本,這樣您就不需要嵌套引用。
同一帳戶的使用者數據庫中可能有多個條目。“同一個賬號”是指同一個使用者ID。這些條目必須有不同的使用者名,並且可以有不同的密碼、不同的 shell 等。請參閱你能給一個使用者帳戶多個密碼嗎?. 請注意,這不是很健壯,因為某些程序會從使用者 ID 進行查找(而不是從
$USER
環境變數中的使用者名進行查找,該使用者名設置為使用者在登錄時選擇的名稱)。如果您希望 zsh 用於互動式使用,但希望使用 Bourne 樣式的 SSH 外殼,您可以做我所做的:我將我的登錄外殼設置為
/bin/sh
(或擁有 POSIX 外殼所需的任何東西),並且我有(一些更複雜的版本)export SHELL=/bin/zsh; exec $SHELL
在我的.profile
.