Ssh

將變數定義傳遞給 ssh 中的特定 shell

  • October 7, 2015

我想 ssh 到具有預定義設置的機器,特別是在 zsh 中。

為此,我嘗試從客戶端執行以下操作(受此答案的啟發):

$ ssh -t machine@domain "STARTUP_OPTION='A'; exec /path/to/zsh;"

然後我.zshrc在伺服器中有以下內容:

if [ "$STARTUP_OPTION" = "A" ]; then
   echo "Logging in with A"
fi

這似乎不起作用。如何在遠端 shell 中傳遞 shell 變數的值時使用特定 shell 登錄?

預設情況下,通過 SSH 連接傳輸的唯一環境變數是TERM. 你可以在那裡打包資訊,但你必須確保它會在伺服器端被解包。客戶端可以傳輸其他消息,但需要將伺服器設置為AcceptEnv使用/etc/sshd_config. 在 Debian 和大多數衍生產品(Ubuntu、Mint 等)下,名稱以開頭的所有變數LC_也被 SSH 伺服器接受。這些變數通常用於區域設置,但您可以使用自己的一個來傳遞其他內容。如果您的伺服器允許,您可以簡單地編寫

LC_STARTUP_OPTION=A ssh

另一種可能性是執行基於使用者身份驗證密鑰的命令(這只需要控制~/.ssh/authorized_keys,而不是 sshd 配置)。

如果您無法傳輸環境變數,您可以在命令行上設置它,然後執行互動式 shell,就像您一直在做的那樣。由於您正在執行一個新的 shell(這是必要的,因為您不能同時指定一個初始命令來執行並獲得一個互動式 shell),這需要是一個環境變數,而不是一個 shell 變數。

ssh -t machine@domain 'export STARTUP_OPTION="A"; exec /path/to/zsh'

另一種方法是通過標準輸入將一些數據提供給 shell,然後將標準輸入重定向到終端。

ssh -t localhost 'echo "echo foo; exec </dev/tty" | exec zsh -i'
stdin: is not a tty
stty: standard input: Inappropriate ioctl for device
~% 

儘管有關於無法初始化終端的錯誤消息,zsh 似乎可以正確處理會話的互動部分。

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