
Como posso automatizar esta tarefa?
1) Você está em A. 2) Você faz ssh em B. 3) Você executa um script em B, que precisa de um parâmetro conhecido em A.
Primeiro, pensei que talvez pudesse enviar o valor quando abrisse a conexão com ssh. Então, provavelmente mais simples, entre 1) e 2), coloque todo o script no mesmo local em B (substituindo o antigo). Mas ainda assim, como faço paraexecutaro roteiro em B? (Ou seja, como automatizar a última etapa. Claro, eu poderia executá-lo manualmente após o ssh.)
Outro pensamento, talvez descartar completamente o ssh - eu tenho uma página da web em B, então o script poderia de alguma forma ser invocado através de uma interface da web "sob o capô"?
Ou você faria isso de uma maneira totalmente diferente?
Responder1
myparameter=foobar
ssh user@server "myscript $myparameter"
Isso será executado myscript foobar
no servidor.
Responder2
(Este é um acompanhamento parameu comentário sobre a resposta aceita.)
Observe que se $myparameter
contiver espaços, será dividido no lado do servidor. O printf do Bash tem um %q
formato que você pode usar. Exemplo:
$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory
$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile
Responder3
Se for seguro assumir que $myparameter
issonãoconter aspas simples (caso contrário, consulteaquiou use a printf '%q' ...
solução de janmoesen), você pode simplesmente colocar aspas simples $myparameter
para evitar o problema de divisão no espaço no lado do servidor.
myparameter="foo \" bar"
#myparameter="foo \" ' bar"
ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"
Responder4
Hesito em responder a uma pergunta de 10 anos, especialmente quando já existe uma resposta perfeitamente boa, mas observe que o script 'remoto' na verdade não funciona.precisarestar em B. Isso (a) torna a substituição de parâmetros trivial e (b) elimina a complicação de saber se é uma boa ideia ter o script no sistema remoto (problemas de segurança/qualquer coisa).
A alternativa é apenas executar o ssh comaqui doutorentrada. Neste caso, a substituição do parâmetro é feitalocalmente, e não no sistema remoto (desde que você não cite o delimitador doc, neste caso EOF
):
portnum=1234
[email protected]
mydir=/var/www/bar
param=foo
ssh -p$portnum $target /bin/bash <<EOF
set -e;
cd $mydir;
# create remote 3-character file '/var/www/bar/myfile' containing 'foo'
echo -n $param > myfile
EOF