Script shell dari mesin lokal untuk menjalankan perintah di mesin jarak jauh, kemudian lanjutkan ke mesin lokal

10

Masalahnya adalah ini: Saya ingin menyalin file dari mesin jarak jauh.

Saya mencari cara untuk menulis skrip shell yang akan terhubung ke mesin jarak jauh, mendapatkan lokasi file yang disimpan, setelah saya mendapatkan lokasi putuskan sambungan dari server jarak jauh dan menggunakan scp dari dalam mesin lokal dengan lokasi yang diperoleh untuk salin file.

Secara khusus, saya ingin tahu bagaimana dari sebuah skrip, saya akan terhubung ke mesin jarak jauh, melakukan tugas-tugas pada mesin itu. Putuskan sambungan, dan lanjutkan eksekusi secara lokal.

GSN
sumber

Jawaban:

15

Solusi 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Ini berfungsi dengan menghubungkan ke mesin jarak jauh, menjalankan beberapa perintah, dan menyalin output ke variabel pada mesin lokal Anda. Katakan, gema jalur file dari jarak jauh, ambil secara lokal.

Solusi 2:

ssh user@host "determine_path; cat filename" >local_filename

Ini berfungsi dengan menemukan dan mengeluarkan file secara langsung dari jarak jauh, dan mengarahkannya ke file secara lokal. Melewati scp. Ini mengharuskan langkah-langkah sebelum "cat" tidak memiliki keluaran (yang dapat Anda selesaikan dengan &> / dev / null).

Mark Griffin
sumber
1
+1 untuk menunjukkan cara mengatasi seluruh masalah dengan satu koneksi, bukan ssh + scp terpisah.
Peter Cordes
Semua jawaban sangat membantu tetapi yang satu ini membahas masalah saya paling khusus
gnsr
20

Anda dapat menulis skrip dalam format berikut:

command1
command2
...
ssh user@machine command3
...
command4
command5

Anda perlu mengatur kunci SSH untuk command3dieksekusi tanpa meminta kata sandi.

Khaled
sumber
2
Perlu dicatat bahwa ini akan secara sinkron. Saat ssh user@remote command3sedang berjalan, command4tidak dapat memulai
aaaaa kata mengembalikan Monica
3
@aaaaaa kecuali Anda melakukannyassh user@machine command3 &
Isaac
3
@Isaac ya, maksud saya adalah bahwa keduanya bisa menjadi perilaku yang diinginkan, tetapi itu harus menjadi keputusan yang sadar
aaaaa mengatakan mengembalikan Monica
2

Saya berasumsi Anda sudah memiliki beberapa ide tentang bagaimana Anda akan mengidentifikasi file yang ingin Anda salin, dan bahwa Anda dapat, atau sudah memiliki, menulis skrip atau serangkaian perintah yang akan berjalan pada mesin jarak jauh yang melakukan identifikasi ini .

Selanjutnya saya juga akan menganggap bahwa perintah-perintah itu mencetak pada output standar path lengkap ke file, atau path relatif ke file, relatif ke direktori home dari pengguna SSH yang digunakan untuk copy. Dalam contoh saya, nama skripnya adalah "getfilepath.sh", meskipun tidak harus berupa skrip shell, itu bisa berupa beberapa perintah yang dapat dieksekusi atau bahkan serangkaian perintah lainnya.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

Dalam kode di atas, notasi "$ ()" adalah cara menangkap keluaran standar dari suatu perintah sebagai variabel shell. Ini cukup standar, tetapi jika Anda menggunakan shell yang tidak memahaminya, Anda dapat mengelilingi perintah dengan "back-ticks", yang merupakan tanda aksen di sebelah kiri tombol 1 pada kebanyakan keyboard AS.

Jeremy Impson
sumber
0

mungkin dimungkinkan untuk memicu Tugas terjadwal pada mesin jarak jauh yang melakukan semua pekerjaan.

Ini akan mencegah Anda dari terhubung ke mesin jarak jauh saat Anda mencari lokasi file yang ingin Anda salin.

Saya sedang melakukan ini:

comand line memicu tugas terjadwal yang mengeksekusi skrip batch dalam kasus saya.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

salam Hormat

Denyo
sumber