Quoting

OpenSSH:防止在 SSH_ORIGINAL_COMMAND 上進行通配

  • April 23, 2019

我有以下設置,我使用 OpenSSH 伺服器遠端啟動某個命令,使用ssh.

我的authorized_keys文件有以下條目:

command="/path/to/script.sh $SSH_ORIGINAL_COMMAND",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa AAAA…qGDf my_special_key

這意味著如果有人使用該密鑰(例如通過使用ssh -i special_key_file user@server)連接,則腳本script.sh將在我的伺服器上執行。現在還有一個$SSH_ORIGINAL_COMMAND佔位符,它被命令的所有額外命令行所取代ssh,即ssh -i special_key_file user@server foobar表示$1將包含foobar在其中。

為了測試它,我可以讓我script.sh看起來如下:

#!/bin/sh
printf '<%s>\n' "$@"

現在ssh -i special_key_file user@server 'foo bar'就像 forssh -i special_key_file user@server foo bar我將得到以下相同的結果:

<foo>
<bar>

因為分裂。如果這還不夠糟糕,ssh -i special_key_file user@server '*'我會得到一個文件列表:

<file1>
<file2>
…

因此,顯然整個額外的命令行被插入到裡面command=的內容中,然後在 shell 中執行,所有的拆分和全域步驟都發生了。顯然我不能"command="…"零件內部使用,所以我不能放在$SSH_ORIGINAL_COMMAND雙引號內以防止這種情況發生。我還有其他解決方案嗎?

順便說一句,正如在這個被解僱的 RFE 中解釋的那樣,引入 $SSH_ESCAPED_ORIGINAL_COMMANDssh協議是責任方,因為所有額外的命令行都作為一個字元串傳輸。仍然沒有理由讓伺服器端的外殼進行所有拆分,特別是如果它還進行全域擴展(我懷疑這在這裡有用)。與介紹 RFE 的人不同,我不關心為我的案例拆分,我只希望不進行全域擴展。

可能的解決方案與更改 OpenSSH 用於此任務的 shell 環境有關嗎?

使用引號:

cat bin/script.sh
#!/bin/sh
printf '<%s>\n' "$@"

command="/home/user/bin/script.sh \"${SSH_ORIGINAL_COMMAND}\"" ssh-rsa AA...

ssh -i .ssh/id_rsa.special hamilton '*'
<*>
ssh -i .ssh/id_rsa.special hamilton 'foo bar'
<foo bar>

但你也會得到:

ssh -i .ssh/id_rsa.special hamilton '*' 'foo bar'
<* foo bar>

不確定這對您是否有問題。

我很困惑:

顯然我不能在 command="…" 中使用 "

我認為這是對您任務的限制,因此刪除了我的答案。

很高興我的回答對您的任務有所幫助!

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