Como executar um script local com um argumento de múltiplas palavras em um servidor remoto?

Como executar um script local com um argumento de múltiplas palavras em um servidor remoto?

Estou tentando executar o script test.sh(que está na minha máquina local) em um servidor remoto. test.shaceita um argumento que geralmente contém várias palavras.

teste.sh:

#!/bin/bash
while getopts b: opt;
do
  case $opt in
    b)
       bval="$OPTARG"
       ;;
  esac
done
echo $bval

Funciona bem na minha máquina local:

./test.sh -b "multi word arg"

Saída:

multi word arg

Mas quando eu executo em um servidor remoto, assim:

ssh -A user@remotehost "bash -s" -- < ./test.sh -b "multi word arg"

Eu recebo apenas:

multi

Alguma idéia de como eu poderia passar o argumento completo com várias palavras para o script?

Responder1

Você precisa de outro nível de cotações:'"multi word arg"'

O primeiro nível de aspas é removido pelo seu shell local e sshobtém multi word arg. Então ssh, no sistema remoto, executa algo como $SHELL -c "bash -s -- -b multi word arg"(onde $SHELLestá seu shell de login, provavelmente bash, novamente). O shell de login faz a remoção de aspas (nenhuma a ser removida) e a divisão de palavras, e é por isso que você obtém uma palavra.

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:

informação relacionada