私は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
ここで何が起こっているのでしょうか?これが起こらないようにするにはどうすればよいですか? 2つ以上の引数(inが2回発生)がある場合にのみこれについて文句を言うので、何かが解析して何かを削除するようunknown option --
です。$args
-
$args
答え1
(重複して仕上げる必要があるようですが、とにかく具体的な状況を説明してみましょう。)
参照拡張は以下を"$args"
生成します。一つパラメータがあるため実際に実行中ですssh "-v -i /path/to/keyfile -o StrictHostKeyChecking=yes" ...
。スペースとダッシュは、より便利な場合にスタックオプションがどのように機能するかと同様に、オプション文字として扱われます。たとえば、ダッシュ-abc
は有効なオプションではないため、苦情が発生します。
ssh "$args"
これがうまくいくとしたら、args='-o StrictHostKeyChecking=yes'
おそらくforのパーサーが-o
空白を無視するためです(inの空白を無視する方法と似ていますssh_config
)。同じ方法で試してみてくださいargs='-i /path/to/keyfile'
。ファイル名に先頭のスペースが含まれているため、ファイルが見つからないというエラーが発生する可能性があります。 (args='-i/path/to/keyfile'
もちろん席はありません。)
望むより: