Salin file kembali ke sistem lokal dengan ssh

257

Jika saya masuk ke sistem melalui SSH, apakah ada cara untuk menyalin file kembali ke sistem lokal saya tanpa menyalakan terminal atau sesi layar lain dan melakukan scp atau sesuatu yang serupa atau tanpa melakukan SSH dari sistem jarak jauh kembali ke sistem lokal?

Shawn J. Goff
sumber
4
Jika Anda memiliki server ssh di klien, Anda selalu dapat mencoba scp file.foo [email protected]:file.foo: P
rahmu
4
Pasti, tetapi saya tidak ingin mengizinkan akses ke komputer saya dari server yang dimiliki oleh perusahaan tempat saya bekerja :) Saya hanya memiliki otentikasi berbasis kunci di sini, dan tidak akan terlalu aman untuk memasukkan kunci pribadi saya di server!
Naftuli Kay
2
Saya tidak mengerti masalah Anda. Hasilkan pasangan kunci baru, salin bagian publik ke komputer Anda berwenang_kunci dan setelah transfer Anda hapus baris itu lagi.
Nils
8
Saya sering melakukan ini, jadi tidak efisien untuk melakukan ini setiap kali saya ingin menyalin file di tengah sesi SSH. Saya hanya mencari cara, saat berada dalam sesi terminal SSH, untuk menghubungkan kembali ke komputer lokal saya dan minta ia mengirim file ke server jarak jauh tanpa harus meninggalkan sesi SSH saat ini.
Naftuli Kay
2
Masalahnya adalah bahwa login ssh awal dapat menyulitkan (2fa atau tantangan lain di luar kunci atau kata sandi), kita mungkin tidak memiliki hak pribadi untuk mengubah konfigurasi server ssh, tidak ada alasan untuk harus melakukan negosiasi kunci beberapa kali, dan bahwa begitu kita memiliki sesi, alangkah baiknya menggunakan sesi itu untuk banyak hal.
duanev

Jawaban:

139

Koneksi master

Ini paling mudah jika Anda berencana terlebih dahulu.

Buka koneksi master pertama kali. Untuk koneksi selanjutnya, rutekan koneksi slave melalui koneksi master yang ada. Di Anda ~/.ssh/config, atur berbagi koneksi agar terjadi secara otomatis:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Jika Anda memulai sesi ssh ke yang sama (pengguna, port, mesin) sebagai koneksi yang ada, sesi kedua akan diteruskan ke yang pertama. Membuat koneksi kedua tidak memerlukan otentikasi baru dan sangat cepat.

Jadi saat Anda memiliki koneksi aktif, Anda dapat dengan cepat:

Penerusan

Pada koneksi yang ada, Anda dapat membuat terowongan ssh terbalik. Pada baris perintah ssh, buat penerusan jarak jauh dengan melewati di -R 22042:localhost:22mana 22042 adalah nomor yang dipilih secara acak yang berbeda dari nomor port lainnya pada mesin jarak jauh. Kemudian ssh -p 22042 localhostpada mesin jarak jauh menghubungkan Anda kembali ke mesin sumber; Anda dapat menggunakannya scp -P 22042 foo localhost:untuk menyalin file.

Anda dapat mengotomatiskan ini lebih lanjut dengan RemoteForward 22042 localhost:22. Masalah dengan ini adalah bahwa jika Anda terhubung ke komputer yang sama dengan beberapa contoh ssh, atau jika orang lain menggunakan porta, Anda tidak mendapatkan penerusan.

Jika Anda belum mengaktifkan penerusan jarak jauh dari awal, Anda dapat melakukannya pada sesi ssh yang ada. Jenis Enter ~C Enter -R 22042:localhost:22 Enter. Lihat “Karakter melarikan diri” di manual untuk informasi lebih lanjut.

Ada juga beberapa informasi menarik di utas Server Fault ini .

Salin-tempel

Jika file tersebut kecil, Anda dapat mengetiknya dan menyalin-menempel dari output terminal. Jika file berisi karakter yang tidak dapat dicetak, gunakan penyandian seperti base64 .

remote.example.net $ base64 <myfile
 (salin hasilnya)
local.example.net $ base64 -d> myfile
 (rekatkan isi clipboard)
Ctrl +D

Lebih mudah, jika Anda memiliki penerusan X aktif, salin file pada mesin jarak jauh dan tempel secara lokal. Anda dapat mengirim atau memasukkan data melalui xclipatau xsel. Jika Anda ingin mempertahankan nama file dan metadata, salin dan tempel arsip.

remote.example.net$ tar -czf - myfile | xsel

local.example.net$ xsel | tar -xzf -
Gilles
sumber
Jika kita dapat mentransfer file menggunakan SSH, mengapa orang masih membutuhkan / menggunakan SFTP?
Pacerier
3
@Pacerier Karena SFTP adalah cara untuk mentransfer file menggunakan SSH.
Gilles
Mengapa orang bahkan membutuhkan SFTP jika mereka dapat mentransfer file menggunakan SSH-tanpa-SFTP?
Pacerier
Metode salin-rekat sangat nyaman dengan koneksi berantai (yaitu melompati beberapa host untuk mencapai yang terakhir)
golimar
1
@Pacerier SFTP memiliki beberapa perintah tambahan seperti daftar file atau menghapus file jarak jauh dll.
rahmu
67

Cara mudah lainnya (IMO) adalah:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Atau jika Anda lebih suka sesuatu yang mirip GUI, coba Midnight Commander . Mereka menyebut fitur Shell-Link . Kebanyakan distro memiliki em dalam sistem paket mereka sebagai mc.

Florian Fida
sumber
8
Sejujurnya, saya tidak mengerti mengapa ini tidak dibenarkan. OP meminta solusi tanpa scp. Kadang-kadang, terutama seperti dalam kasus saya di mana saya ssh'ing menjadi router ISP-yang sangat lumpuh, saya tidak punya sftp, saya tidak punya scp, dan bahkan ftp rusak parah. Saya tahu saya bisa melakukan ini, saya hanya datang ke sini untuk memastikan sintaksis saya benar.
Auspex
1
Cemerlang! mcadalah cara tercepat untuk digunakan.
Namek
2
Sebenarnya, solusi ini tidak berfungsi dalam kasus saya. Dengan terowongan yang dibuat dari Windows ke Linux, Anda mulai dalam dempul, bukan terminal. Metode ini tepat seperti yang saya inginkan, tetapi saya tidak dapat menggunakannya. Kesal.
Benjamin
1
Alasan saya tidak memilih ini adalah karena ini tidak akan berfungsi jika mesin klien berada di belakang router bersama (seperti jaringan perusahaan). Seharusnya saya menggunakan komputer kantor dan saya sudah masuk ke server rumah saya. Bagaimana cara menyalin file ke komputer kerja saya setelah melalui rasa sakit dari cd melalui direktori kompleks dengan spasi dan karakter khusus?
Sridhar Sarnobat
1
Ini berfungsi dengan baik dengan data biner. Saya melakukan ini dengan tgzfile sepanjang waktu :)
Florian Fida
53

SSH mendukung beberapa perintah, melalui karakter escape ( ~secara default):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

The !argstampaknya paling dekat dengan apa yang Anda inginkan. Perhatikan bahwa Anda harus PermitLocalCommandmengaktifkan /etc/ssh_configfile Anda agar ~Cperintah dapat berfungsi (lihat man ssh_config).

Anda dapat kembali menggunakan sesi ssh yang sama jika Anda menyiapkan ControlMasterdi ssh_config. Jika kamu melakukan ini:

$ ~C
ssh> !scp file user@myserver:

Anda secara teknis tidak pernah meninggalkan sesi ssh, dan tidak perlu mengautentikasi ulang. Mungkin lebih rumit dari yang Anda inginkan, tetapi saya tidak bisa memikirkan cara lain yang mudah.

Corey Henderson
sumber
Apakah ini masih berfungsi? Saya tidak dapat menemukan !argsdi pesan bantuan.
xuhdev
@xuhdev itu masih ada di OpenSSH_7.2p2, argstidak dalam pertama bantuan pesan ( ~?), tetapi dalam kedua (setelah satu memasuki ssh>cepat dengan ~C, satu dapat mengetik helpdi ssh>prompt)
sdaau
Ini terlihat seperti solusi yang baik (meskipun saya belum mencobanya), saya tidak menyadari Anda bisa mendapatkan buffer baris perintah induk, vim-style. Dalam praktiknya, orang mungkin lebih suka membuka tab terminal baru sehingga mereka tidak lupa bagaimana kembali ke sesi (seperti ketika saya tidak pernah bisa mengingat cara keluar dari emacs).
Sridhar Sarnobat
37

Itu semua adalah metode yang sangat rumit.
Anda dapat memasang sistem file jarak jauh pada mesin lokal Anda dengan sshfs:

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

Kemudian Anda dapat menyalin tempel file dengan nautilus, gnome, konqueror, lumba-lumba, bash atau apa pun.

Kebingungan
sumber
4
Menghubungkan dengan file-kunci:sshfs -oIdentityFile=~/.ssh/keyfile.pem [email protected]:/ /mnt/sshfs/
sshow
15
  • Gunakan ssh-xfer , ssh-agent yang dimodifikasi yang secara efektif membebani saluran sisi ssh yang ada untuk penggunaan transfer file.
  • Gunakan zssh , yang secara efektif zmodem melebihi ssh. Jika Anda pernah menggunakan rzsz ini akan terasa sangat akrab.
  • Membalikkan ( -R, untuk remote-ke-lokal) atau meneruskan ( -L, untuk lokal-ke-jauh) port untuk menjalankan transfer file, dengan asumsi Anda memiliki beberapa daemon mentransfer file mendengarkan di ujung lainnya.

Tapi tidak ada yang benar-benar dibutuhkan, IMO. Protokol SSH mendukung banyak saluran pada satu koneksi, dan klien OpenSSH mendukung multiplexing. Dengan anggapan Anda memiliki ControlMasterdan ControlPath mengatur ( ControlPersistberguna juga),

  # koneksi pertama
$ ssh jarak jauh

  # akan multiplexing melalui koneksi yang sama dengan ssh asli yang dibuka
$ sftp jarak jauh
singkat
sumber
5
zmodem mengingatkan saya pada mengunduh shareware terbaru dari BBS lokal .. :-)
Stuart Woodward
Cara xfer persis seperti yang saya cari, tetapi apakah Anda tahu mengapa patch ssh-xfer tidak termasuk dalam hulu OpenSSH? Nyala api?
Ferran Basora
Terima kasih atas petunjuk zssh! Saya menggunakan tmux di Konsole dan karena tmux "sz" saya dari server tidak berfungsi lagi. Zssh memecahkan masalah saya!
0xAF
9

Pendekatan yang lebih sederhana: Buka Filezilla (atau browser ftp favorit Anda), buka koneksi ssh ke situs yang sama, cari file dan seret ke struktur file lokal Anda. Jika Anda baru mengenal Filezilla, gunakan fitur "pengelola situs" untuk menyambung kembali dengan cepat di lain waktu.

Ya, saya tahu ini jelas bagi sebagian besar dari Anda (dan tidak tepat pada titik), tetapi beberapa (seperti saya) yang menemukan utas ini mencari solusi terminal saja mungkin telah mengabaikan yang jelas.

Larry Jones
sumber
Saya percaya server FileZilla adalah Windows saja. Klien adalah lintas-platform
Freedom_Ben
Anda bahkan bisa menggunakan Caja, cukup buka ssh://SERVER.
basic6
8

Apa yang saya temukan sebagai solusi terbaik dan paling efisien adalah menggunakan xclip-copyfiledan xclip-pastefile.

Di server, Anda gunakan xclip-copyfileuntuk menyalin satu atau lebih file. File-file ini kemudian tersedia di server lokal Anda. Di sana, Anda bisa menggunakannya xclip-pastefile.

Ini memotong kebutuhan untuk menggunakan scpatau memiliki server ssh lokal. Saya menggunakan ini dengan cygwin misalnya. Satu-satunya masalah adalah ini membutuhkan instalasi xclipjika Anda belum memilikinya. Oh, dan ini berfungsi dengan file biner juga.

Robert
sumber
Wow ini mungkin solusi yang lebih baik daripada port forwarding terbalik saya plus netcat
Sridhar Sarnobat
3

Salah satu dari banyak alasan kami menggunakan SecureCRT - meskipun lebih memilih perangkat lunak open source yang praktis - adalah kemudahan melakukan transfer file. Tidak ada penggantian langsung di dunia F / OSS.

SecureCRT dimulai sebagai program Windows murni pada pertengahan 1990-an tetapi porting ke Mac OS X dan Linux beberapa tahun yang lalu .

SecureCRT memiliki tiga fitur utama untuk mentransfer file ke dan dari sistem tempat Anda menggunakan SSH:

  • ZModem , YModem , XModem , Kermit dan ASCII - SecureCRT adalah semacam emulator terminal jadul, mendukung beberapa protokol transfer file in-band.

    Cara termudah untuk digunakan adalah ZModem. Ketika Anda mengetikkan sesuatu seperti sz file-to-downloadpada baris perintah jarak jauh, szprogram jarak jauh menulis urutan keluar yang memberitahu SecureCRT untuk segera mulai mengunduh file-to-downloadke direktori unduhan default.

    Sentuhan yang bagus adalah direktori unduhan dapat disesuaikan per sesi. Kami menggunakan ini untuk memiliki direktori per-situs di server file kantor utama kami, jadi kami tidak perlu mengurutkan file yang diunduh secara manual.

    ( szadalah program "kirim ZModem", bagian dari lrzszpaket. Ini sudah dipaket untuk sebagian besar sistem Unixy. Jika karena alasan tertentu sistem jarak jauh Anda belum menginstalnya, dan Anda tidak dapat dengan mudah menginstal paket biner, paket source berukuran kecil dan sangat portabel. Lebih dari sekali, saya harus mengirim lrzsz tarbal "sharchive" atau uuencode'd ke sistem jarak jauh yang dilucuti agar saya dapat mengirim file ZModem ke sana.)

  • SFTP - SecureCRT memiliki implementasi SFTP dasar yang terintegrasi erat.

    Dengan "terintegrasi penuh," Maksud saya ketika Anda memberikan perintah menu SFTP atau pintasan keyboard, itu membuka tab baru yang terhubung ke situs jarak jauh melalui koneksi SSH yang sama. Dengan demikian, Anda tidak perlu masuk kembali, dan koneksi dibuat sedikit lebih cepat daripada jika Anda telah membuka koneksi SFTP terpisah ke server yang sama.

    Saya mencirikan fitur SFTP sebagai "dasar," karena Perangkat Lunak VanDyke memiliki produk transfer file terpisah, SecureFX . Ini lebih berfitur daripada klien SFTP bawaan, dan juga terintegrasi dengan SecureCRT.

    Fitur SFTP SecureCRT memungkinkan Anda mengonfigurasi direktori jarak jauh dan lokal default yang terpisah dari konfigurasi ZModem.

    Fitur SFTP ini memiliki semacam antarmuka baris perintah dasar, meniru sftpprogram OpenSSH , kecuali bahwa ia memiliki biaya seperti Tabpenyelesaian perintah. Dengan demikian, mengambil file jarak jauh yang disebut somefile.tar.gzmungkin semudah get soTabEnter.

  • Drag-and-drop - Jika Anda drag-and-drop file ke jendela terminal, secara otomatis ketik rzuntuk Anda dan mulai mengirim file.

    Sebagai alternatif, Anda dapat membuka tab SFTP dan menjatuhkan file ke tab itu untuk mengirimkannya melalui SFTP. Jadi, mengirim file ke sistem jarak jauh bisa sesederhana Alt-P, seret , jatuhkan .

    Kami menemukan bahwa transfer terjadi jauh lebih cepat melalui SFTP, mungkin karena ini adalah protokol berbasis TCP, jadi itu manfaat dari jendela geser besar tumpukan TCP / IP modern . ZModem dirancang pada hari-hari ketika ukuran blok 64 kiB dianggap "besar." Dengan demikian, banyak potensi kecepatan dalam suatu tautan direndam dalam ZModem sementara masing-masing ujung menunggu pengakuan transfer blok.

    Satu hal yang menyenangkan tentang mode operasi seret-dan-jatuhkan adalah diperlukan salah satu tekanan dari penggunaan ZModem. Saat Anda mengetik rzdi sistem jarak jauh, SecureCRT memunculkan pemilih file secara otomatis. Anda kemudian memiliki waktu sekitar satu menit untuk menemukan dan memilih file sebelum sisi jarak jauh habis. Ini menciptakan getaran balapan melawan waktu yang tidak menyenangkan. Seret-dan-jatuhkan memungkinkan Anda menemukan file sesuka Anda, lalu mulai transfer dengan satu gerakan cepat mouse.

    Kami masih menggunakan metode manual, memulai transfer dengan rzperintah eksplisit . Ini karena SecureCRT memungkinkan Anda mengonfigurasi direktori unggahan per sesi, yang kami arahkan ke folder di server file yang selalu berisi versi terbaru perangkat lunak yang dijalankan oleh situs jarak jauh tertentu. Untuk transfer semacam itu, tidak ada perlombaan melawan waktu, karena pemilih file terbuka di tempat yang tepat untuk memulai.

Warren Young
sumber
1

Gunakan "!" untuk mengonversi file ke ASCII-representasi file Anda (misalnya ! uuencode myfile.bin >uuencode.dat). Kemudian gunakan ! cat uuencode.dat >target.dat. Setelah itu gunakan uudecode di sisi target:! uudecode target.dat >myfile.bin

Nils
sumber