¿Cómo ejecutar un script local con un argumento de varias palabras en un servidor remoto?

¿Cómo ejecutar un script local con un argumento de varias palabras en un servidor remoto?

Estoy intentando ejecutar el script test.sh(que está en mi máquina local) en un servidor remoto. test.shtoma 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 sshobtiene multi word arg. Luego ssh, en el sistema remoto, ejecuta algo como $SHELL -c "bash -s -- -b multi word arg"(dónde $SHELLestá 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:

información relacionada