ssh は、文字列に複数の引数が格納されている場合にのみ失敗します。

ssh は、文字列に複数の引数が格納されている場合にのみ失敗します。

私はRaspberry Pi OS(Debian 12 Bookwormベース)でbashスクリプトを書いています。スクリプトは次のようなことをしようとしています。

ssh "$args" "$user"@"$ip" 'command'

私が読んだところによると、これは標準的なやり方です。しかし、$args次のように複数の引数が含まれる場合は、

-v -i /path/to/keyfile -o StrictHostKeyChecking=yes

そして実行する

ssh "$args" "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'

ssh は終了ステータスとともに次の結果を返します255:

unknown option --
 usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] 
            [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
            [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
            [-i identity_file] [-J [user@]host[:port]] [-L address]
            [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
            [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
            [-w local_tun[:remote_tun]] destination [command [argument ...]]

$argsただし、を使用する代わりに の内容だけを使用して同じコマンドを実行すると、$args成功し、 のステータスで終了します0

ssh -v -i /path/to/keyfile -o StrictHostKeyChecking=yes "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'

言い換えると、$args引数が1つだけの場合には、次のように使用してもまったく問題ありません。

-o StrictHostKeyChecking=yes

ここで何が起こっているのでしょうか? これを防ぐにはどうすればよいのでしょうか? から見るとunknown option --、何かが解析していくつかのものを取り除いているように見えますが$args、これは 2 つ以上の引数があるとき ( の 2 つの発生-)$argsにのみこれについて文句を言うためです。

答え1

(おそらく重複として閉じるべきでしょうが、とにかく特定のケースを説明してみることにします。)

引用した展開"$args"1つ引数なので、実際には を実行していることになりますssh "-v -i /path/to/keyfile -o StrictHostKeyChecking=yes" ...。スペースとダッシュは、 のようなより有用なケースでスタックされたオプションが機能するのと同様に、オプション文字として扱われます-abc。ダッシュは有効なオプションではないので、エラーが発生します。

ssh "$args"が で機能しているように見える場合args='-o StrictHostKeyChecking=yes'、それはおそらく のパーサーが-o空白を無視するためです ( の空白がssh_config無視されるのと同様に)。 で同じことを試すargs='-i /path/to/keyfile'と、ファイル名の先頭にスペースが含まれているため、ファイルが見つからないというエラーが発生する可能性があります。 (args='-i/path/to/keyfile'もちろん、スペースなしでも機能します。)

見る:

関連情報