Executar script remoto com valor de parâmetro local

8

Como automatizar esta tarefa?

1) Você está em A. 2) Você 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 abri a conexão com o ssh. Então, provavelmente mais simples, entre 1) e 2), scp o script inteiro no mesmo local em B (substituindo o antigo). Mas, ainda assim, como executo o script em B? (Ou seja, como automatizar essa última etapa. Claro, eu poderia executá-la manualmente após o ssh.)

Outro pensamento, talvez descartar o ssh por completo - eu tenho uma página da Web em B, então o script poderia ser invocado de alguma forma através de uma interface da web "sob o capô"?

Ou você faria isso de uma maneira completamente diferente?

Emanuel Berg
fonte
Veja também a declaração Run if na máquina remota
Ulrich Dangel

Respostas:

11
myparameter=foobar
ssh user@server "myscript $myparameter"

Isso será executado myscript foobarno servidor.

Michael Hampton
fonte
Simples assim! Funciona bem. (Eu tive que colocar um "./" antes do nome do script, porque caso contrário ele procurou ~/.elm/aliases.)
Emanuel Berg
6
Como um pequeno aviso, o uso de aspas duplas ( ") em oposição a aspas simples ( ') é importante aqui. Usar double significa que o shell na sua máquina local expandirá a variável e, em seguida, execute o sshcomando. Se um único fosse usado, o shell local não tocaria no comando, que é enviado literalmente, mas ainda será expandido no shell remoto.
Tilo Wiklund
3
Observe que, se $myparametercontiver espaços, ele será dividido no lado do servidor. O Bash's printftem um %qformato que você pode usar. Eu tenho algum código de exemplo, mas não se encaixa aqui. Vou criar uma nova resposta para isso.
janmoesen
7

(Este é um seguimento do meu comentário sobre a resposta aceita .)

Observe que, se $myparametercontiver espaços, ele será dividido no lado do servidor. O printf do Bash tem um %qformato 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
janmoesen
fonte
1

Se é seguro assumir que $myparametervai não contêm aspas simples (caso contrário, veja aqui ou usar a printf '%q' ...solução por janmoesen), você pode simplesmente colocar aspas simples $myparameterpara evitar o problema split-on-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")"
marc
fonte