1315 votes

comment utiliser ssh pour exécuter le shell script sur une machine distante ?

Pourriez-vous me suggérer comment exécuter un shell script sur une machine distante ?

J'ai configuré ssh sur les deux machines A et B. Mon script est sur la machine A qui va exécuter une tâche sur la machine B.

1280voto

Jason R. Coombs Points 11130

Si la machine A est une machine Windows, vous pouvez utiliser Plink (qui fait partie de l'application PuTTY ) avec le paramètre -m, et il exécutera le script local sur le serveur distant.

plink root@MachineB -m local_script.sh

Si la machine A est un système basé sur Unix, vous pouvez utiliser :

ssh root@MachineB 'bash -s' < local_script.sh

Vous ne devriez pas avoir à copier le script sur le serveur distant pour l'exécuter.

697voto

Yarek T Points 3105

C'est une vieille question, et la réponse de Jason fonctionne bien, mais je voudrais ajouter ceci :

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

Ceci peut également être utilisé avec su et les commandes qui nécessitent une entrée de l'utilisateur. (notez le ' échappé de l'heredoc)

Edit : Puisque cette réponse continue à recevoir du trafic, je voudrais ajouter encore plus d'informations à cette merveilleuse utilisation de heredoc :

Vous pouvez imbriquer des commandes avec cette syntaxe, et c'est la seule façon dont l'imbrication semble fonctionner (d'une manière saine).

ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH

Vous pouvez réellement avoir une conversation avec certains services comme telnet, ftp, etc. Mais rappelez-vous que heredoc envoie juste le stdin comme texte, il n'attend pas de réponse entre les lignes.

259voto

dogbane Points 85749

N'oubliez pas non plus d'échapper les variables si vous voulez les récupérer dans l'hôte de destination.

Cela m'a déjà surpris dans le passé.

Par exemple :

user@host> ssh user2@host2 "echo \$HOME"

imprime /home/user2

tandis que

user@host> ssh user2@host2 "echo $HOME"

imprime /home/user

Un autre exemple :

user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"

imprime correctement "hello".

164voto

chubbsondubs Points 16075

Il s'agit d'une extension de la réponse de YarekT pour combiner les commandes distantes en ligne avec le passage de variables ENV de la machine locale à l'hôte distant afin que vous puissiez paramétrer vos scripts du côté distant :

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
  # commands to run on remote host
  echo $ARG1 $ARG2
ENDSSH

J'ai trouvé cela exceptionnellement utile en gardant tout dans un seul script donc c'est très lisible et maintenable.

Pourquoi cela fonctionne. ssh supporte la syntaxe suivante :

ssh user@host remote_command

En bash, nous pouvons spécifier des variables d'environnement à définir avant l'exécution d'une commande sur une seule ligne, comme suit :

ENV_VAR_1='value1' ENV_VAR_2='value2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'

Cela permet de définir facilement des variables avant d'exécuter une commande. Dans ce cas, echo est la commande que nous exécutons. Tout ce qui précède echo définit les variables d'environnement.

Nous combinons donc ces deux caractéristiques et la réponse de YarekT pour obtenir :

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'...

Dans ce cas, nous définissons ARG1 et ARG2 comme des valeurs locales. Nous envoyons tout après user@host en tant que remote_command. Lorsque la machine distante exécute la commande, ARG1 et ARG2 prennent les valeurs locales, grâce à l'évaluation de la ligne de commande locale, qui définit les variables d'environnement sur le serveur distant, puis exécute la commande bash -s en utilisant ces variables. Viola.

112voto

Vinko Vrsalovic Points 116138
<hostA_shell_prompt>$ ssh user@hostB "ls -la"

Cela vous demandera un mot de passe, à moins que vous n'ayez copié la clé publique de votre utilisateur hostA dans le fichier authorized_keys du répertoire home de l'utilisateur .ssh. Cela permettra une authentification sans mot de passe (si elle est acceptée comme méthode d'authentification dans la configuration du serveur ssh).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X