
Estoy escribiendo un script bash en el sistema operativo Raspberry Pi (basado en Debian 12 Bookworm). El guión intenta hacer algo como
ssh "$args" "$user"@"$ip" 'command'
Por lo que he leído, esta es una práctica estándar. Sin embargo, he descubierto que cuando $args
contiene más de un argumento, como
-v -i /path/to/keyfile -o StrictHostKeyChecking=yes
y luego ejecutando
ssh "$args" "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'
ssh devuelve lo siguiente con un estado de salida de 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 ...]]
Sin embargo, ejecutar el mismo comando usando solo el contenido de $args
en lugar de usarlo $args
tiene éxito y sale con un estado de 0
:
ssh -v -i /path/to/keyfile -o StrictHostKeyChecking=yes "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'
Para repetirlo, el uso $args
funciona perfectamente cuando solo hay un argumento, como por ejemplo
-o StrictHostKeyChecking=yes
¿Que esta pasando aqui? ¿Qué puedo hacer para evitar esto? Desde el punto unknown option --
de vista, ¿parecería que algo está analizando $args
y eliminando algunas cosas, porque solo se queja de esto cuando hay dos o más argumentos (dos incidencias de -
in $args
)?
Respuesta1
(Probablemente debería cerrar esto como un duplicado, pero intentemos explicar el caso particular de todos modos).
La expansión citada "$args"
produceunoargumento, por lo que en efecto estás ejecutando ssh "-v -i /path/to/keyfile -o StrictHostKeyChecking=yes" ...
. Los espacios y guiones allí se toman como caracteres de opción, de manera similar a cómo funcionan las opciones apiladas en los casos más útiles como -abc
. El guión no es una opción válida, por lo que recibe una queja.
Si ssh "$args"
parece funcionar con args='-o StrictHostKeyChecking=yes'
, probablemente se deba a que el analizador -o
ignora los espacios en blanco (de manera similar a como ssh_config
se ignoran los espacios en blanco). Intente lo mismo con args='-i /path/to/keyfile'
y probablemente obtendrá un error de archivo no encontrado, ya que acaba de incluir un espacio inicial en el nombre del archivo. ( args='-i/path/to/keyfile'
sin el espacio funcionaría, por supuesto).
Ver: