Saya ingin menyalin file dari / ke server jauh di direktori yang berbeda. Sebagai contoh, saya ingin menjalankan 4 perintah ini sekaligus.
scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt
Apa cara termudah untuk melakukan itu?
rsync
, mungkin dapat membantu Anda dalam kasus ini dan banyak kasus mendatang. Kemudian, untuk menghindari memasukkan kata sandi (apalagi beberapa kali), Anda harus membaca tentangssh
kunci publik / pribadi, misalnya digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2scp [email protected]:'/etc/openvpn/ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key /etc/openvpn/client/ta.key' ./
.Jawaban:
Salin beberapa file dari jarak jauh ke lokal:
Salin beberapa file dari lokal ke jarak jauh:
Salin beberapa file dari jarak jauh ke jarak jauh:
Sumber: http://www.hypexr.org/linux_scp_help.php
sumber
~
atau./
hanya.\{a,b,c\}
akan mentransfer file dalam satu koneksi / batch (karena mereka akan diperluas pada host jarak jauh), sementara menggunakan{a,b,c}
akan membuka banyak koneksi, dan overhead adalah cukup terlihat ketika mentransfer banyak fileDari lokal ke server:
scp file1.txt file2.sh [email protected]:~/pathtoupload
Dari server ke lokal:
scp -T [email protected]:"file1.txt file2.txt" "~/yourpathtocopy"
sumber
-T
opsi untuk menekan kesalahan itu.Anda dapat menyalin seluruh direktori dengan menggunakan
-r
sakelar sehingga jika Anda dapat mengisolasi file Anda ke direktori sendiri, Anda dapat menyalin semuanya sekaligus.jadi misalnya
Atau jika jumlahnya hanya sedikit, Anda dapat menggunakan:
sumber
Seperti yang disebutkan Jiri, Anda dapat menggunakannya
scp -r user@host:/some/remote/path /some/local/path
untuk menyalin file secara rekursif. Ini mengasumsikan bahwa ada satu direktori yang berisi semua file yang ingin Anda transfer (dan tidak ada yang lain).Namun, SFTP memberikan alternatif jika Anda ingin mentransfer file dari beberapa direktori yang berbeda, dan tujuannya tidak sama:
Ini menggunakan sintaks "di sini doc" untuk menentukan urutan perintah input SFTP. Sebagai alternatif, Anda bisa memasukkan perintah SFTP ke file teks dan mengeksekusi
sftp user@host -b batchFile.txt
sumber
scp
manual terlalu lama mencoba untuk menemukan fitur ini, dan saya kira scp tidak memilikinya./home/vagrant/Code/
bukan~/Code/
.- r
direktoriJawaban dengan
{file1,file2,file3}
hanya berfungsi dengan bash (pada jarak jauh atau lokal)Cara sebenarnya adalah:
sumber
{…, …, …}
karya di banyak cangkang, tidak hanya di Bash. Namun ini bekerja di shell apa pun jadi jelas lebih baik.Setelah bermain dengan scp untuk sementara waktu saya telah menemukan solusi paling kuat:
(Waspadalah terhadap tanda kutip tunggal dan ganda)
Lokal ke jarak jauh:
Jauh ke lokal:
Perhatikan bahwa apa pun setelah "HOST:" akan dikirim ke remote dan diurai di sana. Jadi kita harus memastikan mereka tidak diproses oleh shell lokal. Itulah sebabnya tanda kutip tunggal masuk. Tanda kutip ganda digunakan untuk menangani spasi dalam nama file.
Jika semua file ada di direktori yang sama, kita dapat menggunakan * untuk mencocokkan semuanya, seperti
Dibandingkan dengan menggunakan sintaks "{}" yang hanya didukung oleh beberapa shell, yang ini bersifat universal
sumber
{}
sintaks membuat lebih mudah untuk menyalin beberapa file dari direktori yang sama, apakah ada cara untuk melakukan hal ini denganscp -r
sehingga"FILE1" "FILE2"
dapat path relatif dan path tidak mutlak untuk file?Cara paling sederhana adalah
Jadi {..} daftar dapat menyertakan direktori (A, B dan C di sini adalah direktori; "1.txt" dan "2.txt" adalah nama file dalam direktori tersebut).
Meskipun itu akan menyalin keempat file ini ke dalam satu direktori lokal - tidak yakin apakah itu yang Anda inginkan.
Dalam kasus di atas Anda akan berakhir file jarak jauh A / 1.txt, A / 2.txt, B / 3.txt dan C / 4.txt disalin ke direktori lokal tunggal, dengan nama file ./1.txt, ./2.txt, ./3.txt dan ./4.txt
sumber
sh
.local$ scp -r remote:{A/1.txt,A/2.txt,B/3.txt,C/4.txt,D,F} ./
Masalah : Menyalin beberapa direktori dari server jarak jauh ke mesin lokal menggunakan perintah SCP tunggal dan mempertahankan setiap direktori seperti yang ada di server jarak jauh.
Solusi : SCP dapat melakukan ini dengan mudah. Ini memecahkan masalah yang mengganggu memasukkan kata sandi beberapa kali saat menggunakan SCP dengan banyak folder. Akibatnya, ini juga menghemat banyak waktu!
misalnya
PS: Termotivasi oleh jawaban hebat ini: scp atau sftp menyalin beberapa file dengan satu perintah
Berdasarkan komentar, ini juga berfungsi dengan baik di Git Bash pada Windows
sumber
Salin beberapa direktori:
sumber
Anda bisa melakukan ini:
Ini akan mengunduh semua nama file yang terdaftar ke direktori lokal apa pun yang Anda kunjungi.
Pastikan untuk tidak menempatkan spasi di antara setiap nama file hanya menggunakan koma
,
.sumber
/path/to/files/\\{file1.ext,file2.ext,file3.ext\\}
olah file memiliki ekstensi yang berbeda. Catatan untuk orang-orang PowerShell (sekarang MS telah bergabung dengan pesta) yang perlu Anda gunakan`
untuk melarikan diri sebagai gantinya:/path/to/files/`{file1.ext,file2.ext,file3.ext`}
CATATAN: Saya meminta maaf sebelumnya karena hanya menjawab sebagian dari pertanyaan di atas. Namun, saya menemukan perintah ini berguna untuk kebutuhan unix saya saat ini.
Mengunggah file tertentu dari mesin lokal ke mesin jarak jauh:
~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/
Mengunggah seluruh direktori dari mesin lokal ke mesin jarak jauh:
~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/
Mengunduh seluruh direktori dari mesin jarak jauh ke mesin lokal:
~/Desktop$ scp -r [email protected]:Public/web/ Desktop/
sumber
Dalam kasus saya, saya dibatasi hanya menggunakan perintah sftp.
Jadi, saya harus menggunakan batchfile dengan sftp. Saya membuat skrip seperti berikut ini. Ini mengasumsikan Anda bekerja di direktori / tmp, dan Anda ingin meletakkan file di destdir_on_remote_system pada sistem remote. Ini juga hanya berfungsi dengan login non-aktif. Anda perlu mengatur kunci publik / pribadi sehingga Anda dapat masuk tanpa memasukkan kata sandi. Ubah sesuai kebutuhan.
sumber
perintah Anda berfungsi dengan baik tetapi, saya juga ingin mengubah nama file saat mengirim lokal ke jarak jauh. Saya menulis sebuah perintah: - sshpass -p kata sandi scp /path/to/file.txt root @ hostname: /path/newfile.txt
Tapi itu memberikan kesalahan bahwa /path/newfile.txt: Tidak ada file atau direktori yang ditemukan tolong bantu saya dalam situasi ini
sumber
hostname:/path/
benar-benar ada dan dapat diakses.scp menggunakan ssh untuk transfer data dengan otentikasi yang sama dan menyediakan keamanan yang sama dengan ssh.
Praktik terbaik di sini adalah menerapkan "KUNCI SSH DAN OTENTIKASI KUNCI PUBLIK". Dengan ini, Anda dapat menulis skrip tanpa khawatir tentang otentikasi. Sederhana seperti itu.
Lihat APA ITU SSH-KEYGEN
sumber
Dalam kasus khusus di mana semua file memiliki ekstensi yang sama tetapi dengan akhiran yang berbeda (katakanlah jumlah file log) Anda menggunakan yang berikut ini:
Ini akan menyalin semua file bernama some_log_file dari folder yang diberikan dalam remote, yaitu- some_log_file.1, some_log_file.2, some_log_file.3 ....
sumber
sumber
-r
opsi untukscp
. Dan Anda dapat mempertahankan atribut lainnya (seperti cap waktu) dengan-p
opsi.