
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 $args
mehr 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 $args
anstelle von ist jedoch $args
erfolgreich 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 $args
funktioniert 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 $args
und 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 -o
Leerzeichen ignoriert (ähnlich wie Leerzeichen in ssh_config
ignoriert 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: