Shell

ssh:強制不同的 shell 執行非互動式命令

  • August 24, 2021

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.

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