Copier sur ssh et exécuter des commands dans une session

Duplicata possible:
Utiliser un canal SSH déjà établi

Voici mon script de synchronisation:

ssh [email protected] /etc/init.d/some_service stop scp [email protected]:/var/some_service/events ./events scp ./new_data [email protected]:/var/some_service/new_data ssh [email protected] /etc/init.d/some_service start 

Comme vous pouvez le voir, il arrête le service, effectue certaines copys avec scp et redémarre le service.

Le problème: il "coûte" 4 "similaires" connections ssh dans une rangée.

Y at-il un moyen de faire tout le travail, en utilisant une connection physique ssh?

Vous pouvez envisager d'utiliser le partage de connection ssh:

 Host *.some-domain ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p 

Vous vous connectez une seule fois à votre destination et mettez le process ssh en arrière-plan. Ensuite, vous exécutez les autres commands et vous tuez finalement le premier process.

En variante, vous pouvez essayer d'encapsuler un set d'actions dans une seule connection ssh.

Par exemple, imaginez que vous avez un directory:

  mycommands | +- run +- new_data 

Ensuite, vous pouvez empackageer ces données dans un file tar et les envoyer à votre script:

 tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run' 

Maintenant, vous run script peut accéder à toutes vos données d'input (ici nous avons seulement les new_data comme dans votre exemple). Pour restr avec votre exemple, voici le script d' run :

 #!/bin/sh BASE=`dirname $0` /etc/init.d/some_service stop cat /var/some_service/events mv $BASE/new_data /var/some_service/new_data /etc/init.d/some_service start rm -rf $BASE 

Donc, maintenant il vous suffit de sauvegarder le file d' events :

 tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run' >./events 

et plus généralement, vous pouvez faire en sorte que votre script d' run produise un file tar et ensuite ssh dans tar pour le décompresser localement.

Vous pouvez déplacer cette logique vers un script qui s'exécute sur le server de destination, puis l'exécuter avec une seule command SSH. Vraisemblablement ce n'est pas idéal cependant, sinon vous l'auriez déjà fait 🙂

Vous pouvez réduire le coût d'ouverture d'une nouvelle connection SSH à l'aide d'une connection maître SSH. Cela signifie que votre première command SSH ouvrira une nouvelle connection, comme d'habitude. Les connections suivantes au même server réutiliseront cette connection existante, vous économisant ainsi la surcharge de création de trois connections supplémentaires.

Il y a un bon guide pour configurer ceci ici: http://www.linuxjournal.com/content/speed-multiple-ssh-connections-same-server

cela suppose que le server local fait confiance au server distant pour qu'il exécute la command sans mot de passe, sinon il ne fonctionnera pas car vous exécutez une connection sans connection, sans aucun moyen de fournir une input

ssh remoteserver "/etc/init.d/some_service stop; scp /var/some_service/events localhost:${PWD}/events; scp localserver:${PWD}/new_data /var/some_service/new_data; /etc/init.d/some_service start"

tout le code ci-dessus doit être sur une ligne contiguë sur votre terminal, ou si vous l'exécutez à l'intérieur d'un script, cela devrait être une command, pas séparée par des fils de ligne.

si vous avez une paire de keys de confiance du server distant vers le server local, je ne vois aucune raison pour laquelle cela ne fonctionne pas.