Pertanyaan Bagaimana cara menggunakan SSH untuk menjalankan skrip shell di mesin jarak jauh?


Saya harus menjalankan skrip shell (windows / Linux) pada mesin remote.

Saya memiliki SSH yang dikonfigurasikan pada mesin A dan B. Skrip saya ada di mesin A yang akan menjalankan beberapa kode saya pada mesin jarak jauh, mesin B.

Komputer lokal dan remote dapat berupa sistem berbasis Windows atau Unix.

Apakah ada cara untuk menjalankan ini menggunakan plink / ssh?


1010
2017-11-20 11:44


asal


Jawaban:


Jika Mesin A adalah kotak Windows, Anda dapat menggunakan Plink (bagian dari Dempul) dengan parameter -m, dan itu akan menjalankan skrip lokal di server jauh.

plink root@MachineB -m local_script.sh

Jika Mesin A adalah sistem berbasis Unix, Anda dapat menggunakan:

ssh root@MachineB 'bash -s' < local_script.sh

Anda tidak perlu menyalin skrip ke server jauh untuk menjalankannya.


1025
2018-04-28 20:41



Ini adalah pertanyaan lama, dan jawaban Jason berfungsi dengan baik, tetapi saya ingin menambahkan ini:

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

Ini juga dapat digunakan dengan su dan perintah yang memerlukan input pengguna. (perhatikan ' melarikan diri dari heredoc)

Edit: Karena jawaban ini terus mendapatkan sedikit traffic, saya akan menambahkan lebih banyak info untuk penggunaan heredoc yang luar biasa ini:

Anda dapat menyusun perintah dengan sintaks ini, dan itulah satu-satunya cara bersarang tampaknya berfungsi (dengan cara yang waras)

ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH

Anda benar-benar dapat melakukan percakapan dengan beberapa layanan seperti telnet, ftp, dll. Namun ingat bahwa heredoc hanya mengirim stdin sebagai teks, tidak menunggu tanggapan antar baris

Edit: Saya baru saja mengetahui bahwa Anda dapat membongkar bagian dalam jika Anda menggunakannya <<-END !

ssh user@host <<-'ENDSSH'
    #commands to run on remote host
    ssh user@host2 <<-'END2'
        # Another bunch of commands on another host
        wall <<-'ENDWALL'
            Error: Out of cheese
        ENDWALL
        ftp ftp.secureftp-test.com <<-'ENDFTP'
            test
            test
            ls
        ENDFTP
    END2
ENDSSH

(Saya pikir ini harus bekerja)

Juga lihat http://tldp.org/LDP/abs/html/here-docs.html


506
2017-10-06 13:11



Juga, jangan lupa untuk melarikan diri variabel jika Anda ingin mengambilnya dari host tujuan.

Ini telah menangkap saya di masa lalu.

Sebagai contoh:

user@host> ssh user2@host2 "echo \$HOME"

mencetak / home / user2

sementara

user@host> ssh user2@host2 "echo $HOME"

mencetak / home / pengguna

Contoh lain:

user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"

mencetak "hello" dengan benar.


212
2017-11-20 12:25



Ini adalah ekstensi untuk jawaban YarekT untuk menggabungkan perintah remote inline dengan mengirimkan variabel ENV dari mesin lokal ke host jarak jauh sehingga Anda dapat menentukan parameter skrip Anda di sisi jarak jauh:

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
  # commands to run on remote host
  echo $ARG1 $ARG2
ENDSSH

Saya menemukan ini sangat membantu dengan menyimpan semuanya dalam satu skrip sehingga sangat mudah dibaca dan dipelihara.

Mengapa ini berhasil. ssh mendukung sintaks berikut:

ssh pengguna @ host remote_command

Dalam bash kita dapat menentukan variabel lingkungan untuk mendefinisikan sebelum menjalankan perintah pada satu baris seperti ini:

ENV_VAR_1 = 'value1' ENV_VAR_2 = 'value2' bash -c 'echo $ ENV_VAR_1 $ ENV_VAR_2'

Itu membuatnya mudah untuk mendefinisikan variabel sebelum menjalankan perintah. Dalam hal ini echo adalah perintah kita sedang berjalan. Semuanya sebelum echo mendefinisikan variabel lingkungan.

Jadi kami menggabungkan kedua fitur dan jawaban YarekT untuk mendapatkan:

ssh pengguna @ host ARG1 = $ ARG1 ARG2 = $ ARG2 'bash -s' << 'ENDSSH' ...

Dalam hal ini kami menetapkan ARG1 dan ARG2 ke nilai lokal. Mengirimkan semuanya setelah pengguna @ host sebagai perintah remote_command. Ketika mesin remote menjalankan perintah ARG1 dan ARG2 ditetapkan nilai lokal, berkat evaluasi baris perintah lokal, yang mendefinisikan variabel lingkungan pada server jauh, kemudian mengeksekusi perintah bash -s menggunakan variabel tersebut. Voila.


124
2017-09-09 15:00



<hostA_shell_prompt>$ ssh user@hostB "ls -la"

Yang akan meminta Anda untuk kata sandi, kecuali Anda telah menyalin kunci publik hostA pengguna Anda ke file authorized_keys di rumah direktori pengguna .ssh. Itu akan memungkinkan otentikasi tanpa kata sandi (jika diterima sebagai metode auth pada konfigurasi server ssh)


89
2017-11-20 11:53



Saya sudah mulai menggunakan Kain untuk operasi yang lebih canggih. Kain memerlukan Python dan beberapa dependensi lainnya, tetapi hanya pada mesin klien. Server hanya perlu menjadi server ssh. Saya menemukan alat ini menjadi jauh lebih kuat daripada skrip shell yang diserahkan ke SSH, dan layak mendapat kesulitan untuk mengaturnya (terutama jika Anda menikmati pemrograman dengan Python). Fabric menangani menjalankan skrip pada beberapa host (atau host dari peran tertentu), membantu memfasilitasi operasi idempoten (seperti menambahkan baris ke skrip konfigurasi, tetapi tidak jika sudah ada), dan memungkinkan konstruksi logika yang lebih kompleks (seperti Python bahasa dapat menyediakan).


24
2018-01-26 16:17



Dengan asumsi Anda berarti Anda ingin melakukan ini secara otomatis dari mesin "lokal", tanpa secara manual masuk ke mesin "remote", Anda harus melihat ke dalam ekstensi TCL yang dikenal sebagai Expect, itu dirancang tepat untuk situasi semacam ini. Ini halaman rumah di bawah terlihat agak jelek tapi jangan biarkan itu menghalangi Anda; Saya juga menyediakan tautan ke skrip untuk masuk / berinteraksi melalui SSH.

http://expect.nist.gov/

http://bash.cyberciti.biz/security/expect-ssh-login-script/


8
2017-11-20 12:10



Coba jalankan ssh user@remote sh ./script.unx.


7
2017-12-18 21:16



Jawabannya di sini (https://stackoverflow.com/a/2732991/4752883) bekerja dengan baik jika Anda mencoba menjalankan skrip pada mesin linux jauh menggunakan plink atau ssh. Ini akan berfungsi jika skrip memiliki banyak baris linux.

** Namun, jika Anda mencoba menjalankan skrip batch yang berada di lokal linux/windows mesin dan mesin remote Anda Windows, dan itu terdiri beberapa baris menggunakan **

plink root@MachineB -m local_script.bat

tidak akan bekerja.

Hanya baris pertama dari skrip yang akan dieksekusi. Ini mungkin a pembatasan plink.

Solusi 1:

Untuk menjalankan skrip batch multiline (terutama jika itu relatif sederhana, terdiri dari beberapa baris):

Jika skrip batch asli Anda adalah sebagai berikut

cd C:\Users\ipython_user\Desktop 
python filename.py

Anda dapat menggabungkan garis bersama-sama menggunakan pemisah "&&" sebagai berikut di local_script.bat mengajukan: https://stackoverflow.com/a/8055390/4752883:

cd C:\Users\ipython_user\Desktop && python filename.py

Setelah perubahan ini, Anda dapat menjalankan skrip sebagaimana ditunjukkan di sini oleh @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 dengan:

`plink root@MachineB -m local_script.bat`

Solusi 2:

Jika skrip batch Anda relatif rumit, mungkin lebih baik menggunakan batch skrip yang meng-enkapsulasi perintah plink dan mengikuti seperti yang ditunjukkan di sini oleh @Martin https://stackoverflow.com/a/32196999/4752883:

rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N

rem Wait a second to let Plink establish the tunnel 
timeout /t 1

rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R

rem Kill the tunnel
taskkill /im plink.exe

0
2018-04-21 00:44



Skrip bash ini melakukan ssh ke mesin target target, dan menjalankan beberapa perintah di mesin jarak jauh, jangan lupa untuk menginstal sebelum menjalankannya (pada mac brew install expect )

#!/usr/bin/expect
set username "enterusenamehere"
set password "enterpasswordhere"
set hosts "enteripaddressofhosthere"
spawn ssh  $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "somecommand on target remote machine here\n"
sleep 5
expect "$"
send -- "exit\n"

0
2018-05-30 09:22



Pertama, salin skrip ke Mesin B menggunakan scp

[user @ machineA] $ scp / path / to / script user @ machineB: / home / user / path

Kemudian, jalankan skripnya

[pengguna @ machineA] $ ssh pengguna @ machineB "/ home / user / path / skrip"

Ini akan berfungsi jika Anda telah memberikan izin yang dapat dijalankan ke skrip.


-22