Exécuter un script distant avec une valeur de paramètre local

8

Comment automatiser cette tâche?

1) Vous êtes en A. 2) Vous ssh en B. 3) Vous exécutez un script en B, qui a besoin d'un paramètre connu en A.

Tout d'abord, j'ai pensé que je pourrais peut-être envoyer la valeur lorsque j'ai ouvert la connexion avec ssh. Ensuite, probablement plus simple, entre 1) et 2), scp l'ensemble du script au même endroit en B (en remplaçant l'ancien). Mais quand même, comment exécuter le script en B? (Autrement dit, comment automatiser cette dernière étape. Bien sûr, je pourrais l'exécuter manuellement après ssh.)

Une autre pensée, peut-être éliminer complètement ssh - j'ai une page Web sur B, donc le script pourrait-il être invoqué d'une manière ou d'une autre via une interface Web "sous le capot"?

Ou le feriez-vous d'une manière complètement différente?

Emanuel Berg
la source
Jetez également un œil à la déclaration Exécuter si sur une machine distante
Ulrich Dangel

Réponses:

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

Cela s'exécutera myscript foobarsur le serveur.

Michael Hampton
la source
Aussi simple que cela! Fonctionne très bien. (J'ai dû mettre un "./" avant le nom du script car sinon il cherchait ~/.elm/aliases.)
Emanuel Berg
6
Comme petit avertissement, l'utilisation de guillemets doubles ( ") par opposition à des guillemets simples ( ') est ici importante. L'utilisation de double signifie que le shell sur votre machine locale développera la variable, puis exécutera la sshcommande. Si un seul devait être utilisé, le shell local ne toucherait pas la commande, qui est envoyée textuellement mais qui est toujours développée dans le shell distant.
Tilo Wiklund
3
Notez que s'il $myparametercontient des espaces, il se divisera côté serveur. Bash printfa un %qformat que vous pouvez utiliser. J'ai un exemple de code, mais il ne convient pas ici. Je vais créer une nouvelle réponse pour cela.
janmoesen
7

(Ceci fait suite à mon commentaire sur la réponse acceptée .)

Notez que s'il $myparametercontient des espaces, il se divisera côté serveur. Le printf de Bash a un %qformat que vous pourriez utiliser. Exemple:

$ 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
la source
1

S'il est prudent de supposer que $myparameterseront pas contenir des guillemets simples (sinon voir ici ou utiliser la printf '%q' ...solution par janmoesen), vous pouvez simplement mettre des guillemets simples autour $myparameterd'éviter le problème split sur l' espace sur le côté serveur.

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
la source