bagaimana cara menyalurkan data ke koneksi sftp?

9

ftp mendukung put "|..." "remote-file.name"perintah untuk menyalurkan data ke koneksi ftp. Apakah ada yang serupa tersedia untuk sftp?

Di sftp saya mendapatkan kesalahan berikut:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

seperti di atas klien sftp tidak jelas menjalankan perintah.

saya ingin menggunakan perintah pipa untuk secara langsung mengarahkan aliran file ke sftp. (karena tidak ada ruang yang tersisa untuk membuat file cadangan pada disk yang sama sebelum mengunggahnya ke server sftp.)

JMW
sumber
1
Saya berpikir tentang menggunakan FIFO untuk ini, tetapi baik SFTP maupun SCP tidak akan membaca dari FIFO.
Tom Anderson
1
juga ide bagus, ini milik saya: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Jawaban:

4

Saya bersenang-senang mencari solusi untuk masalah ini. Ini membutuhkan alat nc (netcat) di kedua mesin, dan SSH (SFTP tidak diperlukan).

Dalam contoh ini, saya akan memanggil mesin yang memiliki data yang perlu didukung linux-a, dan mesin yang perlu menerima cadangan linux-b.

Di linux-a, minta netcat mendengarkan di port (saya ambil 2000) dan mengarahkannya ke file. Ini hanya akan duduk di sana dan menunggu sampai sesuatu terjadi pada port itu.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

Di linux-b, buka terowongan ssh ke linux-a, saya menggunakan port 2000 lagi. Ini akan mengarahkan ulang apapun yang Anda lemparkan ke TCP port 2000 di localhost ke TCP port 2000 di linux-a, tempat netcat mendengarkan.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

Sekarang buat arsip tar, tetapi kirim output ke stdout (using -) dan pipa ke gzip untuk beberapa kompresi. Sekarang pipa itu ke netcat lain yang mengirimkannya ke localhost pada TCP pada port 2000.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

Dilakukan! Di linux-b, netcat tidak lagi mendengarkan, dan file baru dibuat. Bagian terbaiknya adalah arsip tar tidak pernah ditempatkan pada hard disk linux-a.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

Saya tahu itu tidak persis apa yang Anda minta dalam pertanyaan, tetapi jika Anda memiliki netcat tersedia, itu solusi yang layak untuk jenis masalah Anda.

Sunting: Saya lupa satu hal: jika Anda mengikuti petunjuk ini, Anda masih akan memiliki terowongan SSH yang beredar di linux-a. Cari tahu apa ID proses itu dan bunuh.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741
Kenny Rasschaert
sumber
3
saya suka, tetapi ada 2 masalah: pengguna sftponly biasanya tidak dapat menggunakan port forwarding dan pengguna sftponly tidak dapat mengakses nc di server sftp (ingat mereka tidak memiliki akses ssh)
JMW
1
Itu sepenuhnya kritik yang valid.
Kenny Rasschaert
Di luar topik, tetapi mengapa ada cuplikan layar "The Prestige" yang tertanam di pos ini?
Rilindo
4

Karena ini adalah hasil pertama yang Anda temukan dengan googling untuk pertanyaan ini dan belum disebutkan, saya akan menambahkan solusi yang saya temukan di sini juga:

Anda dapat menggunakan implementasi ikal sftp untuk ini. Karena curl mungkin sudah diinstal pada banyak sistem, ini mungkin lebih disukai daripada solusi menggunakan klien kustom.

contoh penggunaan:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curlmenggunakan .ssh/known_hostsfile Anda untuk verifikasi kunci. Ini mungkin gagal jika ssh client Anda menggunakan standar enkripsi yang lebih baru yang tidak didukung oleh perpustakaan yang digunakan dalam curl

untuk memperbaikinya, Anda dapat menambahkan jenis kunci lain ke file host yang dikenal menggunakan perintah berikut:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

atau Anda dapat menonaktifkan verifikasi kunci menggunakan -kbendera (meskipun saya tidak akan merekomendasikannya)

bsod
sumber
2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' adalah opsi, jika pengguna jarak jauh Anda memiliki shell yang valid.

voretaq7
sumber
5
Ini BUKAN sftp!
jirib
3
@JiriXichtkniha Tidak, tidak, namun SFTP hampir selalu diimplementasikan sebagai subsistem dari server SSH Anda, dan ini adalah analog terdekat dengan fungsi yang saya lihat diminta dari pertanyaan (data pipa melalui SFTP untuk ditangani oleh sebuah program di ujung lain). Terkadang jawabannya adalah "Anda menggunakan alat yang salah - lakukan thissaja." - ini menurut saya sebagai salah satu dari waktu-waktu itu.
voretaq7
2
sftp adalah protol, dan berbeda dari hanya pemipaan via ssh, itu saja! Saran Anda tidak akan berfungsi jika bagian jarak jauh hanya SFTP.
jirib
1
saya tidak diizinkan masuk sebagai pengguna ssh
JMW
1
@ JPW dalam kasus itu sejauh yang saya tahu Anda cukup kacau di sini - Saya belum pernah melihat versi sftp yang mendukung pemipaan ke perintah pada sistem jarak jauh (mungkin karena itu akan mengalahkan Sbit ecure dengan membiarkan seseorang masuk situasi Anda yang tidak memiliki program shell run) Saya bisa saja salah - saya kebanyakan terbiasa dengan fungsi SFTP di OpenSSH dan server SSH milik Sun yang digunakan untuk mengirim ...
voretaq7
1

voretaq7 menunjukkan, bahwa klien sftp tidak mendukung transfer data yang disalurkan untuk pengguna, yang diizinkan untuk menggunakan sftp hanya untuk terhubung ke server.

untungnya, ada libssh2, yang mendukung sftp. jadi kita hanya perlu 2 klien lain menggunakan libssh2, yang saya sebut:

  • sftp_stdin_upload (untuk mengunggah ke server sftp)
  • sftp_stdout_download (untuk mengunduh dari server sftp)

kode sumber dapat ditemukan di bawah URL berikut: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


karena saya tidak berpengalaman dalam pemrograman libssh2, saya senang atas umpan balik ke kode sumber.

JMW
sumber
Tidak berfungsi untuk saya :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): referensi yang tidak terdefinisi ke simbol 'EVP_sha1' / usr / lib / libcrypto. jadi.0.0.0: simbol menambahkan kesalahan: DSO hilang dari baris perintah collect2: error: ld kembali 1 status keluar
tobixen
Kode ini hanya memiliki status POC. Jangan ragu untuk memperbaikinya sendiri. :-)
JMW