Unduh file melalui sesi SSH aktif


86

Saya ingin mengunduh file dari sesi SSH aktif. Dalam banyak kasus, saya mungkin bisa hanya menggunakan SFTP, scp, rsyncet al tetapi ada saat di mana saya telah ditinggikan hak akses pada remote server dengan cara saya tidak dapat menggunakan metode ini.

Jika Anda kesulitan memahami apa yang saya maksud, bayangkan Anda ingin mengunduh sesuatu dari /root/atau /var/log/auth.log. Login root dinonaktifkan (karena kami bukan idiot). Bagaimana Anda mendapatkan file itu? Salin di suatu tempat yang kurang terlindungi lalu pindahkan? Ini kikuk. Ada juga skenario di mana path jarak jauh kompleks atau sementara, atau bahkan bukan jalan karena saya ingin output dari perintah jarak jauh disimpan secara lokal. Simpan dari jarak jauh, lalu salin? Bunyi!

Ada beberapa cara lebih kikuk untuk mencapai versi ini tetapi di dunia yang ideal, saya akan memiliki sesuatu yang mirip dengan akses tulis lokal dari server jauh, menggunakan sesi SSH yang ada sebagai saluran. Sesuatu seperti (ini hanya kesan seorang artis):

$oli@remote: cp /root/cheesecake /local/

Dan itu hanya muncul di lokal saya cwd. Dan akses dua arah tidak akan menjadi hal yang buruk.


Sudah delapan tahun sejak saya mengajukan pertanyaan ini dan kami telah melihat sejumlah suara nyata, tetapi masih menjadi masalah yang kadang-kadang masih saya perjuangkan.

Saya telah refactored pertanyaan menjadi sesuatu yang jauh lebih idealis. Saya sepenuhnya memahami bahwa saat ini mungkin tidak ada jawaban yang sempurna. Semua upaya masa lalu dan masa depan menuju cita-cita saya dihargai.


1
Pertanyaan menarik! Ini benar-benar menunjukkan bagaimana ide orang tentang apa yang masuk akal untuk dilakukan dibentuk oleh alat yang mereka gunakan. zsshmungkin paling dekat dengan alur kerja mirip-zmodem yang mungkin Anda ingat.
poolie

1
Saya sangat terkejut bahwa bahkan setelah 8 jawaban, tidak ada cara untuk melakukan ini
endolith

Jawaban:


34

Anda mungkin ingin memeriksa zssh , yang tersedia di jagat raya, dan karenanya tersedia bersama

sudo apt-get install zssh

Anda memerlukannya di server ubuntu dan klien Anda, tetapi pada dasarnya ketika login dengan zssh, Anda cukup menekan 'ctrl- @' dan menampilkan "mode transfer file" yang memungkinkan Anda mengirim file kembali ke pipa ke mesin klien, atau unggah dari klien ke server.

Namun, Anda tidak perlu mengaut ulang atau membuka jendela baru untuk scp.

Jika Anda menggunakan kunci ssh, dan agen ssh, Anda dapat dengan mudah melakukannya:

[enter]~[ctrl]-Z

Yang akan menjadi latar belakang ssh, dan kemudian hanya scp $!:/whatever/whatever .'

Setelah file ditransfer, fguntuk mendapatkan kembali ssh.

Jika Anda tidak menggunakan kunci ssh, Anda masih bisa menggunakan opsi "ControlMaster" dan "ControlPath" yang ditambahkan ke versi OpenSSh terbaru, tetapi itu menjadi rumit, periksa man ssh_config


24

Dengan asumsi Anda menjalankan server ssh di desktop Anda (ada beberapa cara untuk mengatasi ini, tapi saya pikir mereka semua menambah kompleksitas, dan mungkin memiliki masalah keamanan), Anda dapat mengatur terowongan ssh terbalik. Lihat SSH dengan mudah menyalin file ke sistem lokal. lebih di unix.SE .

  • Ketik Enter ~C Enter -R 22042:localhost:22 Enteruntuk membuat reverse port forwarding dari server Anda ke desktop Anda (22042 dapat berupa nomor port apa pun antara 1024 dan 65534 yang tidak digunakan).
  • Kemudian scp -P 22042 foo localhost:akan menyalin file foodi direktori Anda saat ini di server ke rumah Anda di desktop.
  • Sekarang pindahkan file ke direktori Anda saat ini di desktop dengan mengetik Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

Ssh escape sequence dimulai dengan ~; tilde hanya dikenali setelah baris baru. ~ Ctrl+Zmenempatkan ssh ke latar belakang. ~Cmemasuki baris perintah di mana Anda dapat membuat atau menghapus penerusan.


1
Menggunakan 2 lapis enkripsi & kompresi agak berlebihan, itu sebabnya saya menyarankan menggunakan rsh atau ftp untuk "back link".
JanC

2
@JanC: Itu memerlukan lebih banyak pengaturan: Anda harus menginstal server rsh atau ftp, dan pastikan konfigurasinya aman. Overhead enkripsi sangat minim bahkan pada netbook.
Gilles

Server ssh juga tidak diinstal secara default. ;)
JanC

@JanC: Keuntungan lain dari ssh adalah bahwa jika Anda telah mengaktifkan penerusan agen, Anda tidak perlu mengetikkan kata sandi untuk melakukan salinan. Efisiensi alur kerja melebihi komputasi mikro.
Gilles

Anda dapat melakukan sesuatu seperti itu dengan (beberapa) layanan lain juga. Bagaimanapun, ada beberapa solusi serupa yang semuanya melibatkan pengaturan koneksi tunneled kembali dan daemon tambahan ...;)
JanC

10

Saya datang dengan cara untuk melakukan ini dengan ssh standar. Ini adalah skrip yang menduplikasi koneksi ssh saat ini, menemukan direktori kerja Anda pada mesin jarak jauh dan menyalin kembali file yang Anda tentukan ke mesin lokal. Dibutuhkan 2 skrip yang sangat kecil (1 remote, 1 lokal) dan 2 baris dalam konfigurasi ssh Anda. Langkah-langkahnya adalah sebagai berikut:

  1. Tambahkan 2 baris ini ke ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Sekarang jika Anda memiliki koneksi ssh ke machineX terbuka, Anda tidak perlu kata sandi untuk membuka yang lain.

  2. Buat skrip 1-baris pada mesin jarak jauh yang disebut ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Buat skrip di mesin lokal bernama ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. dan buat alias untuk grab.sh di ( ~/.bashrcatau di mana pun):

    alias grab=~/.grab.sh
    

Itu saja, semua sudah selesai. Sekarang jika Anda masuk machineX:/some/directory, cukup jalankan terminal dan ketik baru

grab machineX filename

Itu menempatkan file di direktori kerja Anda saat ini di mesin lokal. Anda dapat menentukan lokasi yang berbeda sebagai argumen ketiga untuk "ambil".

Catatan: Jelas kedua skrip harus "dapat dieksekusi", yaitu chmod u+x filename.


Menarik, bisakah Anda menjelaskan cara kerjanya? Apakah Anda dapat memperpanjang ini untuk mendukung "menempatkan" file serta mengambilnya?
Peter Gibson

5

Jika mesin klien Anda (mesin yang Anda duduki) disebut machineA dan mesin yang saat ini Anda masuki SSH disebut mesin B. MachineA, mesin lokal Anda harus menjalankan SSHD dan membuka port 22. Kemudian:

scp myfile machineA:

Salinan myfilepada MachineB ke direktori home MachineA saya di machineA. Ini mengasumsikan userid / password sama.

scp myfile machineA:/newdir/newname

Salin myfilesatu MachineB ke /newdir/newnamepada machineA. Ini mengasumsikan userid / password sama.

scp MachineA:/path/to/my/otherfile . 

Mendapat salinan dari otherfiledirektori MachineA saya di MachineA dan menempatkannya di direktori kerja saya saat ini di mesin MachineB (ditunjuk dalam mode UNIX standar oleh karakter "dot" (.)). Ini mengasumsikan userid / password sama.

Jika userid / kata sandi tidak sama maka gunakan:

scp myfile user@MachineA: untuk mendapatkan file.

scp user@MachineA:/path/to/my/otherfile . untuk meletakkan file

CATATAN tentang SCP:

Sama seperti cpperintah, scpmemiliki opsi -p untuk menyebarkan pengaturan izin dari file asli ke salinan (jika tidak, salinan dibuat dengan pengaturan normal untuk file baru), dan opsi -r untuk menyalin seluruh pohon direktori dengan satu perintah.

scpmenciptakan saluran data terenkripsi yang benar-benar transparan antara kedua mesin, sehingga data biner (seperti gambar atau program yang dapat dieksekusi) disimpan dengan benar. Ini juga berarti bahwa scptidak dapat melakukan konversi terminasi end-of-line otomatis antara berbagai jenis sistem operasi, seperti yang dapat dilakukan dengan ftp dalam mode "ascii". Itu tidak akan menjadi masalah ketika menyalin antara sistem Unix, yang semuanya menggunakan konvensi end-of-line yang sama.


2

jika Anda mengakses server melalui ssh, Anda juga dapat terhubung melalui sftp. Simpan klien filezilla (GUI) dan rekatkan jalur yang saat ini Anda tempati

masukkan deskripsi gambar di sini


2
Ini akan mendapat manfaat dengan perincian yang lebih besar, termasuk bagaimana menghubungkan ke server SSH dengan FileZilla (tidak jelas). Tangkapan layar juga dapat membantu, selain teks penjelasan .
Eliah Kagan

2

Jika file Anda cukup kecil Anda dapat menyandikannya dengan base64 dan kemudian mendekodekannya secara lokal:

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

Jawaban asli tempat saya mendapatkan ini (dan diuji) dari: https://unix.stackexchange.com/a/2869/194134


Apa hubungannya dengan sesuatu? Anda tidak perlu menyandikan file untuk txfr dengan scp dll.
HörmannHH

1

Itu bukan melalui koneksi SSH aktif, tetapi scp menyalin file menggunakan mekanisme dan izin yang sama seperti halnya ssh.


4
Saya menyadari scp tapi ini alur kerja yang sangat terputus-putus. Jika saya bekerja di direktori remote yang diberikan, saya perlu mendapatkan path jarak jauh, lepaskan (atau menelurkan shell lain), lakukan scping menulis path dan kemudian hubungkan kembali. Saya mencari sesuatu yang mirip dengan tulisan get filedan secara ajaib muncul kembali di mesin lokal saya. Jika harus melakukan itu melalui beberapa layanan yang terhubung melalui SSH, maka jadilah .. Tapi harus terikat sesi.
Oli

Plus itu digantikan oleh sftp (lihat jawaban saya)
Olivier Lalonde

@Oli - Karena kedua ujung transaksi adalah * kotak nix, keduanya kemungkinan telah sshdberjalan dan dengan demikian Anda harus dapat menggunakan scppada baris perintah server untuk membuang file kembali ke klien. Hanya ada begitu banyak keajaiban untuk berkeliling; terkadang kita masih harus menekan tombol. Solusi FileZilla juga berguna.
zerobandwidth

1

Ini tidak mungkin dengan sesi ssh default, tetapi Anda dapat menggunakan skrip alih-alih ssh, yang memulai sesuatu seperti ftp sederhana atau server rsh pada sistem lokal Anda dan menjalankan ssh dengan opsi yang diperlukan untuk mengatur terowongan kembali ke desktop Anda untuk menghubungkan ke server ini.


Atau bisa saja scp / rsync ...
HörmannHH

1

konsole memiliki kemampuan itu melalui menu "Edit-> ZModem Upload" saat Anda berada di sesi jarak jauh (atau Ctrl-Alt-U).

Harap dicatat: paket lrzszharus diinstal terlebih dahulu. Bagi saya sepertinya berfungsi hanya untuk mengunggah file ASCII.


0

Karena Anda terhubung dari desktop, saya kira Anda dapat membuka terminal kedua.

Inilah yang sering saya lakukan:

  • dari terminal pertama, di mana sesi ssh sedang berjalan, saya mendapatkan path lengkap dari file yang saya perlukan, menggunakan salah satu realpath myfileatau readlink -f myfile(rilis Ubuntu yang lebih lama tidak menginstal realpath) dan menyalinnya.
  • dari terminal kedua saya menggunakan scpatau sftpuntuk mendapatkan file, menempel path lengkap yang saya dapatkan sebelumnya. Sebagai contoh:scp user@host:/etc/some/file ./

Ini cukup mendasar, tetapi juga mudah diingat dan tidak perlu paket tambahan untuk bekerja.

dapatkan path lengkap dari terminal pertama, lalu tempel di terminal kedua


Tidak membantu dengan masalah "mencoba mendapatkan file root dan masuk dengan root secara langsung tidak diizinkan" yang diajukan dalam pertanyaan.
Oli

0

Anehnya saya tidak melihat adanya komandan Midnight tua yang baik di sini. Menurut saya, itu mungkin manajer file yang paling universal & bermanfaat untuk shell dengan kemampuan-daya, salah satu alat "harus memiliki" untuk case, yang juga memungkinkan Anda untuk terhubung melalui SSH, FTP, SFTP juga, saat panel kedua Anda dapat membuka sistem file (lokal) Anda yang lain dan bekerja dengan file secara bebas.

Yang Anda butuhkan adalah: apt-get install mc (from universe)

Setelah itu, jalankan mc, buka menu untuk panel kiri atau kanan, pilih koneksi shell, masukkan nama pengguna @ remote-ip, kata sandi - sebenarnya, itu saja .. salin (di sini: unduh) file / folder dari satu mesin ke komputer lain dengan F5, pindah dengan F6, dan seterusnya sesuai dengan tombol di bawah ini. Untuk pengguna MS lama: seperti di NC untuk DOS


-2

CARA overthinking ini, teman-teman. Saya juga mencari semua jawaban yang dalam, gelap, dan rumit. Ternyata, Anda dapat melakukan ini langsung dari Dolphin langsung dari kaleng. ikan: // username @ server: port


Saya tidak mengerti
Pierre.Vriens

Saya tidak berpikir Anda mengerti kasus penggunaan saya. Saya sedang dalam sesi baris perintah SSH aktif dan ingin mengirim file kembali ke komputer lokal saya dari lokasi [yang berpotensi istimewa, yaitu tidak tersedia di SFTP]. Itu bahkan mungkin bukan file pada awalnya, itu mungkin output perintah. Saya sedang mencari cara untuk mengembalikannya tanpa membuat file perantara dan memulai sesi SFTP / SCP / etc baru.
Oli
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.