Dois-je transférer un serveur intermédiaire sur un serveur intermédiaire?


11

Je ne peux pas sftp directement dans un hôte particulier. Pour déplacer un fichier de ma machine domestique vers l'hôte, je dois transférer un fichier vers un hôte intermédiaire; ssh dans l'hôte intermédiaire; et sftp le fichier vers la destination finale. Est-il possible d'éviter une telle folie?

Réponses:


28

Depuis votre machine locale, vous pouvez créer un tunnel SSH via l'hôte intermédiaire jusqu'à l'hôte final:

ssh user@intermediate -L 2000:final:22 -N

Cela ouvrira le port 2000 sur votre hôte local qui se connectera directement au serveur final sur le port 22, par tunneling via l'hôte intermédiaire. Maintenant, dans une autre invite, connectez-vous avec sftp sur le port 2000 pour passer par le tunnel vers le serveur final, notant que l'utilisateur spécifié ici est pour l'hôte final:

sftp -P 2000 user@localhost

On dirait que cela appartient à superuser.com ou serverfault.com .


Merci, je vais essayer ça; et vous avez raison, c'est le mauvais forum; Pardon.

Après avoir donné le mot de passe user @ localhost, j'ai reçu le message: Message reçu trop long 1131376238
user74094

14

Vous pouvez utiliser l'option ProxyCommand de SFTP pour tunneler de manière transparente une connexion SFTP sur une connexion SSH (un peu similaire à la réponse de WhiteFang34, mais sur stdin & stdout de la connexion SSH, plutôt qu'un port TCP local transféré):

sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost

(Cela suppose que l'hôte intermédiaire a installé netcat en tant que / usr / bin / nc - sinon, vous devrez peut-être trouver / installer un moyen équivalent de passer stdin et stdout dans une session TCP.)

Ce qui est vraiment cool avec cette option, c'est que vous pouvez l'ajouter à votre fichier ~ / .ssh / config, ce qui la rend transparente:

Host finalhost
    ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null

Avec cette entrée, vous pouvez utiliser sftp, scp et ssh pour finalhost, et il invoquera automatiquement le tunnel. La seule partie non transparente est qu'il vous demandera deux mots de passe (hôte intermédiaire suivi de l'hôte final), mais si vous le souhaitez, vous pouvez également l'éliminer avec les paires de clés SSH ...


Merci Gordon. Il faut les deux mots de passe puis s'arrête avec le message: Message reçu trop long 1131376238
user74094

Cela ressemble à quelque chose dans la connexion - peut-être un script de connexion sur l'un des hôtes, peut-être nc - écrit du texte supplémentaire sur la connexion qui prête à confusion sftp (voir cette FAQ sur snailbook.com ). 1131376238 est le codage décimal des caractères ascii "Conn", il s'agit donc probablement d'un message comme "Connexion à ..." "Connecté depuis ..." ou peut-être "Échec de la connexion". Essayez-le avec ssh au lieu de sftp, voyez si le message est imprimé visiblement et peut-être pouvez-vous dire d'où il vient.
Gordon Davisson

ssh a bien fonctionné. Je dois également mentionner que je suis souvent confronté à cette question: l'authenticité de l'hôte 'xxxxx (<pas d'hôte pour la commande proxy>)' ne peut pas être établie. L'empreinte digitale de la clé RSA est de 37: 40: d4: c7: etc. Êtes-vous sûr de vouloir continuer à vous connecter (oui / non)? oui
user74094

Gordon, très utile! J'ajoute ceci à mon fichier texte de ligne de commande fu oneliners. Merci beaucoup!
Travis Leleu

Est-ce execnécessaire? (Cela fonctionne bien ici sans cette partie.)
equaeghe

3

Vous pouvez diriger les données vers le processus ssh exécuté sur votre machine, puis exécuter une commande sur la machine intermédiaire qui lit stdin et l'envoie à sftp, le cas échéant.

Cela peut être fait dans un oneliner sur votre machine locale, bien que la citation des arguments à ssh nécessitera du soin. Je suis actuellement sur mon téléphone et je ne peux malheureusement pas saisir les détails. Peut-être que quelqu'un d'autre peut compléter cette réponse comme un exercice!


0

Je suppose que l'hôte final est protégé par un pare-feu et je ne peux que deviner les méthodes que vous pourriez utiliser pour le contourner.

Par exemple - exposez ssh de votre machine locale, puis ssh au premier hôte, puis ssh au second et sftp de l'hôte final à votre machine.


0

disons que A et B sont les premier et deuxième hôtes. Et le fichier à copier est foo

Au lieu de sftp, vous pouvez utiliser ce qui suit

chat foo | ssh Un "chat -> foo"

Maintenant, vous pouvez chaîner 2 d'entre eux en série

chat foo | ssh A "cat - | ssh B \" cat -> foo \ ""


J'aime ça, donc je l'ai essayé. Il a pris le mot de passe pour A, puis a produit le message: La vérification de la clé d'hôte a échoué.
user74094
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.