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'
以下ssh -i special_key_file user@server foo bar
のような結果が得られます。
<foo>
<bar>
分裂のためだ。それが十分に悪くない場合は、ssh -i special_key_file user@server '*'
ファイルのリストを取得したからです。
<file1>
<file2>
…
したがって、追加のコマンドライン全体が内部に挿入され、すべてのcommand=
分割およびグローバルステップが発生しながらシェルで実行されます。明らかに"
そのセクション内では使用できないので、これを防ぐために二重引用符の中に二重引用符を入れることはcommand="…"
できません。$SSH_ORIGINAL_COMMAND
他の解決策がありますか?
ところで、この説明のようにRFE導入拒否 $SSH_ESCAPED_ORIGINAL_COMMAND
ssh
すべての追加のコマンドラインが文字列として送信されるため、プロトコルが原因です。それにもかかわらず、これはサーバーサイドシェルがすべての分割を実行する理由はありません。特にグローバル拡張も行う場合(ここでは役に立つとは思えません)。 RFEを導入した人とは異なり、私はユースケースの分割に興味がなく、グローバル拡張を望んでいません。
OpenSSHがこのタスクに使用するシェル環境の変更に関連する可能な解決策はありますか?
ベストアンサー1
引用符を使用する:
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>
これがあなたにとって問題であるかどうかはわかりません。
私は混乱しています:
明らかに、コマンドに「=」...」を使用できません
これがあなたの仕事の限界だと思って答えを削除しました。
私の答えがあなたの使命に役立つことを嬉しく思います!