stdout
sur un serveur CentOS doit être redirigé vers stdin
sur un autre serveur CentOS. Est-ce possible?
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.
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.
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
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.
Les choses ne deviennent que légèrement plus compliquées lorsque vous avez un serveur bastion qui doit être utilisé.
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"
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.
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
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 -"