web-dev-qa-db-fra.com

Puis-je diriger stdout sur un serveur vers stdin sur un autre serveur?

stdout sur un serveur CentOS doit être redirigé vers stdin sur un autre serveur CentOS. Est-ce possible?

Mise à jour

ScottPack, MikeyB et jofel ont tous des réponses valides. J'ai attribué la réponse à Scott parce que, même si ma question ne spécifiait pas la sécurité comme une exigence, il est toujours agréable d'être en sécurité. Cependant, les suggestions des deux autres boursiers fonctionneront également.

78
Wesley

C'est un oui sans vergogne.

Quand on utilise ssh pour exécuter une commande sur un serveur distant, il effectue une sorte de redirection interne sophistiquée des entrées/sorties. En fait, je trouve que c'est l'une des fonctionnalités subtilement plus agréables d'OpenSSH. Plus précisément, si vous utilisez ssh pour exécuter une commande arbitraire sur un système distant, alors ssh mappera STDIN et STDOUT à celle de la commande en cours d'exécution.

Pour les besoins d'un exemple, supposons que vous souhaitiez créer une archive tar de sauvegarde, mais que vous ne vouliez pas ou ne puissiez pas la stocker localement. Jetons un coup d'œil à cette syntaxe:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

Nous créons une archive tar et l'écrivons dans STDOUT, des trucs normaux. Puisque nous utilisons ssh pour exécuter une commande à distance, STDIN est mappé sur le STDIN de cat. Que nous redirigeons ensuite vers un fichier.

99
Scott Pack

Un moyen pratique de canaliser les données entre les hôtes lorsque vous n'avez pas à vous soucier de la sécurité sur le câble utilise netcat aux deux extrémités de la connexion.

Cela vous permet également de les configurer de manière asynchrone:

Sur le "récepteur" (vraiment, vous aurez une communication bidirectionnelle, mais c'est plus facile de penser comme ça), exécutez:

nc -l -p 5000 > /path/to/backupfile.tar

Et sur "l'expéditeur", lancez:

tar cf - /path/to/dir | nc 1.2.3.4 5000
29
MikeyB

Un outil très puissant pour créer des connexions uni- et bidirectionnelles est socat . Pour un bref aperçu des possibilités, regardez les exemples dans son page de manuel .

Il remplace netcat et les outils similaires et prend en charge les connexions chiffrées SSL. Pour les débutants, ce n'est peut-être pas assez simple, mais il est au moins bon de savoir qu'il existe.

21
jofel

TL; DR

Les choses ne deviennent que légèrement plus compliquées lorsque vous avez un serveur bastion qui doit être utilisé.

  1. Vous pouvez passer ssh comme commande à ssh comme ceci:

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. Méfiez-vous des pseudo-terminaux


Notez que le point clé ici est que ssh, comme la plupart des outils, traite simplement stdout et stdin correctement par défaut.

Cependant, lorsque vous commencez à voir une option comme Disable pseudo-terminal allocation. et Force pseudo-terminal allocation. vous devrez peut-être faire quelques essais et erreurs. Mais, en tant que règle générale , vous ne voulez pas modifier le comportement de tty, sauf si vous essayez de corriger les fichiers indésirables/binaires émulateur de terminal (ce qu'un humain tape).

Par exemple, j'ai tendance à utiliser -At pour que l'agent ssh de mon poste de travail soit transféré, et pour que l'exécution de tmux à distance n'écarte pas le binaire (comme si ssh -At bastion.internal tmux -L bruno attach). Et, pour docker aussi (comme ça Sudo docker exec -it jenkins bash).

Cependant, ces deux -t les indicateurs provoquent des problèmes de traçage des données lorsque j'essaie de faire quelque chose comme ceci:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
Sudo tar cf - -C /etc init | \
Sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.
5
Bruno Bronosky

Essayez de mettre votre clé publique ssh dans un autre hôte juste par une commande

ssh [email protected] 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub
2
pylover

Je trouve que c'est le plus simple, après avoir mis en place aucune négociation de mot de passe entre les serveurs pour l'utilisateur, vous exécutez la commande en tant que:

Non compressé

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

Compression à la volée

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"
2
user60802