Scp über einen Proxy mit einem Befehl vom lokalen Rechner aus?

54

Ich habe meine local.machine, die proxy.machine und die target.machine. local.machine hat keinen direkten Kontakt zu target.machine, sondern muss proxy.machine durchlaufen.

Ich möchte eine Datei von target.machine nach local.machine scpen. Ist das mit nur einem Befehl von local.machine möglich?

grm
quelle

Antworten:

64

Ich weiß, dass dies eine späte Antwort ist, aber ich habe gerade einen coolen Weg gefunden, dies zu tun. Das ist im Grunde die Antwort von Holger Just, aber in einer gespeicherten Konfigurationsdatei:

Sie müssen dies in Ihrer ~/.ssh/configDatei auf local.machine ablegen (Erstellen der Datei, falls sie nicht vorhanden ist).

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh [email protected] nc %h %p 2> /dev/null

Nach dem Speichern der Datei können Sie einfach verwenden

ssh target.machine

Sie können jederzeit eine Verbindung herstellen. SCP wird auch funktionieren, da es auch die ssh-Konfigurationsdatei respektiert. Dies gilt auch für Nautilus, wenn Sie GNOME verwenden und eine GUI verwenden möchten.

user24925
quelle
5
Nur eine schnelle Anmerkung. Wenn Sie eine alternative Identitätsdatei über die Befehlszeilenoption -i für ssh verwenden, müssen Sie diese Option sowohl für die ProxyCommand-Konfiguration als auch für die ssh-Befehlszeile angeben.
BillMan
7
3 Dinge, die helfen könnten, 1) Es wäre hilfreich, wenn Sie auch die Host proxy.machineZeilen in derselben ~/.ssh/configDatei anzeigen würden. 2) Erwähnen Sie, ob diese Befehle verschachtelt werden können (dh, der Client stellt eine Verbindung zum Proxy-Host 1 her, der eine Verbindung zum Proxy-Host 2 herstellt. ..target) und 3) was nc %h %pbedeutet
puk
Wie können wir mit einem Proxy von einem lokalen Computer auf einen Zielcomputer kopieren?
Mulagala
19

Sie können dies mit einem einzigen Befehl tun, aber Sie müssen netcat (nc) auf dem Proxy-Computer installiert haben:

ssh -o "ProxyCommand ssh [email protected] nc -w 1 %h 22" [email protected]

[EDIT: Reihenfolge der Maschinen vertauscht ...]

Holger Just
quelle
Netter Versuch, aber wo soll ich den Benutzernamen für Proxy und Login hinzufügen?
Grm
Jzst vor den Maschinennamen, mit einem @. Ich habe meine Antwort bearbeitet, um das zu reflektieren.
Holger Nur
19

Sie können dies jetzt * als Einzeiler tun, ohne nc irgendwo etwas zu benötigen :

scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file .

Erläuterung

pcredsund tcredsstellen Sie Ihre Proxy - und Ziel - Anmeldeinformationen bei Bedarf ( username, username:passwordusw.).

Dies ist aufgrund einer eingebauten netcat-ähnlichen Funktion möglich, die die Anforderung für ncden Zwischenhost beseitigt . Mit ssh -W host:portwird ein Tunnel zu dem angegebenen Host und Port eingerichtet und mit stdin / stdout verbunden. Anschließend wird scpder Tunnel durchlaufen.

Die %hund %pin ProxyCommandwerden durch den von Ihnen angegebenen Zielhost und -port ersetzt.

Für noch mehr Komfort können Sie den Proxy in Ihrer ssh-Konfiguration konfigurieren:

Host target.machine
    ProxyCommand ssh [email protected] -W %h:%p

und von da an einfach tun

scp [email protected]:file .

* seit OpenSSH 5.4 - veröffentlicht im März 2010

CupawnTae
quelle
1
Verifiziert, dass dies in der Tat gut funktioniert und veraltete NC-Prozesse nicht auf dem Proxy-Rechner herumliegen lässt.
LaXDragon
1
Wo kann ich den Port des Proxys angeben?
7.
1
@Marged Ich bin im Moment nicht in der Lage, es hier zu versuchen, aber ich denke, Sie sollten in der Lage sein, -p <portnum>vor der -Win beiden Methoden anzugeben, den Proxy-Port
CupawnTae
1
Es hat eine Weile gedauert, bis ich herausgefunden habe, dass die Option -i (falls erforderlich) in den Anführungszeichen steht. Der Proxy-SSH verwendet standardmäßig nicht denselben privaten Schlüssel, der von einer Option -i angegeben wird, die direkt an scp übergeben wird. Ich denke, das ist offensichtlich, wenn man darüber nachdenkt.
Keeely,
18

Wenn es Ihnen nichts ausmacht, rsync anstelle von scp zu verwenden, können Sie den folgenden Einzeiler verwenden:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(Sie benötigen einen passwortlosen Zugang zum Proxy-Rechner)

Dubek
quelle
8
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .

OK, eigentlich zwei Befehle ...

weh
quelle
1
Wie kann ich den Port meines Proxys angeben? In meinem Fall8080
Marged
@Marged -p <portnumber>zu Ihrem
SSH-
6

Ein Einzeiler? Nicht über meinen Kopf. Sie müssen zuerst einen Proxy einrichten und können dies nicht mit scp selbst tun.

Wenn ich es manuell mache, öffne ich eine Bildschirmsitzung für meinen Tunnel:

screen -S tunnel

Screen wird verwendet, um den Tunnel in einer Hintergrund-Shell laufen zu lassen. Verwenden Sie eine beliebige Technik, um den Tunnel im Hintergrund offen zu halten (die Antwort von @ weeheavy ist wahrscheinlich die einfachste). Einmal in der Screen Session starte ich meinen Tunnel so

ssh -L 2222:target.machine:22 [user@]proxy.machine

Um das aufzuschlüsseln, heißt es im Grunde: "Auf meinem lokalen Computer öffnen Sie Port 2222 und alle Verbindungen, die localhost: 2222 treffen, werden über proxy.machine an target.machine: 22 weitergeleitet."

Sobald Sie die SSH-Verbindung und den Tunnel hergestellt haben, trennen Sie die Bildschirmsitzung mit "Ca d". Geben Sie ein, um zu dieser Bildschirmsitzung zurückzukehrenscreen -raAd tunnel

Sobald Sie wieder in Ihrer ursprünglichen Shell sind, wird Ihr scp-Befehl so aussehen

scp -P 2222 localhost:your/file/on/target.machine local/path

Denken Sie daran, dass der localhost-Port 2222 wirklich nur ein Tunnel ist, der zur target.machine führt.

Walfisch
quelle
3

Scheint, dass scp die Option "-o" genau wie ssh unterstützt, obwohl ich nicht sicher bin, wie ich einen Proxy-Benutzernamen / ein Proxy-Passwort übergeben soll:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Wenn Sie erhalten, nc: invalid option -- Xsehen Sie https://stackoverflow.com/a/23616021/32453

Rogerdpack
quelle
Dope Bro, arbeitete sofort :)
Elouan Keryell-Even
2

Wie wäre es mit:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
eggroll77
quelle
oder möglicherweise Benutzername: Passwort hier?
Rogerdpack
1

Sie könnten versuchen, etwas wie:

ssh [email protected] "ssh [email protected] 'cat > file'" < file

Es funktioniert jedoch nicht, wenn Ihre proxy.machine Sie nach dem Kennwort fragen muss (SSH ist nicht in einem TTY enthalten, daher schlägt askpass fehl).

Wenn Sie mehr als eine Datei haben, können Sie tar wie folgt verwenden (ungetestet, ich verwende normalerweise ein Netcat so):

tar cf - file1 file2 folder1/ | ssh [email protected] "ssh [email protected] 'tar xvf -'"
Eric Darchis
quelle
1

Eine weitere einfache Lösung , die eine Übertragung source_file vom source_host zu einem destination_host über ein proxy_host :

Melden Sie sich am Proxy-Server an :

ssh login@proxy_host

Von dem Proxy - Server, übertragen Sie die source_file vom source_host zum destination_host (Sie können diese Art als eine Zeile, das Weglassen des \, oder als zwei Linien, wie unten dargestellt):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Dies setzt voraus, dass die Anmeldung am source_host am proxy_host einen rsa_key verwendet.

lomai
quelle
0

Falls Sie öffentliche Schlüssel benötigen, benötigen Sie so etwas.

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
Löwe
quelle
0

Ich folgte diesem Artikel und fand eine Antwort, die für mich arbeitet. (Weil die obigen Antworten für mich nicht funktionieren).

So scperstellen Sie eine Datei über einen Zwischenhost (auch Sprunghost genannt): http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

Und meine Antwort ist wie folgt:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Beispiel:

scp -oProxyCommand="ssh -W %h:%p [email protected]" \
        archive.gz [email protected]:/home/wise/archive.gz

Ich hoffe diese Antwort konnte Ihnen helfen.

Wise Lin
quelle