OpenSSH:防止在 SSH_ORIGINAL_COMMAND 上進行通配
我有以下設置,我使用 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_COMMAND
ssh
協議是責任方,因為所有額外的命令行都作為一個字元串傳輸。仍然沒有理由讓伺服器端的外殼進行所有拆分,特別是如果它還進行全域擴展(我懷疑這在這裡有用)。與介紹 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="…" 中使用 "
我認為這是對您任務的限制,因此刪除了我的答案。
很高興我的回答對您的任務有所幫助!