Réponses:
Je sais que c'est une réponse tardive, mais je viens de découvrir une façon géniale de le faire. C'est fondamentalement la réponse de Holger Just, mais dans un fichier de configuration enregistré:
Vous devez mettre cela dans votre ~/.ssh/config
fichier sur local.machine, (créer le fichier s'il n'existe pas)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
Après avoir sauvegardé le fichier, vous pouvez simplement utiliser
ssh target.machine
chaque fois que vous voulez vous connecter. Scp fonctionnera également car il respecte également le fichier de configuration ssh. Tout comme Nautilus, si vous utilisez GNOME et souhaitez utiliser une interface graphique.
Host proxy.machine
lignes dans le même ~/.ssh/config
fichier, 2) Mentionnez si ces commandes peuvent être imbriquées (c'est-à-dire que le client se connecte à l'hôte proxy 1 qui se connecte à l'hôte proxy 2 qui se connecte à. ..target) et 3) ce que nc %h %p
signifie
Vous pouvez le faire en une seule commande, mais vous devez installer netcat (nc) sur la machine proxy:
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[EDIT: mélangé l'ordre des machines ...]
Vous pouvez maintenant * faire cela comme une ligne, sans avoir besoin de nc
n'importe où:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
Explication
pcreds
et tcreds
représenter vos informations d' identification de proxy et cible si nécessaire ( username
, username:password
, etc.).
Cela est possible grâce à une capacité intégrée de type netcat, qui supprime l'exigence de nc
sur l'hôte intermédiaire. L'utilisation de ssh -W host:port
configure un tunnel vers l'hôte et le port spécifiés et le connecte à stdin / stdout, puis scp
s'exécute sur le tunnel.
Le %h
et %p
en ProxyCommand
sont remplacés par l'hôte et le port cible que vous spécifiez.
Pour encore plus de commodité, vous pouvez configurer le proxy dans votre configuration ssh:
Host target.machine
ProxyCommand ssh pcreds@proxy.machine -W %h:%p
et à partir de là juste faire
scp tcreds@target.machine:file .
* depuis OpenSSH 5.4 - sorti en mars 2010
-p <portnum>
avant la -W
dans l'une ou l'autre méthode pour spécifier le port proxy
Un one-liner? Pas par hasard. Vous devez d'abord établir un proxy et vous ne pouvez pas le faire avec scp seul.
En le faisant manuellement, j'ouvre une session d'écran pour mon tunnel:
screen -S tunnel
Screen est utilisé pour maintenir le tunnel dans un shell d'arrière-plan. Utilisez n'importe quelle technique pour garder le tunnel ouvert en arrière-plan (la réponse de @ weeheavy est probablement la plus simple). Une fois dans la session d'écran, je commence mon tunnel comme si
ssh -L 2222:target.machine:22 [user@]proxy.machine
Pour décomposer cela, cela dit en gros "Sur ma machine locale, ouvrez le port 2222 et toute connexion touchant localhost: 2222 est mandatée par proxy.machine vers target.machine: 22"
Une fois que vous avez établi la connexion ssh et le tunnel, déconnectez-vous de la session écran avec "Ca d". Pour revenir à cette session d'écran, tapezscreen -raAd tunnel
Une fois que vous êtes de retour dans votre shell d'origine, votre commande scp ressemblera à
scp -P 2222 localhost:your/file/on/target.machine local/path
N'oubliez pas que le port local 2222 n'est en réalité qu'un tunnel allant à target.machine.
Apparaît que scp supporte l'option "-o" comme ssh, bien que je ne sois pas sûr de lui transmettre un nom d'utilisateur / mot de passe proxy:
scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path
Si vous obtenez, nc: invalid option -- X
consultez https://stackoverflow.com/a/23616021/32453
Que diriez-vous:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
Vous pouvez essayer quelque chose comme:
ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file
Mais cela ne fonctionnera pas si votre proxy.machine doit vous demander votre mot de passe (SSH n'est pas dans un TTY, donc askpass échouera).
Si vous avez plus d'un fichier, vous pouvez utiliser tar comme ceci (non testé, j'utilise habituellement un netcat de cette façon):
tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"
Une autre solution simple pour transférer un source_file du source_host à un destination_host via un proxy_host :
Connectez-vous sur le serveur proxy :
ssh login@proxy_host
A partir du serveur proxy, transférer le source_file du source_host au destination_host (vous pouvez taper cela comme une ligne, en omettant le \
, ou deux lignes, comme indiqué ci - dessous):
scp login@source_host:/path_to_source_file \
login@destination_host:/path_to_destination_directory
Cela nécessite que la connexion sur l'hôte source à l'hôte proxy utilise une clé rsa.
Si vous devez utiliser des clés publiques, vous aurez besoin de quelque chose comme ceci.
Host target-machine
User target-user
HostName target.example.com
IdentityFile /path/to/file.pem
ProxyCommand ssh bastion -W %h:%p
Host bastion
User bastion-user
HostName bastion.example.com
IdentityFile /path/to/file.pem
J'ai suivi cet article et trouvé une réponse qui fonctionne pour moi. (Parce que les réponses ci-dessus ne fonctionnent pas pour moi).
Comment créer scp
un fichier via un hôte intermédiaire (ou hôte de saut)
http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html
Et ma réponse est comme ci-dessous:
scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
{source_file} {remote_username}@{remote_IP}:{remote_file_path}
Exemple:
scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz
J'espère que cette réponse pourrait vous aider.