it-swarm-tr.com

Sftp ile dizinler yüklensin mi?

Ben sftp tarafından (diğer dizinleri birkaç seviye derinlik içeren) dizinleri yüklemekte bazı sorun yaşıyorum. Ben gzipping ile bu sorunu çözebilirim, ama bunun neden gerekli olduğunu anlamıyorum.

Her neyse, deniyorum

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

Son hata mesajının tamamen aptal olduğunu düşünüyorum. Yani dizin mevcut değil mi? Neden dizini oluşturmuyorsunuz?

Sftp ile bu sorunun etrafında yine de var mı, yoksa sadece scp kullanmalı mıyım?

97
Earlz

DÜZELTILDI : Başlangıçta OpenSSH'nin put -r 'u desteklemediğini iddia ettim. Öyle, ama çok garip bir şekilde yapıyor. Hedef dizinin, kaynak dizini ile aynı adla zaten var olmasını beklemektedir.

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

Özellikle garip olan şey, hedef için farklı bir ad verirseniz bile geçerli olmasıdır:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

Daha iyi uygulanan özyinelemeli put için bunun yerine PuTTY psftp komut satırı aracını kullanabilirsiniz. Debian (ve büyük olasılıkla Ubuntu) altındaki PuTTY-tools Paketindedir.

Alternatif olarak, GUI kullanmak istiyorsanız Filezilla istediğinizi yapar.

68
Jander

Neden sftp bunu bilmiyorum ama sadece hedef dizini zaten varsa özyinelemeli kopyalayabilirsiniz. Öyleyse bunu yap ...

sftp> mkdir bin
sftp> put -r bin
130
Useful Dude

Bunun yerine rsync kullanmak isteyebilirsiniz. Bunun komutu

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

Bu bin/ ve /home/earlz/blah/bin/. Ek bir avantaj olarak, önce uzak taraftaki dosyanın değişip değişmediğini kontrol eder ve değişmediyse yeniden göndermez. Ayrıca, bir -z seçeneği ekleyebilir ve sizin için sıkıştırır.

22
Shawn J. Goff

lcd: yerel klasörünüz (alt klasörlerle)

cd: uzak klasörünüz

put -r .

9
eliseu

Sıkıştırmadan, katran da dahil olmak üzere biraz karmaşık bir cevap önerebilir miyim?

İşte başlıyoruz:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

Bu, ./bin dizinini tar (-cf: = dosya oluştur), dosya adı - (yok, stdout) ile paketleyecek ve ssh-komutu aracılığıyla komutun target.org'a (IP de olabilir) yönlendirecektir. tırnak içinde yapılır, yani: cd to blah ve tar -xf (dosyayı çıkar) - yok, isim yok, sadece stdin.

Sanki bir paketi evde paketliyor, gönderiye getiriyorsunuz, sonra sürmeyi beklediğiniz ve açacağınız yere sürüyorsunuz.

Belki sadece sftp kullanan çok daha zarif bir çözüm var.

8
user unknown

yafc (Yine de anot FTP/SFTP istemcisi) kullanabilirsiniz. -r seçeneği orada çok iyi çalışıyor.

2
Dmitry Shpakov

Scp ve sftp için çok güçlü bir alternatif olan rsync öğesini kullanabilirsiniz, özellikle de A makinesinden B makinesine kopyalarını güncellemediğinde, t Değiştirilmemiş dosyaları kopyalayın; aynı zamanda A makinesinden silinmiş olan dosyaları B makinesinden de kaldırabilir (sadece elbette söylendiğinde).

örneğin :

rsync -zrp /home/a/ [email protected]:/home/b/  

-R seçeneği dosyaları özyinelemeli olarak kopyalamak içindir, -z aktarım sırasında sıkıştırmayı etkinleştirir ve -p kopyalama sırasında dosya izinlerini (dosya oluşturma, düzenleme vb.) Korur; bu scp'nin AFAIK yapmadığı bir şeydir. Daha birçok seçenek mümkündür; her zamanki gibi, adam sayfalarını okuyun.
Karolos'un orijinal cevabı

1
Sherlock

Uzak sunucuya ssh ile giriş yapın, kutunuza tekrar bağlanmak için sftp kullanın, ardından get -r dizinleri uzak sunucuya aktarma komutu. Get komutu, dizini önceden oluşturmadan dizinleri yinelemeli olarak aktarmanıza olanak tanır.

ssh remote ip
sftp local ip 
get -r whichever-dir
0
Cyb3rT00th

SFTP vakası:

Bu yapıyı benim ftp üzerinde kopyalamak gerekiyordu:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

Bu benim sorunumu çözdü:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
0

Ben sadece Arch Linux Wiki sftp-paylaşımını sshfs kullanarak bağlamanın mümkün olduğunu öğrendim. Bir chroot ve jail ile sftp-sunucu çalıştırıyorum ve sshfs çok iyi çalışıyor.

  1. Binek: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Çıkar: fusermount -u <your/local/mount/directory>
0
saltani