Aku harus menjalankan shell script (windows/Linux) pada mesin remote.
Saya punya SSH dikonfigurasi pada kedua mesin A dan B. naskah Saya adalah pada mesin yang akan menjalankan beberapa kode pada mesin remote, mesin B.
Lokal dan komputer remote dapat berupa Windows atau Unix berbasis sistem.
Apakah ada cara untuk menjalankan melakukan ini dengan menggunakan plink/ssh?
Jika Mesin A adalah Jendela kotak, anda dapat menggunakan Plink (bagian dari Dempul) dengan parameter-m, dan akan mengeksekusi script lokal pada remote server.
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
Seharusnya kau't harus copy script ke remote server untuk menjalankannya.
Ini adalah pertanyaan lama, dan Jason's jawaban yang bekerja dengan baik, tapi saya ingin menambahkan ini:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
Hal ini juga dapat digunakan dengan su dan perintah-perintah yang memerlukan input pengguna. (catatan '
melarikan diri heredoc)
Edit: Karena jawaban ini terus mendapatkan bit lalu lintas, saya akan menambahkan lebih banyak untuk info yang luar biasa ini menggunakan heredoc:
Anda dapat menuliskan perintah dengan sintaks ini, dan itulah satu-satunya cara yang bersarang tampaknya untuk bekerja (pada waras way)
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 dapat benar-benar memiliki percakapan dengan beberapa layanan seperti telnet, ftp, dll. Tapi ingat bahwa heredoc hanya mengirimkan stdin sebagai teks, itu doesn't menunggu untuk respon antara garis
Edit: saya hanya menemukan bahwa anda dapat indent bagian dalam dengan tab jika anda menggunakan <<-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 melihat http://tldp.org/LDP/abs/html/here-docs.html
Juga, don't lupa untuk melarikan diri variabel jika anda ingin menjemput mereka dari host tujuan.
Ini telah menarik saya keluar di masa lalu.
Misalnya:
user@host> ssh user2@host2 "echo \$HOME"
mencetak /home/user2
sementara
user@host> ssh user2@host2 "echo $HOME"
mencetak /home/user
Contoh lain:
user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
mencetak "hello" benar.
Ini adalah sebuah ekstensi untuk YarekT's jawaban untuk menggabungkan inline remote perintah dengan melewati ENV variabel dari mesin lokal ke remote host sehingga anda dapat mengukur script anda pada sisi remote:
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 menjaga semuanya dalam satu naskah jadi's sangat mudah dibaca dan dipelihara.
Mengapa ini bekerja. ssh mendukung sintaks berikut:
ssh user@host remote_command
Di bash kita dapat menentukan variabel lingkungan untuk menentukan sebelum menjalankan perintah pada satu baris seperti berikut:
ENV_VAR_1='value1' ENV_VAR_2='value2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'
Yang membuatnya mudah untuk mendefinisikan variabel sebelum menjalankan perintah. Dalam hal ini echo adalah perintah kami, kami'kembali berjalan. Segala sesuatu sebelum echo mendefinisikan variabel lingkungan.
Jadi kita menggabungkan kedua fitur dan YarekT's jawaban untuk mendapatkan:
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'...
Dalam hal ini kita setting ARG1 dan ARG2 dengan nilai-nilai lokal. Mengirim semuanya setelah user@host sebagai remote_command. Ketika mesin remote mengeksekusi perintah ARG1 dan ARG2 yang mengatur nilai-nilai lokal, berkat lokal command line evaluasi, yang mendefinisikan variabel lingkungan pada remote server, kemudian mengeksekusi bash -s perintah menggunakan variabel tersebut. Voila.
<hostA_shell_prompt>$ ssh user@hostB "ls -la"
Yang akan meminta anda untuk password anda, kecuali jika anda telah disalin anda hostA pengguna's kunci publik untuk authorized_keys file pada home dari user .ssh's direktori. Yang akan memungkinkan untuk passwordless otentikasi (jika diterima sebagai auth metode pada ssh server's konfigurasi)
I've mulai menggunakan Kain untuk lebih canggih operasi. Kain ini membutuhkan Python dan beberapa dependensi lain, tetapi hanya pada mesin klien. Server hanya perlu ssh server. Saya menemukan alat ini akan jauh lebih kuat daripada shell script diserahkan ke SSH, dan layak kesulitan mendapatkan set up (terutama jika anda menikmati pemrograman Python). Kain menangani menjalankan script pada beberapa host (atau host dari peran tertentu), membantu memfasilitasi idempotent operasi (seperti menambahkan satu baris konfigurasi script, tapi tidak jika itu's sudah ada), dan memungkinkan pembangunan logika yang lebih kompleks (seperti Python dapat memberikan).
Dengan asumsi anda berarti anda ingin melakukan hal ini secara otomatis dari "lokal" mesin, tanpa manual login ke "remote" mesin, anda harus melihat ke TCL ekstensi dikenal sebagai Mengharapkan, hal ini dirancang tepat untuk situasi semacam ini. I've juga menyediakan link ke script untuk log-in/berinteraksi melalui SSH.
jika anda ingin mengeksekusi perintah seperti ini
temp=`ls -a` echo $temp
perintah `` akan menyebabkan kesalahan.
perintah di bawah ini akan memecahkan masalah ini
ssh user@host ''' temp=`ls -a` echo $temp '''
Jawabannya di sini (https://stackoverflow.com/a/2732991/4752883) karya besar jika
anda're berusaha untuk menjalankan script pada server linux menggunakan mesin plink
atau ssh
.
Ini akan bekerja jika skrip telah beberapa baris pada linux
.
Namun, jika anda mencoba untuk menjalankan batch script yang terletak pada daerah
linux/windows
mesin anda dan remote machine adalah Jendela
, dan terdiri
dari beberapa baris menggunakan
`plink root@MachineB -m local_script.bat`
tidak akan bekerja.
Hanya baris pertama dari script yang akan dijalankan. Ini mungkin
batasan plink
.
Untuk menjalankan sebuah multiline batch script (terutama jika itu's relatif sederhana, terdiri dari beberapa baris):
Jika anda asli script batch adalah sebagai berikut
cd C:\Users\ipython_user\Desktop
python filename.py
anda dapat menggabungkan garis-garis bersama-sama menggunakan "&&" separator sebagai berikut dalam
local_script.bat
file:
https://stackoverflow.com/a/8055390/4752883:
cd C:\Users\ipython_user\Desktop && python filename.py
Setelah perubahan ini, maka anda dapat menjalankan script seperti yang ditunjukkan di sini @JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 dengan:
plink root@MachineB -m local_script.bat
Jika anda batch script yang relatif rumit, mungkin akan lebih baik untuk menggunakan batch naskah yang merangkum plink perintah sebagai berikut seperti yang ditunjukkan di sini by @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
Anda dapat menggunakan runoverssh:
bash sudo apt-get install runoverssh
bash runoverssh -s localscript.sh pengguna host1 host2 host3...
-s
berjalan naskah lokal jarak jauh
Berguna bendera:
-g
menggunakan global password untuk semua host (single password prompt)
-n
gunakan SSH alih-alih sshpass, yang berguna untuk umum-kunci otentikasi
Ini bash script melakukan ssh ke target remote mesin, dan menjalankan beberapa perintah pada mesin remote, jangan lupa untuk menginstal mengharapkan sebelum menjalankannya (pada mac brew install mengharapkan
)
#!/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"
ssh user@hostname ".~/.bashrc;/cd path-to-file/;.filename.sh"
sangat dianjurkan untuk sumber lingkungan file(.bashrc/.bashprofile/.profil). sebelum menjalankan sesuatu di remote host karena target dan sumber host variabel lingkungan dapat deffer.
Pertama, copy script di atas ke Mesin B menggunakan scp
[user@mesin]$ scp /path/to/script user@machineB:/home/user/path
Kemudian, jalankan script
[user@mesin]$ ssh user@machineB "/home/user/path/script"
Ini akan bekerja jika anda telah diberikan eksekusi izin untuk script.