Estoy intentando ejecutar el script test.sh
(que está en mi máquina local) en un servidor remoto. test.sh
toma un argumento que a menudo tiene varias palabras.
prueba.sh:
#!/bin/bash
while getopts b: opt;
do
case $opt in
b)
bval="$OPTARG"
;;
esac
done
echo $bval
Funciona bien en mi máquina local:
./test.sh -b "multi word arg"
Producción:
multi word arg
Pero cuando lo ejecuto en un servidor remoto, así:
ssh -A user@remotehost "bash -s" -- < ./test.sh -b "multi word arg"
Solo obtengo:
multi
¿Alguna idea sobre cómo podría pasar el argumento completo de varias palabras al guión?
Respuesta1
Necesitas otro nivel de cotizaciones:'"multi word arg"'
El shell local elimina el primer nivel de comillas y ssh
obtiene multi word arg
. Luego ssh
, en el sistema remoto, ejecuta algo como $SHELL -c "bash -s -- -b multi word arg"
(dónde $SHELL
está su shell de inicio de sesión, probablemente bash, nuevamente). El shell de inicio de sesión luego elimina las comillas (no se eliminará ninguna) y divide las palabras, por lo que obtiene una palabra.
Para ilustrar:
% ssh 192.168.0.2 'printf :%s:\\n' '"foo bar baz"'
:foo bar baz:
% ssh 192.168.0.2 'printf :%s:\\n' 'foo bar baz'
:foo:
:bar:
:baz: