Ini adalah pertanyaan lanjutan untuk Bagaimana Anda menggunakan ssh dalam skrip shell? pertanyaan. Jika saya ingin menjalankan perintah pada mesin jarak jauh yang berjalan di latar belakang pada mesin itu, bagaimana cara mendapatkan perintah ssh untuk kembali? Ketika saya mencoba untuk hanya memasukkan ampersand (&) di akhir perintah itu hanya hang. Bentuk persisnya dari perintah ini terlihat seperti ini:
ssh user@target "cd /some/directory; program-to-execute &"
Ada ide? Satu hal yang perlu diperhatikan adalah bahwa login ke mesin target selalu menghasilkan spanduk teks dan saya memiliki kunci SSH yang diatur sehingga tidak diperlukan kata sandi.
/dev/null
.< /dev/null
artinya? Terima kasih.Ini telah menjadi cara terbersih untuk melakukannya untuk saya: -
Satu-satunya hal yang berjalan setelah ini adalah perintah aktual pada mesin jarak jauh
sumber
-n
tidak diperlukan seperti-f
tersirat-n
ssh -f
membiarkan proses ssh terhubung, hanya dilatar belakangi. Solusi / dev / null memungkinkan ssh untuk memutuskan dengan cepat, yang mungkin lebih disukai.Redirect fd
Keluaran perlu diarahkan dengan
&>/dev/null
pengalihan stderr dan stdout ke / dev / null dan merupakan sinonim dari>/dev/null 2>/dev/null
atau>/dev/null 2>&1
.Paranthes
Cara terbaik adalah menggunakan di
sh -c '( ( command ) & )'
mana perintah adalah segalanya.Nohup Shell
Anda juga dapat menggunakan nohup secara langsung untuk meluncurkan shell:
Peluncuran yang bagus
Trik lain adalah menggunakan nice untuk meluncurkan perintah / shell:
sumber
nohup
, dan mengapa serta kapan Anda akan menggunakannyanice
? Saya pikir itu akan menambah banyak jawaban ini.Jika Anda tidak / tidak bisa menjaga koneksi tetap terbuka Anda bisa menggunakan layar , jika Anda memiliki hak untuk menginstalnya.
Untuk melepaskan sesi layar: ctrl-a d
Untuk daftar sesi layar:
Untuk memasang kembali sesi:
Perhatikan bahwa layar juga dapat membuat beberapa shell dalam setiap sesi. Efek serupa dapat dicapai dengan tmux .
Untuk melepaskan sesi tmux: ctrl-b d
Untuk daftar sesi layar:
Untuk memasang kembali sesi:
Kunci kontrol tmux default, ' ctrl-b', agak sulit digunakan tetapi ada beberapa contoh konfigurasi tmux yang disertakan bersama tmux yang dapat Anda coba.
sumber
screen
untuk ini?Saya hanya ingin menunjukkan contoh kerja yang dapat Anda potong dan tempel:
sumber
Cara tercepat dan termudah adalah dengan menggunakan perintah 'at':
sumber
at
argumen baris perintah diterima setelah waktu dan tidak hanya dari file.Saya pikir Anda harus menggabungkan beberapa jawaban ini untuk mendapatkan yang Anda inginkan. Jika Anda menggunakan nohup dalam hubungannya dengan titik koma, dan membungkus semuanya dalam tanda kutip, maka Anda mendapatkan:
yang sepertinya bekerja untuk saya. Dengan nohup, Anda tidak perlu menambahkan & ke perintah yang akan dijalankan. Juga, jika Anda tidak perlu membaca output dari perintah, Anda dapat menggunakannya
untuk mengarahkan semua output ke / dev / null.
sumber
Ini bekerja untuk saya mungkin:
sumber
Anda bisa melakukannya seperti ini ...
sumber
Sebenarnya, setiap kali saya perlu menjalankan perintah pada mesin jarak jauh yang rumit, saya suka memasukkan perintah ke dalam skrip di mesin tujuan, dan jalankan saja skrip itu menggunakan ssh.
Sebagai contoh:
Dan kemudian saya jalankan perintah ini di mesin sumber:
sumber
Saya mencoba melakukan hal yang sama, tetapi dengan kompleksitas tambahan yang saya coba lakukan dari Jawa. Jadi pada satu mesin yang menjalankan java, saya mencoba menjalankan skrip di komputer lain, di latar belakang (dengan nohup).
Dari baris perintah, inilah yang bekerja: (Anda mungkin tidak memerlukan "-i keyFile" jika Anda tidak perlu ssh ke host)
Perhatikan bahwa ke baris perintah saya, ada satu argumen setelah "-c", yang semuanya dalam tanda kutip. Tapi agar bisa bekerja di ujung yang lain, masih membutuhkan tanda kutip, jadi saya harus meletakkan tanda kutip lolos di dalamnya.
Dari java, inilah yang berhasil:
Butuh sedikit percobaan & kesalahan agar ini berfungsi, tetapi tampaknya berfungsi dengan baik sekarang.
sumber
Tampaknya cukup nyaman bagi saya untuk memiliki sesi tmux jarak jauh menggunakan
tmux new -d <shell cmd>
sintaks seperti ini:Ini akan meluncurkan sesi baru di
elsewhere
host dan perintah ssh pada mesin lokal akan kembali ke shell hampir secara instan. Anda kemudian dapat ssh ke host jarak jauh dantmux attach
ke sesi itu. Perhatikan bahwa tidak ada apa pun tentang tmux lokal yang berjalan, hanya jarak jauh!Juga, jika Anda ingin sesi Anda berlanjut setelah pekerjaan selesai, cukup tambahkan peluncur shell setelah perintah Anda, tetapi jangan lupa untuk menyertakan tanda kutip:
sumber
Ini harus menjalankan perintah dan menetapkan id proses yang Anda dapat dengan mudah mengekor-LOG.log ANDA untuk melihat hasil yang tertulis padanya saat terjadi. Anda dapat keluar kapan saja dan proses akan berlanjut
sumber
Anda dapat melakukan ini tanpa nohup:
sumber
Saya pikir inilah yang Anda butuhkan: Awalnya Anda harus menginstal
sshpass
di mesin Anda. maka Anda dapat menulis skrip Anda sendiri:sumber
Pertama ikuti prosedur ini:
Masuk pada A sebagai pengguna a dan hasilkan sepasang kunci otentikasi. Jangan masukkan frasa sandi:
Sekarang gunakan ssh untuk membuat direktori ~ / .ssh sebagai pengguna b pada B. (Direktori mungkin sudah ada, yang tidak masalah):
Terakhir, tambahkan kunci publik baru a ke b @ B: .ssh / otor_keys dan masukkan kata sandi b terakhir kali:
Mulai sekarang Anda dapat masuk ke B sebagai b dari A tanpa kata sandi:
maka ini akan berfungsi tanpa memasukkan kata sandi
ssh b @ B "cd / some / direktori; program-untuk-mengeksekusi &"
sumber