GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara melepaskan sesi ssh tanpa mematikan proses yang sedang berjalan?

Gunakan

Ctrl-Z

untuk menjeda aplikasi dan kembali ke baris perintah. Lalu gunakan

bg

untuk memungkinkan proses untuk melanjutkan di latar belakang. Terakhir gunakan

disown

Agar proses tidak ditutup saat Anda memutus sesi dan menutup terminal.

Proses akan terus berjalan tetapi tidak ada cara untuk 'memasang kembali' ke terminal untuk melihat keluaran yang saya ketahui jika Anda menyambungkan kembali ke sesi baru.


Gunakan reptyr

Inilah kasusnya man 1 reptyr secara eksplisit menyebutkan:

reptyr adalah utilitas untuk mengambil program yang sedang berjalan dan melampirkannya ke terminal baru. Memulai proses yang berjalan lama melalui ssh, tetapi harus keluar dan tidak ingin menghentikannya? Mulai saja screen , gunakan reptyr untuk mengambilnya, lalu matikan sesi ssh dan kembali ke beranda.

(Manual menyebutkan screen , Anda dapat menggunakan tmux sebagai gantinya, mana saja yang Anda suka).

Jangan lewatkan catatan ini:

reptyr tergantung pada ptrace(2) panggilan sistem untuk dilampirkan ke program jarak jauh. Di Ubuntu Maverick dan yang lebih tinggi, kemampuan ini dinonaktifkan secara default karena alasan keamanan. Anda dapat mengaktifkannya sementara dengan melakukan

echo 0 > /proc/sys/kernel/yama/ptrace_scope

sebagai root, atau secara permanen dengan mengedit file /etc/sysctl.d/10-ptrace.conf , yang juga berisi lebih banyak informasi tentang setelan ini.

Jika file tidak ada selain /etc/sysctl.d/ direktori melakukannya, maka mungkin cukup membuatnya dengan konten berikut:

kernel.yama.ptrace_scope = 0

Pengaturan akan diterapkan pada reboot berikutnya. Silakan lihat pertimbangan keamanan di bawah.

Penggunaan dasar

Penggunaan dasarnya sederhana:

reptyr PID

di mana PID adalah PID dari proses yang ingin Anda lampirkan ke terminal baru. Perhatikan reptyr hanya melampirkan proses ke terminal lain. Ini tidak berarti proses menjadi turunan dari shell baru.

Pertimbangan keamanan

Menyetel ptrace_scope sebagai 0 tidak disarankan.

Seiring semakin populernya Linux, itu akan menjadi target malware yang lebih besar. Satu kelemahan yang sangat meresahkan dari antarmuka proses Linux adalah bahwa satu pengguna dapat memeriksa memori dan menjalankan status dari setiap proses mereka. Misalnya, jika satu aplikasi (mis. Pidgin) dikompromikan, penyerang dapat melampirkan ke proses lain yang sedang berjalan (mis. Firefox, sesi SSH, agen GPG, dll) untuk mengekstrak kredensial tambahan dan terus memperluas cakupan aplikasi mereka. serangan tanpa menggunakan phishing yang dibantu pengguna.

Ini bukan masalah teoretis. Serangan pembajakan sesi SSH (http://www.storm.net.nz/projects/7) dan injeksi kode arbitrer (http://c-skills.blogspot.com/2007/05/injectso.html) sudah ada dan tetap ada mungkin jika ptrace diperbolehkan beroperasi seperti semula. Sejak ptrace tidak umum digunakan oleh non-pengembang dan non-admin, pembuat sistem harus diberi opsi untuk menonaktifkan sistem debug ini.

[…]

Pengaturan sysctl (hanya dapat ditulis dengan CAP_SYS_PTRACE ) adalah:

0 - klasik ptrace izin:suatu proses dapat PTRACE_ATTACH ke proses lain yang berjalan di bawah uid yang sama, asalkan dapat dibuang […]

1 - ptrace terbatas :suatu proses harus memiliki hubungan yang telah ditentukan sebelumnya dengan inferior yang ingin dipanggilnya PTRACE_ATTACH pada. Secara default, hubungan ini hanya keturunannya jika kriteria klasik di atas juga terpenuhi. […]

2 - lampiran khusus admin:hanya memproses dengan CAP_SYS_PTRACE dapat menggunakan ptrace dengan PTRACE_ATTACH , atau melalui panggilan anak PTRACE_TRACEME .

3 - tidak melampirkan:tidak ada proses yang dapat menggunakan ptrace dengan PTRACE_ATTACH maupun melalui PTRACE_TRACEME . Setelah disetel, nilai sysctl ini tidak dapat diubah.

Pendekatan yang masuk akal adalah menyetel ptrace_scope ke 2 lalu izinkan reptyr untuk menggunakan ptrace :

echo 2 | sudo tee /proc/sys/kernel/yama/ptrace_scope
sudo setcap CAP_SYS_PTRACE+pe /usr/bin/reptyr

Jangan lupa tentang file yang menyimpan pengaturan permanen.

Kemampuan disimpan dalam inode file. Oleh karena itu saya tidak akan terkejut jika reptyr kehilangan kemampuan saat diperbarui (secara atomik diganti dengan yang dapat dieksekusi baru).


Anda benar-benar dapat memisahkan perintah (dalam bash atau zsh , mungkin shell lain) dengan disown memerintah. Namun perintah mungkin tidak senang dengan hal ini jika membutuhkan tty, dalam hal ini lihat reptyr jawab.

$ ssh somecentos7system
-bash-4.2$ sleep 252727
^Z
[1]+  Stopped                 sleep 252727
-bash-4.2$ bg
[1]+ sleep 252727 &
-bash-4.2$ disown
-bash-4.2$ logout
Connection to somecentos7system closed.
$ ssh somecentos7system
-bash-4.2$ pgrep -lf 252727
20089 sleep
-bash-4.2$ 

Pilihan lainnya adalah memulai sesi layar (atau tmux) secara otomatis sehingga Anda tidak dapat lupa untuk memulainya karena sesi tersebut sudah dimulai untuk Anda karena Anda mengaturnya seperti itu. Ada pos lain di tempat lain tentang cara melakukannya.


Linux
  1. Ssh – Bagaimana Cara Menyangkal Proses yang Berjalan Dan Mengaitkannya ke Shell Layar Baru?

  2. Bagaimana Cara Melihat Output Dari Proses yang Berjalan Di Sesi Bash Lain?

  3. Bagaimana Cara Memulai Ulang (atau Mengatur Ulang) Proses yang Berjalan Di Linux?

  1. Bagaimana cara menghentikan proses layar di linux?

  2. Bagaimana cara mematikan proses yang berjalan pada port tertentu di Linux?

  3. Bagaimana cara memaksa melepaskan Layar dari sesi SSH lain?

  1. Bagaimana cara mengakhiri koneksi SSH yang tidak responsif di linux?

  2. Ssh – Biarkan Proses Tetap Berjalan Setelah Sesi Ssh Terputus?

  3. Bagaimana cara melampirkan terminal ke proses yang terpisah?