Saya punya 2 komputer, localpc
dan remoteserver
.
Saya perlu localpc
menjalankan beberapa perintah remoteserver
. Salah satu hal yang perlu dilakukan adalah memulai skrip cadangan yang berjalan selama beberapa jam. Saya ingin perintah localpc
untuk "menembak" dan kemudian menjalankan sepenuhnya independen remoteserver
, seperti localpc
tidak pernah ada di tempat pertama.
Inilah yang telah saya lakukan sejauh ini:
remoteserver
mengandung memiliki skrip:
/root/backup.sh
localpc
dijadwalkan untuk menjalankan ini:
ssh root@remoteserver 'nohup /root/backup.sh' &
Apakah saya melakukan ini dengan cara yang benar? Apakah ada cara yang lebih baik untuk melakukan ini? Apakah saya akan mengalami kesulitan melakukannya dengan cara ini?
ssh
scripting
nohup
background-process
LVLAaron
sumber
sumber
Jawaban:
Anda mungkin harus menggunakan
screen
pada host jarak jauh, untuk memiliki perintah terpisah nyata:sumber
Tutup, tapi tidak persis.
Secara independen dari terminal apa pun
Anda harus menutup semua deskriptor file yang terhubung ke soket ssh, karena sesi ssh tidak akan ditutup selama beberapa proses jarak jauh membuka soket. Jika Anda tidak tertarik dengan output skrip (mungkin karena skrip itu sendiri mengurus penulisan ke file log), arahkan kembali ke
/dev/null
(tetapi perhatikan bahwa ini akan menyembunyikan kesalahan seperti tidak dapat memulai skrip).Penggunaan
nohup
tidak memiliki efek yang berguna di sini.nohup
mengatur program yang dijalankannya untuk tidak menerima sinyal HUP jika terminal pengendali program menghilang, tetapi di sini tidak ada terminal sejak awal, jadi tidak ada yang akan mengirim SIGHUP ke proses secara tiba-tiba. Juga,nohup
mengarahkan ulang output standar dan kesalahan standar (tetapi bukan input standar) ke file, tetapi hanya jika mereka terhubung ke terminal, yang, sekali lagi, mereka tidak.Melepaskan dari terminal
Gunakan
nohup
untuk melepaskan skrip dari terminal pengendali sehingga tidak menerima SIGHUP saat terminal hilang.nohup
juga mengalihkan keluaran standar skrip dan kesalahan standar ke file yang dipanggilnohup.out
jika mereka terhubung ke terminal; Anda harus mengurus sendiri input standar.Menyimpan terminal jarak jauh
Jika Anda ingin agar perintah tetap berjalan di terminal jarak jauh tetapi tidak memilikinya melekat pada sesi SSH, jalankan di terminal multiplexer seperti Layar atau Tmux .
Anda nanti dapat menyambung kembali ke terminal tempat skrip berjalan dengan memanggil
screen -S backup -rd
sebagai root pada mesin itu.Mengotomatiskan satu perintah jarak jauh
Untuk keamanan yang sedikit lebih baik, jangan membuka login root jarak jauh langsung terlalu banyak. Buat pasangan kunci tujuan khusus dan berikan perintah paksa
/root/.ssh/authorized_keys
. Isi file kunci publik adalahAAAA…== [email protected]
; tambahkan daftar opsicommand="…"
yang dipisahkan koma termasuk yang menentukan bahwa kunci hanya dapat digunakan untuk menjalankan perintah khusus ini. Pastikan untuk menyimpan semua opsi dan kunci pada satu baris.sumber
-f
opsi untuk mendapatkan ssh ke 'latar belakang' (yaitu mengakhiri, menutup koneksi) di sisi lokal. Ini akan bekerja bersama dengan&
.nohup
opsional dalam kasus ini, tetapi Anda dapat mempertimbangkan untuk menggunakannyasetsid
.Resep standar untuk menjalankan perintah jarak jauh dari login jarak jauh seperti SSH adalah sebagai berikut:
Jika
command
adalah skrip shell yang menangani pembuatan log ke file itu sendiri, maka Anda dapat mengubahnyacommand.log
menjadi/dev/null
. Setelah Anda memulai ini, keluarlah segera.Anda membutuhkan semua yang ada di garis itu.
nohup
memberitahu shell untuk tidak mengganggu proses jika sesi login terputus.</dev/null
mengatakan itu tidak pernah menunggu input>command.log
memintanya untuk mengirim pesan apa pun ke file log bernama ini2>&1
memintanya untuk mengirim pesan stderr ke file log yang sama. Dalam beberapa kasus lebih baik memiliki dua file, yang kedua untuk mengumpulkan pesan kesalahan, dan yang pertama untuk mengumpulkan pesan aktivitas normal. Itu dapat membuatnya lebih mudah untuk memverifikasi bahwa semuanya bekerja dengan benar.&
memintanya untuk melepaskan proses ini dan menjalankannya di latar belakang sebagai proses daemon.sumber
Utas ini sangat membantu tetapi solusi saya harus sedikit berbeda.
Saya tidak suka solusi layar karena membiarkan proses layar berjalan yang tidak saya butuhkan. Pengalihan dan nohup digunakan seperti ini:
TIDAK bekerja untuk saya ketika digunakan dengan perintah ssh.
Saya membuat skrip wrapper pada mesin remote yang menjalankan skrip aktual. Script wrapper mengatur pengalihan dan nohup. Sesuatu seperti ini:
Kemudian pada mesin klien saya, saya menjalankan (perhatikan tidak ada redirection):
Perintah ssh segera kembali, koneksi diakhiri dan skrip dibiarkan berjalan.
sumber
Seperti yang dikatakan Nils , itu adalah risiko keamanan untuk memungkinkan root untuk masuk melalui ssh. Dan saya menyarankan agar tidak menjalankan pekerjaan besar pada mesin tanpa log. Jika ada masalah, Anda pasti memiliki beberapa pesan pemecahan masalah. Ada jawaban lain yang menunjukkan cara melakukannya. Namun, inilah cara saya merekomendasikan untuk mencapai apa yang Anda minta. Semuanya dibangun ke sh (1). Tidak perlu layar GNU (meskipun saya pikir itu solusi cerdas). Menambahkan string ini untuk perintah Anda:
>&- 2>&- <&- &
.>&-
berarti stdout dekat.2>&-
berarti stderr dekat.<&-
berarti stdin dekat.&
berarti dijalankan di latar belakang, missumber
Anda harus mengaktifkan latar belakang perintah jarak jauh
remoteserver
. Cara Anda melakukannya akan mengaktifkan ssh-commandlocalpc
.Selain itu, ide yang buruk adalah mengizinkan root-ssh.
Jadi setup on
remoteserver
: Baris sudoers yang akan dijalankan/root/backup.sh
sebagai root oleh penggunabackup
.Anda dapat membuat pengguna itu tanpa kata sandi "baik".
Masukkan perintah
sudo /root/backup.sh &
sebagai perintah~backup/.ssh/authorized_keys
- bersama dengan kunci publik darilocalpc
(siapa pun yang memicu skrip itu).sumber
sumber