Bisakah scp menyalin direktori secara rekursif?


573

Saat ini saya hanya dapat menyalin satu .tarfile. Tetapi bagaimana saya bisa menyalin direktori secara rekursif scp?

Jawaban:


937

Yup, gunakan -r:

scp -rp sourcedirectory user@dest:/path
  • -r berarti rekursif
  • -p mempertahankan waktu modifikasi, waktu akses, dan mode dari file asli.

Catatan: Ini menciptakan bagian sourcedirectorydalam /pathsehingga file akan masuk/path/sourcedirectory


9
Namun perlu diingat bahwa ini tidak akan mempertahankan symlink.
CpnCrunch

12
Perhatikan bahwa -pr(opsi dalam urutan terbalik) tidak akan menyalin folder, tetapi lebih baik isinya ke direktori target (tampaknya, urutan opsi penting).
pms

172

Meskipun jawaban sebelumnya secara teknis benar, Anda juga harus mempertimbangkan untuk menggunakannya rsync. rsyncmembandingkan data pada sisi pengirim dan penerima dengan mekanisme berbeda sehingga tidak perlu mengirim ulang data yang sudah dikirim sebelumnya.

Jika Anda akan menyalin sesuatu ke mesin jarak jauh lebih dari sekali, gunakan rsync. Sebenarnya, itu baik untuk digunakan rsyncsetiap kali karena memiliki lebih banyak kontrol untuk hal-hal seperti menyalin izin dan kepemilikan file dan mengecualikan file atau direktori tertentu. Secara umum:

$ rsync -av /local/dir/ server:/remote/dir/

akan menyinkronkan direktori lokal dengan direktori jarak jauh. Jika Anda menjalankannya untuk kedua kalinya dan isi direktori lokal tidak berubah, tidak ada data yang akan ditransfer - jauh lebih efisien daripada menjalankan scpdan menyalin semuanya setiap waktu.

Juga, rsyncmemungkinkan Anda untuk memulihkan dari transfer yang terganggu dengan sangat mudah, tidak seperti scp.

Akhirnya, versi modern rsyncsecara default melebihi ssh, jadi jika scpsudah berfungsi, rsyncseharusnya cukup menjadi pengganti drop-in.


1
Saya setuju rsynclebih efisien. Satu hal yang saat ini tidak dilakukan scpadalah memperbolehkan penyalinan antar host jarak jauh (setidaknya tanpa menjalankan klien rsync di salah satunya).
Cedric Knight

1
-av: v adalah untuk verbose, a untuk arsip dan merupakan jalan pintas ke -rlptgoD yang menyiratkan rekursif, menjaga tanggal dan tautan pemilik hak. Jika Anda hanya ingin menggunakan rekursif-r
pdem



6

Cara terbaik adalah menggunakan rsync di atas SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Opsi favorit saya adalah -Pazvessh --delete:

  • -a: mode arsip (termasuk banyak opsi umum standar, termasuk melestarikan symlink)
  • -z: kompres
  • -v: verbose: tampilkan file
  • -P: tunjukkan proses saat file selesai / file tersisa
  • -e ssh: lakukan rsync dalam protokol ssh
  • --delete: hapus file di tujuan yang tidak lagi di sumbernya

Semua versi rsyncyang saya gunakan akan digunakan sshsecara default, jadi -esshtidak mungkin diperlukan. Dan pilihan perintah yang digunakan untuk terhubung ke host jarak jauh benar-benar tidak terkait dengan menyalin secara rekursif.
kasperd

4

Setelah mencari bendera salinan rekursif, dan berhasil menggunakannya berkat posting ini, saya ingin memposting hanya saran.

Jika masalahnya Anda menyalin (secara rekursif) direktori. Mungkin jika file yang dikirim terkompresi Anda dapat menghemat waktu dalam transfer

Apa yang saya lakukan pada akhirnya adalah:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Semoga ini membantu


ekstensi file harus berupa .tar.gzatau .tgzkarena file tersebut adalah arsip tar yang di-gzip (karena -zflag digunakan).
anthonybell

2

Anda dapat menyalin direktori secara rekursif ke arsip terkompresi dengan perintah sederhana ini:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Misalnya, untuk menyalin isi /var/logdari domain.comke ~/logs.tgzAnda menjalankan:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

Anda juga dapat mengekstrak file pada sistem target dengan menggunakan pipa. Perintah ini akan menyalin konten /var/logat domain.comke ~/destination/logdi sistem Anda:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Meskipun untuk mencerminkan direktori, Anda mungkin harus menggunakan rsync...


1

Jika Anda lebih suka meneruskan kata sandi pengguna sebagai parameter daripada memasukkannya secara interaktif, Anda dapat menggunakan sshpass( sudo apt-get install -y sshpass).

Contoh:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

Anda dapat menggunakan opsi -r dengan perintah scp untuk menyalin direktori secara rekursif pada sistem apa pun. Jika Anda membutuhkan yang lain, lihat tutorial perintah scp . Opsi -r adalah singkatan dari operasi rekursif di sebagian besar perintah Linux.


Meskipun benar, -ropsi telah disarankan tahun lalu dan merupakan jawaban yang diterima.
RalfFriedl

-3

Opsi lain (kemungkinan lebih baik untuk penggunaan berulang) adalah menggunakan NFS - lihat nfs-kernel-server dan cara mensetup share NFS.


2
Ini omong kosong. Ada kasus tak berujung di mana Anda akan menggunakan scptetapi NFS bukan opsi.
Sven
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.