
私は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'
もちろん、スペースなしでも機能します。)
見る: