Saya sudah menyiapkan ssh agent, dan saya bisa menjalankan perintah pada server eksternal dalam skrip Bash melakukan hal-hal seperti:
ssh blah_server "ls; pwd;"
Sekarang, yang ingin saya lakukan adalah menjalankan banyak perintah panjang di server eksternal. Menutup semua ini di antara tanda kutip akan sangat jelek, dan saya lebih suka menghindari ssh'ing beberapa kali hanya untuk menghindari ini.
Jadi, adakah cara saya bisa melakukan ini dalam satu tanda kurung atau semacamnya? Saya mencari sesuatu di sepanjang baris:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Pada dasarnya, saya akan senang dengan solusi apa pun asalkan bersih.
Edit
Untuk memperjelas, saya berbicara tentang ini menjadi bagian dari skrip bash yang lebih besar. Orang lain mungkin perlu berurusan dengan script di telepon, jadi saya ingin tetap bersih. Saya tidak ingin memiliki skrip bash dengan satu baris yang terlihat seperti:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
karena sangat jelek dan sulit dibaca.
ssh
permintaan?scp
,ssh
, dan lari. Ini akan menjadi cara terbersih, saya pikir.Jawaban:
Bagaimana dengan Dokumen Bash Here :
Untuk menghindari masalah yang disebutkan oleh @Globalz di komentar, Anda mungkin dapat (tergantung apa yang Anda lakukan di situs jarak jauh) untuk mengganti baris pertama dengan
Perhatikan bahwa Anda dapat melakukan substitusi variabel dalam dokumen Here, tetapi Anda mungkin harus berurusan dengan masalah mengutip. Misalnya, jika Anda mengutip "batas string" (mis.
EOF
Di atas), maka Anda tidak dapat melakukan pergantian variabel. Tetapi tanpa mengutip string batas, variabel diganti. Sebagai contoh, jika Anda telah mendefinisikan$NAME
skrip shell di atas, Anda dapat melakukannyadan itu akan membuat file di tujuan
otherhost
dengan nama apa pun yang Anda ditugaskan$NAME
. Aturan lain tentang mengutip skrip shell juga berlaku, tetapi terlalu rumit untuk masuk ke sini.sumber
Edit skrip Anda secara lokal, lalu kirimkan ke ssh, mis
di mana
commands-to-execute-remotely.sh
terlihat seperti daftar Anda di atas:sumber
( echo $mycmd $myvar ; ...) | ssh myhost
- seperti halnya dengan penggunaan cat, Anda tahu persis apa yang masuk ke aliran perintah ssh. Dan tentu saja subkulit dalam skrip dapat multi-line untuk keterbacaan - lihat linuxjournal.com/content/bash-sub-shellscommands-to-execute-remotely.sh
?$localvar
untuk menginterpretasikan variabel yang ditentukan secara lokal,\$remotevar
untuk menginterpretasikan dari jauh variabel yang ditentukan dari jarak jauh,\$(something with optionnal args)
untuk mendapatkan output dari sesuatu yang dieksekusi pada server jauh. Contoh yang dapat Anda ssh melalui 1 (atau, seperti yang ditunjukkan di sini, beberapa perintah ssh):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
?Untuk mencocokkan kode sampel Anda, Anda dapat membungkus perintah Anda di dalam qoutes tunggal atau ganda. Sebagai contoh
sumber
Saya melihat dua cara:
Pertama, Anda membuat soket kontrol seperti ini:
dan jalankan perintah Anda
Dengan cara ini Anda dapat menulis perintah ssh tanpa benar-benar terhubung kembali ke server.
Yang kedua adalah menghasilkan skrip secara dinamis,
scp
dan menjalankannya.sumber
Ini juga dapat dilakukan sebagai berikut. Masukkan perintah Anda dalam sebuah skrip, beri nama itu perintah-inc.sh
Simpan file
Sekarang jalankan di server jauh.
Tidak pernah gagal untukku.
sumber
bash -s
dibutuhkan?#!/bin/bash
benar - benar digunakan?ssh user@remote < /path/to/commands-inc.sh
(sepertinya berhasil untuk saya). Yah, saya kira versimu memastikan kita menggunakanbash
shell, dan bukan shell lain - itulah tujuannya, bukan?Masukkan semua perintah ke skrip dan itu bisa dijalankan seperti
sumber
bash -s
?man
halamanIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
perintahnya sama sekali, yaitussh remote-user@remote-host <./remote-commands.sh
. Saya mencoba cara saya dan tampaknya berhasil, meskipun saya tidak yakin apakah itu kurang dalam beberapa cara.SSH dan Jalankan Banyak Perintah di Bash.
Pisahkan perintah dengan titik koma di dalam string, diteruskan ke gema, semua disalurkan ke perintah ssh. Sebagai contoh:
sumber
Bagi siapa pun yang tersandung di sini seperti saya - Saya berhasil lolos dari titik koma dan baris baru:
Langkah pertama: titik koma. Dengan cara ini, kami tidak melanggar perintah ssh:
Mencantumkan direktori host / home jarak jauh (login sebagai root), sedangkan
terdaftar direktori kerja saat ini.
Langkah selanjutnya: memecah baris:
Ini sekali lagi mencantumkan direktori kerja jarak jauh - pemformatan yang ditingkatkan:
Jika benar-benar lebih bagus daripada di sini, dokumentasikan atau kutip di sekitar garis terputus - yah, bukan saya yang memutuskan ...
(Menggunakan bash, Ubuntu 14.04 LTS.)
sumber
ssh host "echo test && ls"
Jawaban yang diposting menggunakan string multiline dan beberapa skrip bash tidak berfungsi untuk saya.
Berikut adalah cara fungsional untuk ssh dan menjalankan beberapa perintah sambil menjaga konteks lokal.
sumber
Tidak yakin apakah yang terbersih untuk perintah yang panjang tetapi yang paling mudah:
sumber
Ini berfungsi baik untuk membuat skrip, karena Anda tidak harus memasukkan file lain:
sumber
-s
bendera, saya mengutip dia Anda mungkin bisa pergi dengan mengganti baris pertama dengan ... , dan saya tidak bisa pergi dengan hanya memanggil bash saya samar-samar ingat.Cara termudah untuk mengonfigurasi sistem Anda untuk menggunakan sesi ssh tunggal secara default dengan multiplexing.
Ini dapat dilakukan dengan membuat folder untuk soket:
Dan kemudian menambahkan yang berikut ini ke konfigurasi .ssh Anda:
Sekarang, Anda tidak perlu mengubah kode apa pun. Ini memungkinkan beberapa panggilan ke ssh dan scp tanpa membuat beberapa sesi, yang berguna ketika perlu ada lebih banyak interaksi antara mesin lokal dan jarak jauh Anda.
Terima kasih untuk jawaban @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ dan https://en.wikibooks.org / wiki / OpenSSH / Cookbook / Multiplexing .
sumber