Saya telah menulis skrip yang berjalan dengan baik ketika dijalankan secara lokal:
./sysMole -time Aug 18 18
Argumen "-waktu" , "Agustus" , "18" , dan "18" berhasil diteruskan ke skrip.
Sekarang, skrip ini dirancang untuk dijalankan pada mesin jarak jauh tetapi, dari direktori lokal di mesin lokal. Contoh:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
Itu juga berfungsi dengan baik. Tetapi masalah muncul ketika saya mencoba memasukkan argumen-argumen yang disebutkan di atas (-taman 18 Agustus 18) , misalnya:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
Setelah menjalankan skrip itu, saya mendapatkan kesalahan berikut:
bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
Tolong beritahu saya apa yang saya lakukan salah, ini sangat membuat frustrasi.
Jawaban:
Anda cukup dekat dengan contoh Anda. Ini berfungsi dengan baik ketika Anda menggunakannya dengan argumen seperti ini.
Contoh skrip:
Contoh yang berfungsi:
Tetapi gagal untuk jenis argumen ini:
Apa yang sedang terjadi?
Masalah yang Anda temui adalah bahwa argumen
-time
,, atau--time
dalam contoh saya, ditafsirkan sebagai beralih kebash -s
. Anda dapat menenangkanbash
dengan menghentikannya dari mengambil argumen baris perintah yang tersisa untuk dirinya sendiri menggunakan--
argumen.Seperti ini:
Contohnya
# 1:
# 2:
# 3:
# 4:
CATATAN: Hanya untuk memperjelas bahwa di mana pun pengalihan muncul pada baris perintah tidak ada bedanya, karena
ssh
memanggil shell jarak jauh dengan gabungan argumennya, mengutip tidak membuat banyak perbedaan, kecuali ketika Anda perlu mengutip pada shell jauh seperti pada contoh # 4:sumber
bash -s -- --time bye < ./ex.bash
atau bahkan< ./ex.bash bash -s -- --time bye
. ini karena shell pertama-tama mengeluarkan instruksi pengalihan (terlepas dari di mana perintah itu berada), kemudian mengatur pengalihan, kemudian mengeksekusi sisa baris perintah dengan pengalihan di tempat.Tentang Menangani Argumen Sewenang-wenang
Jika Anda benar-benar hanya menggunakan string tunggal, yaitu.
-time Aug 18 18
, maka Anda dapat dengan mudah meng-hardcode-nya, dan jawaban yang ada memberi tahu Anda bagaimana melakukannya secara memadai. Di sisi lain, jika Anda harus melewati argumen yang tidak diketahui (seperti pesan yang akan ditampilkan di sistem lain, atau nama file yang dibuat di mana pengguna akhir dapat mengontrol namanya), maka diperlukan lebih banyak kehati-hatian.Dengan
bash
atauksh
sebagai/bin/sh
Jika kendali jarak jauh Anda
/bin/sh
disediakan oleh bash atau ksh, Anda dapat dengan aman melakukan yang berikut dengan daftar argumen yang tidak dipercaya, sehingga bahkan nama jahat (seperti$(rm -rf $HOME).txt
) dapat disampaikan sebagai argumen dengan aman:Dengan Setiap POSIX-Compliant
/bin/sh
Agar aman terhadap data argumen yang cukup berbahaya (berusaha mengambil keuntungan dari kutipan yang tidak sesuai dengan POSIX yang digunakan oleh
printf %q
dalam bash ketika karakter yang tidak dapat dicetak hadir dalam string yang diloloskan) bahkan dengan/bin/sh
yang merupakan baseline-POSIX (sepertidash
atauash
), itu jadi sedikit lebih menarik:Penggunaan (untuk salah satu di atas)
Fungsi-fungsi yang diberikan di atas kemudian dapat dipanggil sebagai:
...atau...
sumber
katakanlah aa adalah file lokal yang berisi ls
$ssh servername "cat | bash" < a.a
ubah 127.0.0.1 menjadi apa pun ip jarak jauh Anda
keduanya memberikan pesan tentang alokasi pseudo tty tetapi mereka bekerja.
$ cat a.a | ssh 127.0.0.1
$ ssh 127.0.0.1 <a.a
Atau
$ cat a.a | ssh 127.0.0.1 bash or
$ ssh 127.0.0.1 bash < a.a
sumber