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

136

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

Le serveur ssh écoute sur le port 22 de l'hôte1 et sur le port 6969 de l'hôte2. Maintenant, en utilisant ma machine locale, je dois copier quelque chose de host1 à host2 sans me connecter ni à host1 ni à host2 via ssh. Quelque chose comme,

scp [email protected]:/path/to/file [email protected]/path/to/file

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

Uwais Ibrahim
la source
Demandez-vous si vous pouvez transférer d'un hôte distant vers un hôte distant, ou demandez-vous comment le faire sans avoir à fournir de mot de passe?
Glenn Jackman
Bien que l' -Pindicateur existe pour spécifier le port à utiliser, ssh n'a aucun comportement défini sur la manière de spécifier un port par hôte ...
mveroone

Réponses:

216

Dans le passé, la façon dont scpfonctionnait la copie de fichiers entre systèmes distants ( naïvement ) était très gênante: si vous écriviez, par exemple

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

scpouvrirait d’abord une sshsession sur remote1, puis s’exécuterait scpde là vers 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" parce qu'elle a été mise en œuvre il y a seulement quelques années et que tout le monde n'a peut-être pas la -3capacité de le faire scp) nécessite deux étapes. La première étape nécessaire consiste ~/.ssh/configà configurer toutes les options pour la connexion à distance à 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 transmettre toutes les options nécessaires à la commande sans ambiguïtés : par exemple, si nous avions dit sur le port 2222 d'utilisation de la CLI sans la configuration ci-dessus, il aurait été difficile de savoir s'il s'agissait de remote1 ou de remote2 , et de même pour le fichier contenant les clés cryptographiques. De cette façon, le CLI reste ordonné et simple.

Deuxièmement, utilisez l' -3option suivante:

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

L' -3option indique scpd'acheminer le trafic via le PC sur lequel la commande est émise, même s'il s'agit d'une 3ème partie du transfert. De cette manière, les informations d'identification de l'autorisation ne doivent résider que sur le PC émetteur, le tiers.

MariusMatutiae
la source
6
Pour référence future: 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 seul argument suffit pour se connecter aux deux hôtes.
Artur Czajka
1
Il convient également de noter que, pour Google Compute Engine, l’ajout à votre ~/.ssh/configfichier est pris en charge: cloud.google.com/compute/docs/gcloud-compute mais je ne pense pas que AWS dispose du même support
modulitos
1
Puisque vous ne verrez pas la sortie comme vous le faites normalement, une astuce consiste à activer le mode commenté avec -v.
Holmberd
6

La dernière fois que j'ai essayé cela, scp n'était pas capable de faire ça. 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"
utilisateur259412
la source
ma page de manuel scp indique: "Les copies entre deux hôtes distants sont également autorisées."
Glenn Jackman
1
Merci, c'est bon à entendre. Pour scp, vous pouvez donner un drapeau -P (il a été écrit par des personnes sous BSD, ceci parce que sa gestion des arguments est tellement tragique :-(), mais il semble que vous ne puissiez pas spécifier différents ports sur les hôtes distants. Je suis désolé, mais je pense que seule cette solution de contournement (ou il existe de nombreuses solutions plus complexes, utilisant ssh mais évitant scp - par exemple, sftpfs, mais elles ne sont pas les plus simples). J'ai étendu ma solution de contournement avec les paramètres du port.
user259412
4

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

ssh -P 1234 [email protected] [email protected]

La solution consiste à éditer le /etc/ssh/ssh_configfichier server1et à ajouter 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 offre un meilleur débit que les solutions précédentes, car la communication est directe.

david.perez
la source
perez y at-il un moyen de réaliser scp via deux ports différents pour les deux machines distantes différentes de la ligne comman?
Bouteille rouge
4

La source et la cible peuvent être spécifiées en tant qu'URI sous la forme scp: // [utilisateur @] hôte [: port] [/ chemin]

afin que vous puissiez courir:

scp -3 scp://[email protected]:22/path/to/file scp://[email protected]:6969/path/to/file
molabib
la source