veri sftp bağlantısı nasıl boru?


9

ftp, put "|..." "remote-file.name"verileri bir ftp bağlantısına aktarma komutunu destekler . Sftp için benzer bir şey var mı?

Sftp i aşağıdaki hatayı alıyorum:

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

Yukarıdaki gibi sftp istemcisi komutu çalıştırmaz.

doğrudan sftp dosya akışını yönlendirmek için pipe komutunu kullanmak istiyorum. (sftp sunucusuna yüklemeden önce aynı diskte yedek dosya oluşturmak için yeterli alan olmadığından.)


1
Bunun için bir FIFO kullanmayı düşündüm, ancak ne SFTP ne de SCP bir FIFO'dan okumaz.
Tom Anderson

1
ayrıca iyi bir fikir, bu benim: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Yanıtlar:


4

Bu soruna bir çözüm bulmak çok eğlendim. Her iki makinede de nc (netcat) aracını ve SSH'yi (SFTP gerekli değildir) gerektirir.

Bu örnekte, linux-a'yı yedeklemesi gereken verilere sahip makineyi ve linux-b yedeklemesini alması gereken makineyi arayacağım.

Linux-a'da, netcat'in bir portu dinlemesini sağladım (2000'i aldım) ve bir dosyaya yönlendirin. Bu sadece orada oturup o limanda bir şey gelene kadar bekler.

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

Linux-b'de linux-a'ya bir ssh tüneli açın, 2000 numaralı bağlantı noktasını tekrar kullandım. Bu, localhost üzerindeki TCP bağlantı noktası 2000'de, netcat'in dinlediği linux-a üzerindeki TCP bağlantı noktası 2000'e attığınız her şeyi yeniden yönlendirir.

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

Şimdi katran arşivini oluşturun, ancak çıktıyı stdout'a gönderin (- kullanarak) ve biraz sıkıştırma için gzip'e ekleyin. Şimdi bunu 2000 numaralı bağlantı noktasında TCP'deki localhost'a gönderen başka bir netcat'e bağlayın.

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

Yapılmıştı! Linux-b'de netcat artık dinlemiyor ve yeni bir dosya oluşturuluyor. En iyi bölüm, katran arşivinin asla linux-a'nın sabit diskine yerleştirilmemesidir.

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

Sorunda tam olarak istediğin şey olmadığını biliyorum, ancak netcat'iniz varsa, sorun türünüze uygun bir çözüm.

Düzenleme: Bir şeyi unuttum: Bu talimatları izlerseniz, hala linux-a üzerinde yüzen bir SSH tüneli olacak. İşlem kimliğinin ne olduğunu öğrenin ve öldürün.

[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

3
i gibi, ama 2 sorun var: sftponly kullanıcılar genellikle port yönlendirme kullanamaz ve sftponly kullanıcılar sftp sunucusunda nc erişemez (ssh erişim olmadığını unutmayın)
JMW

1
Bu tamamen geçerli bir eleştiri.
Kenny Rasschaert

Konu dışı, ama neden bu yayına gömülü "Prestij" in bir ekran görüntüsü var?
Rilindo

4

Bu, bu soru için googling yaparak bulduğunuz ilk sonuç olduğundan ve daha önce bahsedilmediğinden, burada bulduğum çözümü de ekleyeceğim:

bunun için bukleler sftp uygulamasını kullanabilirsiniz. Curl muhtemelen birçok sisteme zaten kurulduğundan, özel istemciler kullanan çözüme tercih edilebilir.

örnek kullanım:

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

curl.ssh/known_hostsanahtar doğrulaması için dosyanızı kullanır . Bu, ssh istemcinizin curl içinde kullanılan kitaplık tarafından desteklenmeyen daha yeni şifreleme standartlarını kullanması durumunda başarısız olabilir

bunu düzeltmek için, aşağıdaki komutu kullanarak bilinen anahtar dosyasına diğer anahtar türlerini ekleyebilirsiniz:

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

veya -kbayrağı kullanarak anahtar doğrulamayı devre dışı bırakabilirsiniz (bunu tavsiye etmem)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' uzak kullanıcınızda geçerli bir kabuk varsa bir seçenektir.


5
Bu sftp DEĞİL !
jirib

3
@JiriXichtkniha Hayır, öyle değil, ancak SFTP neredeyse her zaman SSH sunucunuzun bir alt sistemi olarak uygulanmaktadır ve bu, sorudan talep edildiğini gördüğüm işlevselliğe en yakın analogdur (SFTP üzerinden boru verileri bir program tarafından ele alınacak diğer ucunda). Bazen cevap "Yanlış aracı kullanıyorsunuz - thisbunun yerine yapın." - bu bana o zamanlardan biri gibi geliyor.
voretaq7

2
sftp protol ve sadece ssh ile borulardan farklı, hepsi bu! Uzak kısım yalnızca SFTP olacaksa öneriniz işe yaramaz.
jirib

1
ssh kullanıcısı olarak giriş yapmasına izin verilmiyor
JMW

1
@JMW, burada oldukça iyi vidalandığınızı bildiğim kadarıyla - Uzak sistemdeki bir komuta borulamayı destekleyen bir sftp sürümü görmedim (muhtemelen Sbirine izin vererek ecure bitini yeneceği için ) zaten kabuk çalıştırmayan programlarınız). Yine de yanlış olabilirim - çoğunlukla OpenSSH'deki SFTP işlevselliğini ve Sun'ın gemi için kullandığı özel SSH sunucusunu
tanıyorum

1

voretaq7 , sftp istemcisinin yalnızca sunucuya bağlanmak için sftp kullanmasına izin verilen kullanıcılar için borulu veri aktarımını desteklemediğine dikkat çekti.

neyse ki, sftp'yi destekleyen libssh2 var. Bu yüzden sadece ben aradım libssh2 kullanarak 2 diğer istemcilere ihtiyacımız var:

  • sftp_stdin_upload (bir sftp sunucusuna yüklemek için)
  • sftp_stdout_download (sftp sunucusundan indirmek için)

kaynak kodu aşağıdaki URL'de bulunabilir: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


libssh2 programlama konusunda deneyimli olmadığım için, kaynak koduna herhangi bir geri bildirim için mutluyum.


Benim için çalışmıyor :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): 'EVP_sha1' / usr / lib / libcrypto sembolüne tanımsız referans. so.1.0.0: sembol ekleme hatası: DSO, komut satırı collect2'de eksik: hata: ld 1 çıkış durumu döndürdü
tobixen

Bu kodun sadece bir POC durumu vardır. Kendi başınıza düzeltmekten çekinmeyin. :-)
JMW
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.