ssh falla solo cuando se almacenan múltiples argumentos en una cadena

ssh falla solo cuando se almacenan múltiples argumentos en una cadena

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 $argscontiene 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 $argsen lugar de usarlo $argstiene é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 $argsfunciona 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 $argsy 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 -oignora los espacios en blanco (de manera similar a como ssh_configse 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:

información relacionada