secara otomatis memulai layar setelah login ssh

18

Saya telah membaca tentang cara memulai layar secara otomatis ketika saya sshke server jarak jauh. Saya ingin satu-liner sederhana untuk ditambahkan ke saya .bash_profileuntuk memulai screenketika saya sshmasuk, dan TIDAK keluar dari koneksi jarak jauh saya ketika saya melepaskan layar.

Saya telah melihat ke dalam exec screendan cukup banyak setiap kombinasi -d, -r, -Ddan -Rdan tidak tahu bendera apa yang saya butuhkan.

Idealnya saya akan mengetik ssh whateverdan login ke server di yang baru screenatau dapat memasang kembali layar lama, saya ingin tahu bagaimana melakukan keduanya untuk melihat mana yang saya sukai lebih baik. Kemudian saya bisa mengetik Ctrl adatau Ctrl ddan membawanya kembali ke sshlogin normal untuk server itu (di mana Anda akan melihat motd). Dari sana saya dapat screen -rkembali ke layar apa pun yang saya inginkan, atau tekan Ctrl dlagi untuk keluar.

Ronald Dregan
sumber

Jawaban:

18

Sederhana screen -Rharus melakukan triknya.

Untuk memverifikasi ini, saya menambahkan screen -Rke .bash_profile saya pada server jarak jauh, login, terlepas dari layar, dan dikembalikan ke prompt shell normal pada server jarak jauh. Diverifikasi dengan .bashrc juga. Info masuk berikutnya menghasilkan hasil yang diharapkan (pasang kembali ke sesi layar).

btanaka
sumber
Terima kasih! Saya membaca sekitar dan saya mendapat kesan bahwa saya akan membutuhkan layar exec -R. Senang ini berhasil
Ronald Dregan
Apakah itu ide yang buruk untuk diletakkan logoutatau exittepat setelah baris st sesi ssh segera diakhiri setelah layar ditutup oleh ctrl + D?
Griddo
Ini tidak berhasil untuk saya. Saya memulai beberapa lusin layar sejak garis dieksekusi setiap kali sesi dimulai. Bagaimana Anda melakukannya sehingga ini tidak terjadi?
Thomas
10

Saya memiliki masalah dengan 40 sesi layar cascading yang dibuat dengan beberapa solusi saat memulai jendela atau sesi layar baru. Saya bisa menghilangkan layar cascading dan membuat sesi baru jika tidak ada dengan ini:

if [ -z "$STY" ]; then screen -R; fi

Ini menguji apakah Anda berada di sesi layar dan berjalan screen -Rjika Anda tidak. Tanpa tes Anda mendapatkan "Melampirkan dari dalam layar?" peringatan dari layar setiap kali Anda membuat jendela layar baru.

seq3
sumber
+1 - menyukai ini lebih baik daripada screen -lstes yang disebutkan Tony
cwd
9

screen -RR akan menyambung kembali ke sesi pertama yang tersedia atau membuatnya jika perlu.

pengguna1187902
sumber
yang benar-benar berguna karena menggunakan layar -R menyebabkan saya bermasalah dengan beberapa sesi.
David V.
Ini luar biasa, terima kasih! Ini terhubung ke sesi "Terpisah" pertama yang ditemukan (jika ada), dan mengabaikan sesi terlampir. Jadi ini memungkinkan Anda untuk masuk dan membuka banyak jendela, tetapi tetap memastikan bahwa setiap sesi memiliki perlindungan untuk berjalan di layar. Orang-orang OPS kami berterima kasih!
Ian McGowan
8

Jika saya mengerti kebutuhan Anda, Anda harus mencoba:

if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi

Ini akan membuat hanya satu sesi layar, jika tidak maka akan menyambung kembali ke yang ada dalam mode multi-windows (bahkan jika Anda memiliki beberapa sesi ssh, Anda akan berakhir pada sesi layar yang sama)

Tony
sumber
Saya menyukai ide ini karena pengakuannya bahwa kami memiliki klien SSH multi-jendela (atau kadang-kadang masuk dan masuk langsung ke mesin). Ini cukup fleksibel jika Anda menggunakan sesuatu seperti Bitvise dan memiliki banyak jendela terminal terbuka - Anda dapat mengubah jendela layar individual menjadi jendela fisik terpisah.
Piku
1
Semua ini dapat diganti dengan screen -xR, yang tampaknya diurai sebagai "lampirkan jika ada sesuatu untuk dilampirkan, selain membuat layar baru".
Piskvor meninggalkan gedung
0

Di sini sedikit ekstensi,

skrip untuk bashrc memeriksa apakah ada lebih dari satu sesi layar terpisah. Jika ada lebih, maka Anda harus memilih sesi secara manual. Ketika ada sesi terpisah, Anda kembali ke sesi ini. Jika Anda keluar dari sesi maka sesi ssh akan menutup juga.

 #Start Screen
 if [ -z "$STY" ]; then

 value=$( screen -ls |grep '\<pts.*Detached\>' |wc -l )

 if [ $value -gt 1 ]; then

  screen -ls

 else

  screen -R

  echo 5 Sek. bis die SSH Session beendet wird.

  echo Strg + C - um ohne screen weiter zu arbeiten.

  sleep 6

  exit

 fi

fi
Thomas
sumber
0

Jika Anda ingin terhubung secara otomatis ke sesi layar ketika Anda terhubung melalui SSH, tambahkan kode di bawah ini ke Anda .bash_profileatau .bashrcdi mesin jarak jauh Anda, itu akan:

  • Mulai sesi layar baru setiap kali Anda terhubung melalui SSH.
  • Gunakan kembali sesi layar terpisah yang sudah ada , selalu mulai dengan yang terbaru. Jika tidak ada sesi terpisah yang tersedia, ia memulai yang baru.
  • Ketika Anda membuka beberapa koneksi SSH ke mesin Anda, Anda akan mendapatkan sesi layar yang berbeda karena kami hanya menggunakan yang terpisah.
  • Hindari loop jika Anda menambahkan skrip ke .bashrc

Ini skripnya:

#!/bin/bash
#
#  Attaches to the first Detached Screen. Otherwise starts a new Screen.

# Only run if we are not already inside a running screen and only if in an SSH session.
if [[ -z "${STY}" && ! -z "${SSH_CLIENT}" ]]; then
  detached_screens=($(screen -ls | grep pts | grep -v Attached))

  for screen in "${detached_screens[@]}"; do
    if [[ "${screen}" == *".pts"* ]]; then
      IFS='.pts' read -ra split <<< "${screen}"
      for id in "${split[@]}"; do
        first_id="${id}"
        break
      done 
      break
    fi
  done

  screen -R $first_id
fi

PS: Jika Anda ingin mengaktifkan ini untuk terminal lokal, hapus && ! -z "${SSH_CLIENT}pada baris pertama.

Nicolas Garnier
sumber