文字列に複数のパラメータが格納されている場合にのみ、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

ここで何が起こっているのでしょうか?これが起こらないようにするにはどうすればよいですか? 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'もちろん席はありません。)

望むより:

関連情報