Apakah mungkin menggunakan perintah Unix untuk cp file di subdirektori saya ke komputer jarak jauh melalui SSH?

17

Saya memiliki serangkaian file perangkat lunak yang diunduh ke subdirektori ~/Downloadsdi komputer pribadi saya. Saya juga menggunakan bash untuk menghubungkan dari jarak jauh ke komputer menggunakan ssh.

Apakah mungkin mentransfer file ini sshke komputer jarak jauh?

ShanZhengYang
sumber
Pertanyaannya mengacu pada file tunggal ( this file) dan beberapa file ( a series of software files), solusi terbaik tergantung pada apakah Anda memiliki satu file atau beberapa file.
user2768

Jawaban:

42

Anda mungkin ingin menggunakan scpuntuk tujuan ini. Ini adalah cara aman untuk mentransfer file menggunakan protokol SSH.

Misalnya, untuk menyalin file yang dinamai yourfile.txtdari ~/Downloadske komputer jarak jauh, gunakan:

scp ~/Downloads/yourfile.txt [email protected]:/some/remote/directory

Anda dapat melihat lebih banyak contoh di sini .

ARG
sumber
5
Saya pikir rsyncmungkin bekerja juga, sekarang saya memikirkannya
ShanZhengYang
1
rsync jauh dari rumit hanya untuk satu atau banyak file ...
Paebbels
14
@ Paebbels Sebaliknya, ganti di scpatas dengan rsyncdan itu akan berfungsi dengan baik.
8bittree
Saya cenderung menggunakan rsyncuntuk semuanya, bahkan file tunggal, karena "hanya berfungsi" dalam kasus-kasus sederhana dan bisa jauh lebih efisien dalam kasus lain. Jika menggunakan salah satu scpatau rsyncpada sesuatu yang belum dikompresi dan / atau dienkripsi, ingatlah untuk mengaktifkan opsi kompresi pada ( -Cuntuk scp, -zatau --compressuntuk rsync). Sebenarnya saya menyalakannya dengan kebiasaan - sangat jarang Anda akan menemukan keadaan di mana ia memperlambat segalanya (mungkin jika Anda menggunakan perangkat berdaya rendah lambat dengan daya CPI terbatas seperti rPi).
David Spillett
37

Meskipun scp jelas alat yang tepat untuk ini, jika karena alasan tertentu Anda tidak dapat menggunakannya Anda dapat melakukan sesuatu seperti berikut dari mesin lokal Anda untuk menyalin, katakanlah, struktur direktori ke mesin jarak jauh:

tar -c . | ssh <remote> tar -x

Ini akan tarmenjadi direktori saat ini pada mesin lokal, dan menulisnyatar untuk stdoutyang kemudian akan disalurkan ke sshperintah di mana ia akan menjalankan perintah remote untuk untar file dibaca daristdin

Diedit untuk mencerminkan komentar Dietrich Epp tentang -f -menjadi default pada kedua ciptaan dan ekstraksi, jadi tidak perlu untuk menentukan secara eksplisit.

Eric Renouf
sumber
7
Anda mungkin ingin menambahkan -C basedirargumen taruntuk mengekstrak di tempat lain selain direktori home Anda jika Anda melakukan ini.
Dougal
17

Jika Anda ingin melakukan ini pada lebih dari kesempatan yang jarang, saya sarankan memasang sistem file jarak jauh dengan sshfsjika Anda menggunakan Unix-like yang mendukung FUSE (Linux, * BSD, Mac OS X). Buat direktori di bawah direktori home Anda, katakanlah, bernama ~ / remote-server:

    $ mkdir ~/remote-server

Kemudian pasang sistem file jarak jauh dengan sshfs. Ganti "yourserver.com" dengan nama host mesin jarak jauh Anda, dan "nama direktori jarak jauh" dengan direktori yang Anda gunakan pada sistem jarak jauh.

    $ sudo sshfs [email protected]:/name/of/remote/directory ~/remote-server/

Setelah ini selesai, direktori jarak jauh adalah bagian dari sistem file Anda dan Anda dapat menggunakan semua alat normal di dalamnya, termasuk cp:

    $ cp ~/Downloads/your-files ~/remote-server

Jika Anda belum sshfsmenginstal, Anda harus dapat menginstalnya di komputer menggunakan manajer paket Anda (lihat paket yang diberi nama sshfsatau fuse-sshfs). Untuk informasi lebih lanjut, Anda dapat membaca tutorial online .

Omong-omong, ini adalah cara favorit saya mengelola file di server jauh. Saya biasanya menyimpan satu server produksi dan dua server pengembangan yang terpasang dengan cara ini dan menggunakan alur kerja penelusuran file normal saya dengannya.

Benjamin Staton
sumber
Dan kemudian periksa opsi sshfs mana yang akan membantu Anda menyelesaikan pekerjaan Anda dengan baik. Misalnya memulai dengan pemetaan ID pengguna / grup -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otherdan -Cuntuk kompresi jika bandwidth buruk. Segera setelah itu berfungsi dengan baik, saya pribadi menambahkan alias untuk perintah untuk dengan cepat me-mount sistem file yang jauh di atas ssh. @Benjamin_Staton Saya tidak akan menggunakan sudo atau root di sini, setidaknya tanpa pemetaan pengguna / grup yang tepat.
tuk0z
9

Pertama kali, tidak ada perbedaan nyata antara scp(salin ssh) dan rsync.

Berjalan selanjutnya akan mendapat manfaat dengan rsync tidak menyalin file yang sudah ada.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a untuk semua file
  • -v untuk verbose
  • -H untuk "cari tahu symlink dan lakukan hal yang benar"
  • lalu jalur sumber dan tujuan. Anda dapat menggunakan wildcard di sumbernya, atau hanya menyinkronkan seluruh direktori.

Bendera berguna lainnya termasuk:

  • --delete untuk menghapus file di tujuan yang tidak lagi ada pada sumbernya.
  • --dry-run untuk pengujian - sangat berguna saat dikombinasikan dengan --delete.

Ini akan menggunakan sshkunci untuk melakukan login tanpa kata sandi juga, jika Anda sudah mengaturnya.

Di akhir proses, rsyncakan memberi tahu Anda berapa kali lebih cepat dari selesai menyalin lagi.

Criggie
sumber
1
-Hsebenarnya untuk tautan keras, ini menghentikan konten yang sama yang dikirim dua kali atau lebih ketika dihubungkan ke lebih dari satu tempat di struktur direktori sumber (tetapi dapat membuat prosesnya kurang efisien untuk struktur direktori besar). itu tidak berpengaruh pada tautan simbolik, tetapi beberapa opsi yang disertakan oleh -a/ --archivememang memengaruhi cara symlinks diproses.
David Spillett
4

Untuk menambah jawaban di atas. Kadang-kadang saya tidak begitu yakin tentang jalur jarak jauh. Dalam kasus ini saya gunakan sftpuntuk pertama menavigasi ke lokasi yang diperlukan, kemudian menggunakan get atau put untuk benar-benar mengunduh atau mengunggah file.

Jika Anda juga ingin menyimpan sesuatu yang selalu disinkronkan dan bahkan ingin mengeksekusi secara lokal beberapa file yang terletak di mesin jarak jauh, sshfsberfungsi dengan baik.

aragaer
sumber
-1

Saya melakukan sesuatu yang sangat mirip dengan ssh. Saya membuat alat membangun kustom untuk Visual Studio dan pada dasarnya saya memiliki VS menjalankan perintah ssh yang menyalin kode saya ke komputer target dan kemudian mengkompilasinya pada komputer target itu.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

Perhatikan penggunaan tanda kutip tunggal dan semi-kolon. Yang pertama mengenkapsulasi perintah Anda ke hostB melalui ssh dan yang terakhir memungkinkan Anda untuk menjalankan beberapa perintah sistem hostB dalam satu perintah ssh dari hostA.

Untuk membuat ini bekerja, Anda harus mengatur kunci ssh pada mesin mulai Anda sehingga Anda bisa menjadi userA @ hostA dan login ke hostB sebagai userB. Proses untuk membuat kunci ssh publik untuk userA @ hostA didokumentasikan dengan baik. Jika Anda tidak membuat kunci publik pada hostA untuk userA, dan menyalin kunci itu ke hostB sebagai userB, maka Anda akan dipaksa untuk memasukkan kata sandi Anda setiap saat - yang merusak kegembiraan otomatisasi.

Andrew
sumber
Adakah yang bisa downvoted memberikan komentar mengapa mereka downvoted? Suara turun tidak ada artinya tanpa umpan balik informatif. Terima kasih. Saya telah menjawab pertanyaan khusus OP dengan jawaban yang berhubungan langsung. Saya tidak memperkenalkan teknologi baru atau menyarankan rute alternatif. Mengapa? mungkin OP tidak ingin menggunakan rute alternatif.
Andrew