Question Comment utiliser SSH pour exécuter un script shell sur une machine distante?


Je dois exécuter un script shell (windows / Linux) sur une machine distante.

J'ai SSH configuré sur les deux machines A et B. Mon script est sur la machine A qui va exécuter une partie de mon code sur une machine distante, la machine B.

Les ordinateurs locaux et distants peuvent être Windows ou Unix.

Est-il possible de faire cela en utilisant plink / ssh?


1010
2017-11-20 11:44


origine


Réponses:


Si la machine A est une boîte Windows, vous pouvez utiliser Plink (partie de Mastic) 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.


1025
2018-04-28 20:41



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

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

Edit: Puisque cette réponse continue d'obtenir des bits de trafic, j'ajouterais 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

Edit: Je viens de découvrir que vous pouvez indenter l'intérieur si vous utilisez <<-END !

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

(Je pense que cela devrait fonctionner)

Regarde aussi http://tldp.org/LDP/abs/html/here-docs.html


506
2017-10-06 13:11



Aussi, n'oubliez pas d'échapper des variables si vous voulez les récupérer de l'hôte de destination.

Cela m'a attrapé 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 / utilisateur

Un autre exemple:

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

imprime "bonjour" correctement.


212
2017-11-20 12:25



Ceci est une extension de la réponse de YarekT pour combiner des commandes distantes en ligne avec le passage des 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 le tout dans un script, donc c'est très lisible et maintenable.

Pourquoi cela fonctionne ssh prend en charge la syntaxe suivante:

ssh utilisateur @ hôte remote_command

Dans bash, nous pouvons spécifier des variables d'environnement à définir avant d'exécuter une commande sur une seule ligne comme ceci:

ENV_VAR_1 = 'valeur1' ENV_VAR_2 = 'valeur2' bash -c 'echo $ ENV_VAR_1 $ ENV_VAR_2'

Cela facilite la définition des variables avant d'exécuter une commande. Dans ce cas, echo est notre 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 utilisateur @ hôte ARG1 = $ ARG1 ARG2 = $ ARG2 'bash -s' << 'ENDSSH' ...

Dans ce cas, nous définissons ARG1 et ARG2 sur des valeurs locales. Envoyer tout après user @ host en tant que remote_command. Lorsque la machine distante exécute la commande ARG1 et ARG2 sont définies les valeurs locales, grâce à l'évaluation en 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. Voila.


124
2017-09-09 15:00



<hostA_shell_prompt>$ ssh user@hostB "ls -la"

Cela vous demandera le mot de passe, sauf si vous avez copié la clé publique de votre utilisateur hostA dans le fichier authorized_keys du répertoire home of user .ssh. Cela permettra une authentification sans mot de passe (si elle est acceptée comme méthode d'authentification sur la configuration du serveur ssh)


89
2017-11-20 11:53



J'ai commencé à utiliser en tissu pour des opérations plus sophistiquées. Fabric nécessite Python et quelques autres dépendances, mais uniquement sur l'ordinateur client. Le serveur doit seulement être un serveur ssh. Je trouve cet outil beaucoup plus puissant que les scripts shell passés à SSH, et ça vaut vraiment la peine de se mettre en place (surtout si vous aimez programmer en Python). Fabric gère des scripts sur plusieurs hôtes (ou hôtes de certains rôles), facilite les opérations idempotentes (comme ajouter une ligne à un script de configuration, mais pas s'il est déjà présent) et permet la construction de logiques plus complexes (comme le Python). la langue peut fournir).


24
2018-01-26 16:17



En supposant que vous voulez dire que vous voulez faire cela automatiquement à partir d'une machine "locale", sans vous connecter manuellement à la machine "distante", vous devriez regarder dans une extension TCL appelée Expect, elle est conçue précisément pour ce genre de situation. C'est la page d'accueil ci-dessous semble un peu merdique mais ne laissez pas cela vous dissuader; J'ai également fourni un lien vers un script pour se connecter / interagir via SSH.

http://expect.nist.gov/

http://bash.cyberciti.biz/security/expect-ssh-login-script/


8
2017-11-20 12:10



Essayez de courir ssh user@remote sh ./script.unx.


7
2017-12-18 21:16