J'ai déjà un agent ssh configuré et je peux exécuter des commandes sur un serveur externe en script Bash en faisant des choses comme:
ssh blah_server "ls; pwd;"
Maintenant, ce que j'aimerais vraiment faire, c'est exécuter beaucoup de longues commandes sur un serveur externe. Mettre tout cela entre guillemets serait assez moche, et je préfère vraiment éviter de faire plusieurs fois juste pour éviter cela.
Alors, existe-t-il un moyen de le faire en une seule fois entre parenthèses ou quelque chose? Je cherche quelque chose dans le sens de:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Fondamentalement, je serai satisfait de toute solution tant qu'elle est propre.
Éditer
Pour clarifier, je parle de faire partie d'un script bash plus large. D'autres personnes pourraient avoir besoin de gérer le script sur toute la ligne, donc je voudrais le garder propre. Je ne veux pas avoir un script bash avec une seule ligne qui ressemble à ceci:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
car il est extrêmement moche et difficile à lire.
ssh
invocation?scp
,ssh
et courir. Ce sera la façon la plus propre, je pense.Réponses:
Que diriez-vous d'un document Bash Here :
Pour éviter les problèmes mentionnés par @Globalz dans les commentaires, vous pourrez peut-être (en fonction de ce que vous faites sur le site distant) éviter de remplacer la première ligne par
Notez que vous pouvez effectuer une substitution de variable dans le document Ici, mais vous devrez peut-être traiter des problèmes de citation. Par exemple, si vous citez la "chaîne limite" (c'est-à-dire
EOF
dans ce qui précède), vous ne pouvez pas faire de substitutions de variables. Mais sans citer la chaîne limite, les variables sont substituées. Par exemple, si vous avez défini$NAME
ci-dessus dans votre script shell, vous pouvez faireet cela créerait un fichier sur la destination
otherhost
avec le nom de tout ce que vous auriez attribué$NAME
. D'autres règles concernant les citations de scripts shell s'appliquent également, mais sont trop compliquées pour être abordées ici.la source
Modifiez votre script localement, puis canalisez-le dans ssh, par exemple
où
commands-to-execute-remotely.sh
ressemble à votre liste ci-dessus:la source
( echo $mycmd $myvar ; ...) | ssh myhost
-à- dire - comme pour l'utilisation de cat, vous savez exactement ce qui se passe dans le flux de commandes ssh. Et bien sûr, le sous-shell dans le script peut être multiligne pour plus de lisibilité - voir linuxjournal.com/content/bash-sub-shellscommands-to-execute-remotely.sh
?$localvar
pour interpréter une variable définie localement,\$remotevar
pour interpréter à distance une variable définie à distance,\$(something with optionnal args)
pour obtenir la sortie de quelque chose exécuté sur le serveur distant. Un exemple que vous pouvez passer de ssh à 1 (ou, comme illustré ici, plusieurs commandes ssh):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
-à- dire ?Pour correspondre à votre exemple de code, vous pouvez encapsuler vos commandes dans des qoutes simples ou doubles. Par exemple
la source
Je vois deux façons:
Vous créez d'abord une prise de contrôle comme celle-ci:
et exécutez vos commandes
De cette façon, vous pouvez écrire une commande ssh sans vous reconnecter réellement au serveur.
La seconde consisterait à générer dynamiquement le script, à le
scp
lancer et à l'exécuter.la source
Cela peut également être fait comme suit. Mettez vos commandes dans un script, appelons-le commandes-inc.sh
Sauvegardez le fichier
Maintenant, exécutez-le sur le serveur distant.
Jamais échoué pour moi.
la source
bash -s
nécessaire?#!/bin/bash
vraiment utilisé?ssh user@remote < /path/to/commands-inc.sh
(cela semble fonctionner pour moi). Eh bien, je suppose que votre version garantit que nous utilisons lebash
shell, et non un autre shell - c'est le but, n'est-ce pas?Mettez toutes les commandes dans un script et il peut être exécuté comme
la source
bash -s
?man
pagesIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
complètement la commande, c'est-à-diressh remote-user@remote-host <./remote-commands.sh
. J'ai essayé mon chemin et cela a semblé fonctionner, bien que je ne sois pas sûr qu'il soit déficient d'une manière ou d'une autre.SSH et exécutez plusieurs commandes dans Bash.
Commandes séparées avec des points-virgules dans une chaîne, passées à echo, toutes canalisées dans la commande ssh. Par exemple:
la source
Pour tous ceux qui trébuchent ici comme moi - j'ai réussi à échapper au point-virgule et à la nouvelle ligne:
Première étape: le point-virgule. De cette façon, nous ne cassons pas la commande ssh:
Répertorie le répertoire hôtes / home distant (connecté en tant que root), tandis que
répertorié le répertoire de travail actuel.
Étape suivante: rompre la ligne:
Cela a de nouveau répertorié le répertoire de travail distant - formatage amélioré:
Si c'est plus joli qu'ici, documentez ou citez autour de lignes brisées - enfin, pas moi de décider ...
(En utilisant bash, Ubuntu 14.04 LTS.)
la source
ssh host "echo test && ls"
Les réponses publiées utilisant des chaînes multilignes et plusieurs scripts bash ne fonctionnaient pas pour moi.
Voici un moyen fonctionnel de ssh et d'exécuter plusieurs commandes tout en conservant le contexte local.
la source
Je ne sais pas si le plus propre pour les commandes longues mais certainement le plus simple:
la source
Cela fonctionne bien pour créer des scripts, car vous n'avez pas besoin d'inclure d'autres fichiers:
la source
-s
flag, je le cite, vous pourrez peut-être vous en sortir en remplaçant la première ligne par ... , et je n'ai pas pu m'en tirer en appelant simplement bash, je m'en souviens vaguement.La façon la plus simple de configurer votre système pour utiliser des sessions ssh uniques par défaut avec le multiplexage.
Cela peut être fait en créant un dossier pour les sockets:
Et puis en ajoutant ce qui suit à votre configuration .ssh:
Maintenant, vous n'avez plus besoin de modifier aucun de vos codes. Cela permet plusieurs appels à ssh et scp sans créer plusieurs sessions, ce qui est utile lorsqu'il doit y avoir plus d'interaction entre vos machines locales et distantes.
Merci à la réponse de @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ et https://en.wikibooks.org / wiki / OpenSSH / Cookbook / Multiplexing .
la source