Esegue lo script remoto con il valore del parametro locale


8

Come posso automatizzare questo compito?

1) Sei in A. 2) Sei in B. 3) Esegui uno script in B, che necessita di un parametro noto in A.

Innanzitutto, ho pensato che forse avrei potuto inviare il valore quando ho aperto la connessione con ssh. Quindi, probabilmente più semplice, tra 1) e 2), scp l'intero script nella stessa posizione in B (sostituendo quello vecchio). Ma comunque, come posso eseguire lo script in B? (Cioè, come automatizzare l'ultimo passaggio. Certo, potrei eseguirlo manualmente dopo ssh.)

Un altro pensiero, forse scartando del tutto ssh: ho una pagina web su B, quindi la sceneggiatura potrebbe in qualche modo essere invocata attraverso un'interfaccia web "nascosta"?

O lo faresti in un modo completamente diverso?


Risposte:


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

Questo verrà eseguito myscript foobarsul server.


Semplice come quella! Funziona alla grande. (Ho dovuto mettere un "./" prima del nome della sceneggiatura perché altrimenti cercava ~/.elm/aliases.)
Emanuel Berg,

6
Come piccolo avvertimento, qui è importante l'uso di virgolette doppie ( ") anziché singole ( '). L'uso di double significa che la shell sul tuo computer locale espanderà la variabile, quindi eseguirà il sshcomando. Se si dovessero usare quelli singoli, la shell locale non toccherebbe il comando, che viene inviato alla lettera ma che verrà comunque espanso nella shell remota.
Tilo Wiklund,

3
Si noti che se $myparametercontiene spazi, verrà suddiviso sul lato server. Bash's printfha un %qformato che puoi usare. Ho qualche codice di esempio, ma non si adatta qui. Creerò una nuova risposta per questo.
Janmoesen,

7

(Questo è un seguito al mio commento sulla risposta accettata .)

Si noti che se $myparametercontiene spazi, verrà suddiviso sul lato server. Bash's printf ha un %qformato che puoi usare. Esempio:

$ 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

1

Se è lecito ritenere che $myparametersi non contengono virgolette singole (in caso contrario vedi qui o utilizzare la printf '%q' ...soluzione janmoesen), si può semplicemente mettere le virgolette singole intorno $myparameterper evitare il problema split-on-spazio sul lato server.

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")"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.