Mengunggah direktori dengan sftp?

97

Saya mengalami masalah dalam mengunggah direktori (yang berisi direktori lain sedalam beberapa level) oleh sftp. Saya sadar saya bisa mengatasi ini dengan gzipping, tapi saya tidak mengerti mengapa itu perlu.

Lagi pula, saya mencoba

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"

Saya pikir pesan kesalahan terakhir benar-benar bodoh. Jadi direktori itu tidak ada? Mengapa tidak membuat direktori?

Apakah ada masalah seputar sftp ini, atau haruskah saya menggunakan scp?

Earlz
sumber

Jawaban:

68

DIPERBAIKI : Saya awalnya mengklaim secara salah bahwa OpenSSH tidak mendukung put -r. Memang, tapi itu dengan cara yang sangat aneh. Tampaknya mengharapkan direktori tujuan sudah ada, dengan nama yang sama dengan direktori sumber.

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

Apa yang aneh adalah bahwa ini bahkan berlaku jika Anda memberikan nama yang berbeda untuk tujuan:

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

Untuk rekursif yang diimplementasikan dengan lebih baik put, Anda bisa menggunakan psftpalat baris perintah Putty sebagai gantinya. Ada dalam putty-toolspaket di bawah Debian (dan kemungkinan besar Ubuntu).

Bergantian, Filezilla akan melakukan apa yang Anda inginkan, jika Anda ingin menggunakan GUI.

Jander
sumber
FYI: sftpmemungkinkan put -rdari OpenSSH 5.4
Tino
3
Terima kasih - saya sudah mengoreksi jawaban saya. Sudah waktunya, ya? ;-P
Jander
128

Saya tidak tahu mengapa sftp melakukan ini, tetapi Anda hanya dapat menyalin rekursif jika direktori tujuan sudah ada. Jadi lakukan ini ...

sftp> mkdir bin
sftp> put -r bin
Bung Berguna
sumber
1
-rmembutuhkan OpenSSH 5.4 atau lebih tinggi
Tino
22

Anda mungkin tertarik untuk menggunakannya rsync. Perintah untuk itu adalah

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

Ini akan menyalin semua bin/dan menempatkannya di server jauh di /home/earlz/blah/bin/. Sebagai manfaat tambahan, pertama-tama akan memeriksa apakah file di sisi jarak jauh tidak berubah, dan jika tidak, itu tidak akan mengirim ulang. Selain itu, Anda dapat menambahkan opsi -z dan itu akan memampatkannya untuk Anda.

Shawn J. Goff
sumber
Awsome! Sangat sederhana!
Asken
3
Harap dicatat bahwa itu sftpadalah perintah dan protokol . rsynctidak mendukung sftp-protocol.
Tino
9

lcd: folder lokal Anda (dengan subfolder)

cd: folder jarak jauh Anda

put -r .

eliseu
sumber
sebenarnya, saya pikir ini adalah jawaban yang paling benar ... untuk tujuan meletakkan seluruh folder saya di sana
nopole
sftp mengeluh ketika saya masuk ke folder induk lokal dan mencoba untuk menempatkan direktori dengan nama. Tapi cdke dalam direktori saya ingin mengunggah melakukannya. Terima kasih!
karimkorun
8

Bolehkah saya menyarankan jawaban yang agak rumit, tanpa zipping, tetapi termasuk tar?

Kita mulai:

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

Ini akan mengemas direktori ./bin dengan tar (-cf: = buat file), nama file - (tidak ada, stdout) dan pipa melalui perintah ssh ke target.org (yang mungkin juga merupakan IP) di mana perintah dalam tanda kutip dilakukan, yaitu: cd to bla, dan tar -xf (ekstrak file) - tidak ada, tidak ada nama, hanya stdin.

Seolah-olah Anda mengemas paket di rumah, membawanya ke pos, lalu pergi bekerja, di mana Anda mengharapkan paket itu dan membukanya.

Mungkin ada solusi yang jauh lebih elegan yang hanya menggunakan sftp.

Pengguna tidak diketahui
sumber
Perpipaan taradalah solusi yang sangat bagus, namun ini membutuhkan sshdukungan login ( sftpprotokol berbeda di atas ssh). tar, tidak seperti yang lain, secara default , berjalan secara rekursif, mentransfer semua file khusus (FIFO, perangkat blok / karakter, dll.), mencoba menerjemahkan pemetaan UID / GID dari sumber ke sistem target dan memiliki perintah pendek tradisional. (Satu pengecualian: "soket domain Unix" tidak ditransfer. Tapi siapa yang butuh itu?)
Tino
Saya menggunakan metode ini ketika saya perlu kompresi antar node juga, Anda dapat menggunakan pvalat ini untuk menonton kecepatan dalam transfer panjang
Felipe Alcacibar
2

Anda dapat menggunakan yafc (Namun klien FTP / SFTP anoter). The -rpilihan bekerja di sana sangat baik.

Dmitry Shpakov
sumber
1

Anda dapat menggunakan rsync , yang merupakan alternatif yang sangat kuat untuk scp dan sftp, terutama saat memperbarui salinan dari mesin A ke mesin B, karena tidak menyalin file yang belum diubah; itu juga dapat menghapus file dari mesin B yang telah dihapus dari mesin A (hanya jika disuruh tentu saja).

sebagai contoh :

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

Opsi -r adalah untuk menyalin file secara rekursif, -z memungkinkan kompresi selama transfer, dan -p mempertahankan izin file (pembuatan file, edit, dll.) Saat menyalin, yang merupakan sesuatu yang scp tidak lakukan AFAIK. Banyak lagi opsi yang dimungkinkan; seperti biasa, baca halaman manual.
Jawaban asli oleh Karolos

Sherlock
sumber
0

Login ke server jauh dengan ssh, gunakan sftp untuk menghubungkan kembali ke kotak Anda, kemudian gunakan get -rperintah untuk mentransfer direktori ke server jauh. Perintah get memungkinkan Anda untuk mentransfer direktori secara rekursif tanpa direktori yang sudah dibuat.

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

Kasus SFTP:

Saya perlu menyalin struktur itu di ftp saya:

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

Itu memecahkan masalah saya:

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

Saya baru belajar dari Arch Linux Wiki bahwa adalah mungkin untuk me-mount sftp-share menggunakan sshfs. Saya menjalankan sftp-server dengan chroot dan jail dan sshfs bekerja dengan sangat baik.

  1. Meningkat: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Lepas dari: fusermount -u <your/local/mount/directory>
saltani
sumber