Question scp entre deux hôtes distants de mon (troisième) pc


J'ai deux hôtes distants.
host1-> 10.3.0.1
host2-> 10.3.0.2
Les deux exécutent un serveur ssh.

Le serveur ssh écoute sur le port 22 dans host1 et sur le port 6969 dans host2. Maintenant, en utilisant mon ordinateur local, je dois copier quelque chose de host1 vers host2 sans me connecter à host1 ou host2 via ssh. Quelque chose comme,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

Comment puis-je faire cela, notez que les deux hôtes utilisent des ports différents pour ssh.


110
2017-12-10 13:49


origine


Demandez-vous si vous pouvez transférer un hôte distant vers un hôte distant ou demandez-vous comment le faire sans avoir à fournir un mot de passe? - glenn jackman
Tandis que le -P Il existe un indicateur pour spécifier le port à utiliser, en cas de transfert de distance à distance, ssh comme aucun comportement défini sur la manière de spécifier le port par hôte ... - mveroone
Puis-je vous demander pourquoi vous n'avez pas accepté ma réponse? - MariusMatutiae


Réponses:


Dans le passé, la façon dont scp travaillé, lorsqu'il est appelé (naïvement) pour copier des fichiers entre systèmes distants, était très incommode: si vous écriviez, par exemple

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scp ouvrirait d'abord un ssh session sur remote1, puis il s'exécuterait scp de là à remote2. Pour que cela fonctionne, vous devez configurer les informations d'identification d'autorisation pour remote2 sur remote1.

La façon moderne de le faire, au contraire ("moderne" car il a été mis en œuvre il y a seulement quelques années, et peut-être pas tout le monde -3-capable scp) nécessite deux étapes. La première étape nécessaire est d'utiliser ~/.ssh/config pour configurer toutes les options pour la connexion à distance1 et à distance2, comme suit:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

De cette façon, il devient possible de passer toutes les options nécessaires à la commande sans ambiguïtés: par exemple, si nous avions dit sur le CLI utiliser le port 2222 sans la configuration ci-dessus, il aurait été difficile de savoir si nous faisions référence à distant1 ou pour remote2, et également pour le fichier contenant les clés cryptographiques. De cette façon, le CLI reste rangé et simple.

Deuxièmement, utilisez le -3 option, comme suit:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

le -3 option instruit scp pour acheminer le trafic via le PC sur lequel la commande est émise, même s'il s'agit d'une tierce partie au transfert. De cette façon, les informations d'identification d'autorisation doivent résider uniquement sur le PC émetteur, le tiers.


177
2017-12-10 18:32



Pour référence ultérieure: Si vous copiez un fichier entre deux hôtes partageant un fichier d'identité (comme une instance EC2), vous n'avez pas besoin du fichier de configuration. Un argument -i suffit pour se connecter aux deux hôtes. - Artur Czajka
Il convient également de noter que Google Compute Engine prend en charge l’ajout de ~/.ssh/config fichier: cloud.google.com/compute/docs/gcloud-compute mais je ne pense pas que AWS a le même support - modulitos


La dernière fois que j'ai essayé ceci, scp n'a pas pu le faire. Votre ligne de commande a l'air bien. Cette solution de contournement fonctionnera:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

5
2017-12-10 14:17



Ma page de manuel scp dit "Les copies entre deux hôtes distants sont également autorisées." - glenn jackman
Merci, c'est bon à entendre. Pour scp vous pouvez donner un drapeau -P (il a été écrit par des personnes BSD, ceci parce que le traitement de ses arguments est tellement tragique :-(), mais il semble que vous ne puissiez pas spécifier différents ports sur les hôtes distants. mais je pense que seulement cette solution de contournement (ou il y a beaucoup de solutions plus délicates, en utilisant ssh mais en évitant scp - par exemple, sftpfs, mais elles ne sont pas les plus simples). - peterh


Dans mon cas, je faisais une copie à distance à distance, sans la -3 argument. Le port fourni avec le paramètre '-P' fonctionne avec le 1er serveur, mais le port 22 est utilisé avec le 2ème.

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

La solution consiste à éditer le /etc/ssh/ssh_config déposer dans server1 et ajoutez ces lignes:

Host *.otherdomain.com
   Port  1234

De cette manière, le port 1234 est utilisé pour les deux. Cela pourrait être différent aussi.

Cette solution a un meilleur débit que les solutions précédentes, car la communication est directe.


3
2018-01-26 14:18