Sftp ile dizin yükleniyor?


97

Sftp tarafından dizinleri yüklerken bazı sorunlar yaşıyorum (birkaç satır derinliğinde diğer dizinler içeren). Gzipping ile bu sorunu çözebileceğimin farkındayım, ama neden gerekli olduğunu anlamıyorum.

Neyse, denerim

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"

Bence son hata mesajı tamamen aptalca. Yani dizin yok mu? Dizini neden oluşturmuyorsun?

Sftp ile bu konuda yine de var mı, yoksa sadece scp kullanmalı mıyım?

Yanıtlar:


68

DÜZELTİLDİ : Başlangıçta hatalı bir şekilde OpenSSH'nin desteklemediğini iddia ettim put -r. Olur, ama çok garip bir şekilde yapar. Hedef dizinin zaten kaynak dizinle aynı isimde olmasını bekliyor gibi görünüyor.

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, bunun geçerli olması:

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 uygulanmış bir özyinelemeli için put, psftpbunun yerine PuTTY komut satırı aracını kullanabilirsiniz . Bu öyle putty-toolsDebian (ve büyük olasılıkla Ubuntu) altında paketin.

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


Bilginize: sftptanır put -rdan OpenSSH 5.4
Tino

3
Teşekkürler - Cevabımı düzelttim. Zamanı geldi, ha? ;-P
Jander,

128

Sftp'nin bunu neden yaptığını bilmiyorum ama sadece hedef dizin zaten mevcutsa tekrarlanan kopyaları alabilirsiniz. Öyleyse bunu yap ...

sftp> mkdir bin
sftp> put -r bin

1
-rOpenSSH 5.4 ya da daha yükseğine ihtiyacı var
Tino 12

22

Bunun rsyncyerine kullanmak ilginizi çekebilir . Bunun için komut olacaktır

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

Bu, her şeyi kopyalar bin/ve içindeki uzak sunucuya yerleştirir /home/earlz/blah/bin/. Ek bir avantaj olarak, ilk önce uzak taraftaki dosyanın değişip değişmediğini kontrol eder ve değişmediyse yeniden göndermez. Ek olarak, bir -z seçeneği ekleyebilir ve bunu sizin için sıkıştırabilir.


Awsome! Çok basit!
Asken,

3
Lütfen bunun sftpbir komut ve protokol olduğunu unutmayın . -protocol'u rsyncdesteklemiyor sftp.
Tino

9

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

cd: uzak klasörünüz

put -r .


Aslında, bunun en doğru cevap olduğunu düşünüyorum ... tüm klasörümü oraya koymak amacıyla
nopol

sftp, yerel ana klasöre girdiğimde ve dizini adıyla koymaya çalıştığımda şikayet etti. Ama cdyüklemek istediğim dizine girerek yaptım. Teşekkür ederim!
karimkorun

8

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: = create dosyası), dosya adı - (none, stdout) ile birlikte paketler ve ssh komutuyla target.org (bu bir IP de olabilir) komutunu alır. tırnak içinde yapılır, ki: cd to blah ve tar -xf (ayıklama dosyası) - yok, ad yok, sadece stdin.

Sanki bir paketi evde paketlerseniz, gönderiye götürür, sonra da paketi beklediğiniz ve açacağınız bir yere götürürsünüz.

Belki sadece sftp kullanan çok daha şık bir çözüm var.


Bir boru tarçok iyi bir çözümdür, ancak bunun için sshoturum açma desteği gerekir ( sftpbunun üzerine farklı bir protokol ssh). tardiğerlerinden farklı olarak, varsayılan olarak , özyinelemeli olarak çalışır, tüm özel dosyaları (FIFO, blok / karakter cihazları vb.) aktarır, UID / GID eşlemesini kaynaktan hedef sisteme çevirmeye çalışır ve geleneksel bir kısa komut satırına sahiptir. (Yine de bir istisna: "Unix alan soketleri" aktarılmıyor. Fakat bunlara kimin ihtiyacı var?)
Tino

Düğümler arasında sıkıştırmaya ihtiyaç duyduğumda pv, uzun aktarımlarda hızı izlemek için aracı da kullanabildiğimde bu yöntemi kullanıyorum
Felipe Alcacibar

2

Yafc kullanabilirsiniz (Yine de anot FTP / SFTP istemcisi). -rSeçenek çok iyi orada çalışıyor.


1

Scp ve sftp için çok güçlü bir alternatif olan rsync'i kullanabilirsiniz , özellikle kopyaları A makinesinden B makinesine güncellerken, değiştirilmemiş dosyaları kopyalamaz; Ayrıca, A makinesinden silinmiş B makinesindeki dosyaları da kaldırabilir (yalnızca elbette söylendiğinde).

Örneğin :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

-R seçeneği dosyaları tekrar tekrar kopyalamak içindir, -z aktarım sırasında sıkıştırmayı etkinleştirir ve -p kopyalama yaparken scp AFAIK yapmaz bir şeydir, dosya izinlerini (dosya oluşturma, düzenleme vb.) Korur. Daha birçok seçenek mümkündür; her zamanki gibi man sayfalarını okuyun.
Orijinal cevap Karolos


0

Uzak sunucuya ssh ile giriş yapın, kutunuza geri bağlanmak için sftp kullanın, ardından get -rdizinleri uzak sunucuya aktarmak için komutu kullanın. Get komutu, önceden oluşturulmuş bir dizini oluşturmadan, dizinleri yinelemeli olarak transfer etmenizi sağlar.

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

0

SFTP durumu:

Bu yapıyı ftp dosyasına kopyalamam 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

Arch Linux Wiki'den sftp paylaşımını sshfs kullanarak monte etmenin mümkün olduğunu öğrendim . Chroot ve hapis ile bir sftp sunucusu çalıştırıyorum ve sshfs çok iyi çalışıyor.

  1. Dağı: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. çıkartın: fusermount -u <your/local/mount/directory>
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.