Estou tentando executar o script test.sh
(que está na minha máquina local) em um servidor remoto. test.sh
aceita 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 ssh
obtém multi word arg
. Então ssh
, no sistema remoto, executa algo como $SHELL -c "bash -s -- -b multi word arg"
(onde $SHELL
está 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: