Saya harus menjalankan skrip shell (windows / Linux) pada mesin jarak jauh.
Saya telah mengonfigurasi SSH di kedua mesin A dan B. Script saya ada di mesin A yang akan menjalankan beberapa kode saya di mesin jarak jauh, mesin B.
Komputer lokal dan jarak jauh dapat berupa sistem berbasis Windows atau Unix.
Apakah ada cara untuk menjalankan melakukan ini menggunakan plink / ssh?
shell
ssh
sysadmin
remote-execution
alpha_989
sumber
sumber
Jawaban:
Jika Mesin A adalah kotak Windows, Anda dapat menggunakan Plink (bagian dari Putty ) dengan parameter -m, dan itu akan mengeksekusi skrip lokal di server jauh.
Jika Mesin A adalah sistem berbasis Unix, Anda dapat menggunakan:
Anda tidak perlu menyalin skrip ke server jauh untuk menjalankannya.
sumber
-s
opsi ini? halaman manual ini membuat saya percaya bahwa itu akan memproses input standar ketika opsi pemrosesan selesai, apakah-s
digunakan atau tidak.sudo
, jalankanssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
.HISTCONTROL=ignoreboth or ignorespace
membuatnya bekerja)ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
Kredit sepenuhnya menuju ke jawaban @chubbsondubs di bawah ini.Ini adalah pertanyaan lama, dan jawaban Jason berfungsi dengan baik, tetapi saya ingin menambahkan ini:
Ini juga dapat digunakan dengan su dan perintah yang membutuhkan input pengguna. (perhatikan
'
heredoc yang lolos)Sunting: Karena jawaban ini terus mendapatkan sedikit lalu lintas, saya akan menambahkan lebih banyak info untuk penggunaan heredoc yang luar biasa ini:
Anda dapat menumpuk perintah dengan sintaks ini, dan itulah satu-satunya cara agar nesting berfungsi (dengan cara yang waras)
Anda sebenarnya dapat melakukan percakapan dengan beberapa layanan seperti telnet, ftp, dll. Tetapi ingat bahwa heredoc hanya mengirim stdin sebagai teks, ia tidak menunggu respons di antara baris
Sunting: Saya baru tahu bahwa Anda dapat membuat indentasi bagian dalam dengan tab jika Anda gunakan
<<-END
!(Saya pikir ini harus berhasil)
Juga lihat http://tldp.org/LDP/abs/html/here-docs.html
sumber
<<'ENDSSH'
), string tidak akan diperluas, variabel tidak akan dievaluasi. Anda juga dapat menggunakan<<ENDSSH
atau<<"ENDSSH"
jika Anda ingin ekspansi.Expect
dapat digunakan ketika Anda perlu mengotomatisasi perintah interaktif seperti FTP.Pseudo-terminal will not be allocated because stdin is not a terminal.
pesan. Kita harus menggunakan ssh dengan-t -t
params untuk menghindari itu. Lihat utasJuga, jangan lupa untuk keluar dari variabel jika Anda ingin mengambilnya dari host tujuan.
Ini telah menangkap saya di masa lalu.
Sebagai contoh:
mencetak / home / user2
sementara
mencetak / home / user
Contoh lain:
mencetak "halo" dengan benar.
sumber
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
loop berjalan dissh
sesi, variabel loop tidak boleh diloloskan.ssh user2@host2 'echo hello world' | awk '{ print $1 }'
menjalankan skrip Awk secara lokal. Jika perintah jarak jauh menghasilkan keluaran yang sangat besar, Anda tentu ingin menghindari menyalin semuanya kembali ke server lokal. Kebetulan, kutipan tunggal di sekitar perintah jarak jauh menghindari kebutuhan untuk melarikan diri.Ini adalah ekstensi untuk jawaban YarekT untuk menggabungkan perintah remote inline dengan meneruskan variabel ENV dari mesin lokal ke host jarak jauh sehingga Anda dapat membuat parameter skrip Anda di sisi jarak jauh:
Saya menemukan ini sangat membantu dengan menyimpan semuanya dalam satu skrip sehingga sangat mudah dibaca dan dikelola.
Kenapa ini bekerja? ssh mendukung sintaks berikut:
Dalam bash kita bisa menentukan variabel lingkungan untuk didefinisikan sebelum menjalankan perintah pada satu baris seperti:
Itu membuatnya mudah untuk mendefinisikan variabel sebelum menjalankan perintah. Dalam hal ini gema adalah perintah kami yang kami jalankan. Segala sesuatu sebelum gema mendefinisikan variabel lingkungan.
Jadi kami menggabungkan kedua fitur dan jawaban YarekT untuk mendapatkan:
Dalam hal ini kami menetapkan ARG1 dan ARG2 ke nilai lokal. Mengirim semuanya setelah pengguna @ host sebagai perintah remote_. Ketika mesin jarak jauh mengeksekusi perintah ARG1 dan ARG2 diatur nilai-nilai lokal, berkat evaluasi baris perintah lokal, yang mendefinisikan variabel lingkungan pada server jauh, kemudian mengeksekusi perintah bash -s menggunakan variabel-variabel tersebut. Voila.
sumber
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
adalah untuk dapat menerapkan argumen ke skrip yang bersumber melalui stdin. Maksud saya, Anda bisa menghilangkannya jika Anda tidak akan menggunakannya. Jika Anda menggunakannya, tidak ada alasan untuk menggunakan variabel lingkungan:ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
Itu akan meminta Anda untuk kata sandi, kecuali jika Anda telah menyalin kunci publik hostA pengguna ke file Authorized_key di rumah direktori .ssh pengguna. Itu akan memungkinkan otentikasi tanpa kata sandi (jika diterima sebagai metode auth pada konfigurasi server ssh)
sumber
Saya sudah mulai menggunakan Fabric untuk operasi yang lebih canggih. Fabric membutuhkan Python dan beberapa dependensi lainnya, tetapi hanya pada mesin klien. Server hanya perlu server ssh. Saya menemukan alat ini jauh lebih kuat daripada skrip shell yang diserahkan ke SSH, dan layak kesulitan untuk mengatur (terutama jika Anda menikmati pemrograman dengan Python). Fabric menangani skrip yang berjalan pada beberapa host (atau host peran tertentu), membantu memfasilitasi operasi idempoten (seperti menambahkan baris ke skrip konfigurasi, tetapi tidak jika sudah ada di sana), dan memungkinkan konstruksi logika yang lebih kompleks (seperti Python bahasa dapat menyediakan).
sumber
Coba jalankan
ssh user@remote sh ./script.unx
.sumber
sumber
Dengan asumsi Anda bermaksud melakukan ini secara otomatis dari mesin "lokal", tanpa secara manual masuk ke mesin "jarak jauh", Anda harus melihat ke ekstensi TCL yang dikenal sebagai Expect, ia dirancang tepat untuk situasi seperti ini. Saya juga menyediakan tautan ke skrip untuk masuk / berinteraksi melalui SSH.
https://www.nist.gov/services-resources/software/expect
http://bash.cyberciti.biz/security/expect-ssh-login-script/
sumber
Saya menggunakan ini untuk menjalankan skrip shell pada mesin jarak jauh (diuji pada / bin / bash):
sumber
sangat disarankan untuk sumber file lingkungan (.bashrc / .bashprofile / .profile). sebelum menjalankan sesuatu di host jarak jauh karena target dan sumber variabel lingkungan host mungkin deffer.
sumber
jika Anda ingin menjalankan perintah seperti ini
temp=`ls -a` echo $temp
di `` akan menyebabkan kesalahan.perintah di bawah ini akan menyelesaikan masalah ini
ssh user@host ''' temp=`ls -a` echo $temp '''
sumber
Jawabannya di sini ( https://stackoverflow.com/a/2732991/4752883 ) berfungsi dengan baik jika Anda mencoba menjalankan skrip pada mesin linux jarak jauh menggunakan
plink
ataussh
. Ini akan berfungsi jika skrip memiliki beberapa baris aktiflinux
.** Namun, jika Anda mencoba menjalankan skrip batch yang terletak di
linux/windows
mesin lokal dan mesin jarak jauh AndaWindows
, dan itu terdiri dari beberapa baris menggunakan **plink root@MachineB -m local_script.bat
tidak akan bekerja.
Hanya baris pertama skrip yang akan dieksekusi. Ini mungkin batasan
plink
.Solusi 1:
Untuk menjalankan skrip kumpulan multiline (terutama jika itu relatif sederhana, terdiri dari beberapa baris):
Jika skrip batch asli Anda adalah sebagai berikut
Anda dapat menggabungkan garis-garis tersebut bersama-sama menggunakan pemisah "&&" seperti berikut dalam
local_script.bat
file Anda : https://stackoverflow.com/a/8055390/4752883 :Setelah perubahan ini, Anda kemudian dapat menjalankan skrip seperti yang ditunjukkan di sini oleh @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 dengan:
Solusi 2:
Jika skrip batch Anda relatif rumit, mungkin lebih baik menggunakan skrip batch yang merangkum perintah plink dan juga seperti yang ditunjukkan di sini oleh @Martin https://stackoverflow.com/a/32196999/4752883 :
sumber
Script bash ini ssh menjadi mesin remote target, dan menjalankan beberapa perintah di mesin remote, jangan lupa untuk menginstal berharap sebelum menjalankannya (di mac
brew install expect
)sumber
Anda dapat menggunakan runoverssh :
-s
menjalankan skrip lokal dari jarak jauhBendera yang berguna:
-g
gunakan kata sandi global untuk semua host (prompt kata sandi tunggal)-n
gunakan SSH alih-alih sshpass, berguna untuk otentikasi kunci publiksumber
Pertama, salin skrip ke Mesin B menggunakan scp
Kemudian, jalankan saja skripnya
Ini akan berfungsi jika Anda telah memberikan izin yang dapat dieksekusi ke skrip.
sumber