Menggunakan sftp untuk Transfer Direktori?

50

Ketika saya mencoba menggunakan sftp untuk mentransfer direktori yang berisi file, saya mendapatkan pesan kesalahan:

skipping non-regular file directory_name

Direktori ini berisi beberapa file dan dua subdirektori.

Apa yang saya lakukan salah?

Haziz
sumber

Jawaban:

49

sftp, suka cpdan scp, mengharuskan ketika Anda menyalin folder (dan isinya, jelas), Anda harus secara eksplisit mengatakan bahwa Anda ingin mentransfer folder secara rekursif dengan -ropsi.

Jadi, tambahkan -rke perintah.

Kevin
sumber
2
-r setelah perintah put? Saya menerima pesan kesalahan "put: Flag -r tidak valid" jika saya melakukannya. Menambahkannya ke perintah sftp asli juga tidak berfungsi.
haziz
5
Tambahkan -rke sftpperintah saat Anda terhubung. sftp -r user@host
Kevin
1
@ Kevin Saya mendapatkan kesalahan berikut "sftp: opsi tidak diketahui --r"
Amatya
2
Hati-hati bahwa ada bug yang cukup lama berdiri di SFTP OpenSSH ini: ketika menyalin secara rekursif direktori ke server jauh, direktori itu sendiri harus sudah ada pada server target jika transfer akan gagal dengan pesan kesalahan non-eksplisit: Couldn't canonicalise: No such file or directory.
WhiteWinterWolf
5
harus seperti:# sftp user@remote-host #> get -r remote-folder
hbinduni
21

Saya hanya bisa menyarankan, Anda gunakan rsync. Ini agak standar industri, ketika memindahkan file melalui koneksi yang aman.

rsync -alPvz ./source_dir server.com:destination_dir

Itu yang saya gunakan selama bertahun-tahun sekarang.

( -aopsi menangani hal-hal seperti rekursi direktori)

polemon
sumber
3
Sedikit klarifikasi pada parameter yang disebutkan: -a= rekursi + menyimpan tautan simbolis, izin, waktu modifikasi, pemilik, grup, file khusus dan file perangkat (yang terakhir memerlukan hak pengguna super); -l= simpan tautan simbolik (sudah termasuk dalam -a); -P= menunjukkan kemajuan selama transfer + menjaga file yang ditransfer sebagian; -v= mode verbose (namun tampaknya wajib saat digunakan -Puntuk menghindari kesalahan aneh (bug?) protocol version mismatch); -z= memungkinkan kompresi data yang ditransfer.
WhiteWinterWolf
@WhiteWinterWolf tampaknya tergantung pada versi apakah -lswitch harus digunakan atau tidak. Saya ingat versi yang lebih lama tidak termasuk -ldalam -a.
polemon
5

Anda mungkin juga bisa menggunakan penggunaan scp. Format umum adalah

scp -rp sourceDirName username@server:destDirName

scpberarti "salinan aman". Bendera adalah

  • -r berulang ke subdirektori
  • -p Pertahankan waktu modifikasi

Saya percaya barang-barang lainnya cukup jelas

Bina Ramamurthy
sumber
dan scp -rp -P <port> .... saat menggunakan port non-standar
Pancho
4

Ini bekerja untuk saya:

1) terhubung via sftpke host jarak jauh

2) ubah ke direktori jarak jauh yang ingin Anda salin. (Contoh: cd Music)

3) ubah ke direktori lokal yang ingin Anda salin. (Contoh: lcd Desktop)

4) Masalah perintah ini: get -r *

Don Karon
sumber
4

Jika rsyncbukan merupakan pilihan, saya akan merekomendasikan selanjutnya lftp:

lftp sftp://[email protected]/path/path/

Kemudian gunakan mirrorperintah untuk mengunggah secara rekursif, seperti ini:

mirror -R

(Perhatikan bahwa rekursi adalah default. Ini -Runtuk membalikkan - untuk membuat unggahan perintah mirror alih-alih mengunduh. Coba tambahkan --dry-rununtuk melakukan uji coba untuk memastikan itu melakukan apa yang Anda harapkan.)

Atau untuk mengunggah tanpa rekursi:

mirror --no-recursion

Anda harus cdmasuk ke direktori yang ingin Anda mirror. Bagus sekali!

Banago
sumber
2

Jika Anda bisa, gunakan sshfs . Ini adalah sistem file FUSE , tersedia di sebagian besar Unix modern, dan berfungsi dengan server SFTP apa pun. Ini adalah sistem file jarak jauh: ini memungkinkan Anda untuk memanipulasi file jarak jauh (melalui protokol SFTP) dengan utilitas yang biasa.

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point
Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Ini agak kludge tapi yang berhasil bagi saya adalah:

  1. Gunakan sshuntuk masuk ke mesin jarak jauh
  2. Gunakan sftpdari mesin jarak jauh ke mesin lokal Anda
  3. Kemudian gunakan getperintah dengan -ropsi untuk memindahkan direktori dan semua file-nya.
Matthew Greene
sumber
1
dapatkan jangan bekerja dengan -rsftp> get -r data /opt/bin get: Invalid flag -r
Skynet
0

Jika pertanyaan Anda sebenarnya 'bagaimana cara menggunakan sftp untuk mentransfer direktori', maka

 sftp -r user@server

Tetapi jika Anda mentransfer direktori, saya mungkin menyarankan dua opsi yang lebih baik, tergantung pada kebutuhan Anda. sftpmembutuhkan login ke server jauh dalam prompt perintah seperti ssh, tetapi jika semua yang Anda inginkan adalah file, ada cara yang lebih mudah dan lebih cepat.

Scp

Untuk transfer satu kali, untuk mengunggah, coba:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

Rsync

Jika Anda berencana menyinkronkan direktori secara teratur, menggunakan rsync lebih masuk akal. Ia melakukan delta di antara dua direktori, menghemat waktu transfer dan data melalui kabel.

rsync -r -a -v -e ssh --delete source_dir user@server:dest

Berikut adalah daftar beberapa opsi rsync yang paling umum: ( diambil dari sini )

  • --delete - hapus file yang tidak ada pada pengirim (sistem)
  • -v - verbose (-vv akan memberikan informasi lebih rinci)
  • -e "opsi ssh" - tentukan ssh sebagai shell jarak jauh
  • -a - mode arsip - mempertahankan izin (pemilik, grup), waktu, tautan simbolik, dan perangkat
  • -r - berulang ke direktori
  • -z - kompres data file selama transfer
  • --exclude 'foldername' - mengecualikan folder yang sesuai dari transfer
  • -P - menunjukkan kemajuan selama transfer

Semoga itu bisa membantu!

Dan Williams
sumber
0

Anda bisa mendapatkan dari server ke jalur lokal Anda dengan

scp -rp user@server:directoryname(full path) .
pengguna368621
sumber
Apakah ini menambahkan informasi baru ke jawaban lain yang sudah diposting?
41754
Ini tampaknya sebagian besar sama dengan Menggunakan sftp untuk Transfer Direktori?
Kusalananda