Jalankan skrip jarak jauh dengan nilai parameter lokal

8

Bagaimana saya bisa mengotomatiskan tugas ini?

1) Anda berada di A. 2) Anda ssh ke B. 3) Anda menjalankan skrip di B, yang membutuhkan parameter yang dikenal di A.

Pertama, saya pikir mungkin saya bisa mengirim nilainya ketika saya membuka koneksi dengan ssh. Kemudian, mungkin lebih sederhana, antara 1) dan 2), scp seluruh skrip ke lokasi yang sama di B (mengganti yang lama). Tapi tetap saja, bagaimana cara menjalankan skrip di B? (Yaitu, bagaimana mengotomatiskan langkah terakhir itu. Tentu saja, saya bisa menjalankannya secara manual setelah ssh.)

Pikiran lain, mungkin membuang ssh sama sekali - saya punya halaman web di B, jadi bisakah skrip entah bagaimana dipanggil melalui antarmuka web "di bawah tenda"?

Atau apakah Anda akan melakukannya dengan cara yang sama sekali berbeda?

Emanuel Berg
sumber
Lihat juga Run jika pernyataan di mesin jarak jauh
Ulrich Dangel

Jawaban:

11
myparameter=foobar
ssh user@server "myscript $myparameter"

Ini akan dijalankan myscript foobardi server.

Michael Hampton
sumber
Sederhana seperti itu! Bagus sekali. (Saya harus meletakkan "./" di depan nama skrip karena kalau tidak dicari ~/.elm/aliases.)
Emanuel Berg
6
Sebagai peringatan kecil, penggunaan tanda kutip ganda ( ") sebagai kebalikan dari yang tunggal ( ') penting di sini. Menggunakan ganda berarti bahwa shell pada mesin lokal Anda akan memperluas variabel, kemudian jalankan sshperintah. Jika satu yang akan digunakan shell lokal tidak akan menyentuh perintah, yang dikirim pada kata demi kata tetapi masih diperluas di shell jauh.
Tilo Wiklund
3
Perhatikan bahwa jika $myparameterberisi spasi, itu akan terpecah di sisi server. Bash's printfmemiliki %qformat yang dapat Anda gunakan. Saya punya beberapa kode contoh, tetapi tidak cocok di sini. Saya akan membuat jawaban baru untuk itu.
janmoesen
7

(Ini adalah tindak lanjut dari komentar saya pada jawaban yang diterima .)

Perhatikan bahwa jika $myparameterberisi spasi, itu akan terpecah di sisi server. Printf Bash memiliki %qformat yang dapat Anda gunakan. Contoh:

$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory

$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile
janmoesen
sumber
1

Jika aman untuk berasumsi bahwa tidak$myparameter akan mengandung tanda kutip tunggal (jika tidak lihat di sini atau gunakan solusi oleh janmoesen), Anda dapat menempatkan tanda kutip tunggal di sekitar untuk menghindari masalah split-on-space di sisi server.printf '%q' ...$myparameter

myparameter="foo \" bar"
#myparameter="foo \" ' bar"

ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"
marc
sumber