14 Stimmen

SSH - eine Möglichkeit, Dateien zu übertragen, ohne eine separate SFTP-Sitzung zu öffnen?

Nicht wirklich eine Programmierfrage, aber für viele Programmierer relevant...

Nehmen wir an, ich habe eine SSH-Sitzung zu einem anderen Computer eröffnet.

remote:html avalys$ ls
willkommen.msg index.html readme.txt
remote:html avalys$

Gibt es einen Befehl, den ich in meiner Remote-Shell eingeben kann, um eine der Dateien im aktuellen Verzeichnis (z. B. welcome.msg) sofort auf meinen lokalen Computer zu übertragen, d. h.

remote:html avalys$ stransfer welcome.msg
Holen von /home/avalys/html/welcome.msg nach welcome.msg
/home/avalys/html/welcome.msg 100% 23KB 23.3KB/s 00:00
remote:html avalys$

Die einzige mir bekannte Möglichkeit, dies zu tun, besteht darin, eine parallele SFTP-Sitzung zu öffnen und in der SSH-Sitzung eine CD in mein aktuelles Verzeichnis einzulegen, was bei der Fernverwaltung eines Servers ein echtes Ärgernis ist.

EDIT: Ich bin mir der Möglichkeit bewusst, eine umgekehrte sftp/scp-Verbindung zu verwenden, aber das erfordert mehr Tipparbeit. Es wäre toll, wenn ich nur den Namen eines Befehls (z.B. "stransfer") und die zu übertragende(n) Datei(en) eingeben könnte, und es würde einfach funktionieren.

0 Stimmen

Ich verstehe, Sie suchen etwas wie den alten sz-Befehl aus der Fido-Zeit. Mann, das bringt mich zurück.

0 Stimmen

Wenn Sie sich die Eingabe des zweiten Arguments von scp ersparen wollen, fragen Sie einfach nach einem Alias.

8voto

Joshua Punkte 37898

Sie können eine solche umgekehrte Transferverbindung einrichten w/

ssh -Rport:127.0.0.1:22 user@host

für scp zurück.

Utilice scp user@host:port um darauf zuzugreifen.

0 Stimmen

Nette Idee. Das Führen einer .ssh/Konfigurationsdatei auf jedem der beteiligten Rechner erspart Ihnen noch mehr Tipparbeit.

5voto

TaoJoannes Punkte 574

Bei meinen Nachforschungen habe ich ein Programm gefunden, das als Ersatz für den openssh-Client fungiert: zssh.

sudo apt-get install zssh
zssh user@remote
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz

Funktioniert wie ein Zauber.

0 Stimmen

Wow, eine ausgezeichnete Wahl! Hinweis: Auf einem Mac würden Sie auch "sudo port install lrzsz" ausführen, und anstelle von Strg-Leertaste (dem Standardkürzel für Spotlight) würden Sie Strg-Umschalt-2 (^@) drücken

0 Stimmen

Als ich es versuchte, funktionierte es überhaupt nicht - ich bekam "sz: command not found".

0 Stimmen

Das klappt hervorragend. Ich verwende stattdessen lrzsz. sz <filename> Datei an den entfernten Host senden, rz die gewählte Datei in Windows empfangen (oder die Datei auf das XShell-Terminal ziehen, um sie an den Remote-Host zu senden). Es rettet mir wirklich das Leben.

2voto

Nick Punkte 20114

Hier ist die von mir bevorzugte Lösung für dieses Problem [wie sie auf einer doppelte Frage Ich fragte]. Richten Sie einen umgekehrten ssh-Tunnel ein, wenn Sie die ssh-Sitzung erstellen. Dies wird durch zwei Bash-Funktionen erleichtert: grabfrom() muss auf dem lokalen Rechner definiert werden, während grab() auf dem entfernten Rechner definiert werden sollte. Sie können alle anderen ssh-Variablen, die Sie verwenden (z. B. -X oder -Y), nach eigenem Ermessen hinzufügen.

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };

Verwendung:

localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>

Positiv:

  • Es funktioniert ohne spezielle Software auf beiden Hosts über OpenSSH hinaus
  • Es funktioniert, wenn sich der lokale Host hinter einem NAT-Router befindet
  • Sie kann als ein Paar von zwei einzeiligen Bash-Funktionen implementiert werden

Negativ:

  • Es wird also eine feste Portnummer verwendet:
    • funktioniert nicht bei mehreren Verbindungen zum entfernten Host
    • mit einem Prozess in Konflikt geraten könnte, der diesen Anschluss auf dem entfernten Host verwendet
  • Es erfordert, dass localhost ssh-Verbindungen akzeptiert
  • Es erfordert einen speziellen Befehl zur Einleitung der Sitzung
  • Es behandelt nicht implizit die Authentifizierung gegenüber dem localhost
  • Es ist nicht möglich, das Zielverzeichnis auf localhost anzugeben
  • Wenn Sie von mehreren lokalen Hosts auf denselben entfernten Host zugreifen, mag ssh es nicht, wenn sich die Schlüssel ändern

Künftige Arbeit: Dies ist noch ziemlich unausgereift. Offensichtlich wäre es möglich, das Authentifizierungsproblem zu lösen, indem man ssh-Schlüssel entsprechend einrichtet, und es ist noch einfacher, die Angabe eines entfernten Verzeichnisses zu erlauben, indem man einen Parameter zu grab() hinzufügt

Schwieriger ist es, die anderen negativen Aspekte anzusprechen. Es wäre schön, einen dynamischen Port zu wählen, aber soweit ich sagen kann, gibt es keinen eleganten Weg, diesen Port an die Shell auf dem entfernten Host zu übergeben; soweit ich sagen kann, erlaubt OpenSSH nicht, beliebige Umgebungsvariablen auf dem entfernten Host zu setzen, und die Bash kann keine Umgebungsvariablen aus einem Kommandozeilenargument übernehmen. Selbst wenn Sie einen dynamischen Port wählen könnten, gibt es keinen Weg, um sicherzustellen, dass er auf dem entfernten Rechner nicht benutzt wird, ohne dass Sie sich vorher verbinden.

2voto

Chris P Punkte 21

Sie können eine ssh-Verbindung mit sshfs einhängen. Auf diese Weise können Sie Dateien innerhalb derselben ssh-Verbindung übertragen, während Sie den ssh-Client verwenden, der Ihnen am besten gefällt. Sie können es sogar so einrichten, dass es automatisch eingehängt wird, wenn Sie möchten.

1voto

innaM Punkte 46916

Wenn Sie sich für Parcheando Dinge interessieren (die IMHO nicht gepatcht werden sollten), werfen Sie einen Blick auf ssh-xfer

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X