ssh schlägt nur fehl, wenn mehrere Argumente in einer Zeichenfolge gespeichert sind

ssh schlägt nur fehl, wenn mehrere Argumente in einer Zeichenfolge gespeichert sind

Ich schreibe ein Bash-Skript auf Raspberry Pi OS (basierend auf Debian 12 Bookworm). Das Skript versucht so etwas zu tun wie

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

Soweit ich gelesen habe, ist dies eine gängige Vorgehensweise. Ich habe jedoch festgestellt, dass when $argsmehr als ein Argument enthält, wie z. B.

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

und dann ausführen

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

ssh gibt Folgendes mit dem Exit-Status zurück 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 ...]]

Die Ausführung des gleichen Befehls mit nur dem Inhalt von $argsanstelle von ist jedoch $argserfolgreich und wird mit dem folgenden Status beendet 0:

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

Um es noch einmal zu sagen: Die Verwendung $argsfunktioniert perfekt, wenn nur ein einziges Argument vorhanden ist, wie etwa

-o StrictHostKeyChecking=yes

Was ist hier los? Was kann ich tun, um dies zu verhindern? Es scheint, unknown option --als ob etwas analysiert $argsund einige Dinge daraus entfernt, da dies nur dann bemängelt wird, wenn zwei oder mehr Argumente vorhanden sind (zwei Vorkommen von -in $args)?

Antwort1

(Ich sollte dies wahrscheinlich einfach als Duplikat schließen, aber versuchen wir trotzdem, den speziellen Fall zu erklären.)

Die zitierte Erweiterung "$args"ergibteinsArgument, Sie führen also tatsächlich aus ssh "-v -i /path/to/keyfile -o StrictHostKeyChecking=yes" .... Die Leerzeichen und Bindestriche dort werden als Optionszeichen verwendet, ähnlich wie gestapelte Optionen in den nützlicheren Fällen wie funktionieren -abc. Der Bindestrich ist keine gültige Option, Sie erhalten also eine Beschwerde.

Wenn ssh "$args"es mit zu funktionieren scheint args='-o StrictHostKeyChecking=yes', liegt das wahrscheinlich daran, dass der Parser für -oLeerzeichen ignoriert (ähnlich wie Leerzeichen in ssh_configignoriert werden). Versuchen Sie dasselbe mit args='-i /path/to/keyfile'und Sie werden wahrscheinlich die Fehlermeldung „Datei nicht gefunden“ erhalten, da Sie gerade ein führendes Leerzeichen in den Dateinamen eingefügt haben. ( args='-i/path/to/keyfile'ohne das Leerzeichen würde es natürlich funktionieren.)

Sehen:

verwandte Informationen