автоматично запустити екран при вході в ssh


19

Я читав про те, як автоматично запустити екран при переході sshна віддалений сервер. Я хотів би, щоб простий однолінійний додав до мого, .bash_profileщоб почати, screenколи я sshвходив, а НЕ виходив із віддаленого з'єднання, коли я відключаю екран.

Я шукав в exec screenі майже всі комбінації -d, -r, -Dі -Rта не можу зрозуміти, що мені потрібно прапори.

В ідеалі я б ssh whateverнабрав і зайшов у сервер на новому, screenабо він може повторно приєднати старий екран, я хотів би знати, як робити, щоб побачити, що мені подобається краще. Тоді я можу або ввести Ctrl adабо Ctrl dі він повернути мене до нормального sshавторизації для цього сервера (де ви б бачити MOTD). Звідти я можу screen -rповернутися на потрібний екран або натиснути Ctrl dзнову, щоб вийти.

Відповіді:


19

Простий screen -Rповинен зробити трюк.

Щоб підтвердити це, я додав screen -Rдо свого .bash_profile на віддаленому сервері, увійшов у систему, відключився від екрана і повернувся до звичайного запиту оболонки на віддаленому сервері. Також підтверджено .bashrc. Подальші входи давали очікуваний результат (повторне приєднання до екранного сеансу).


Спасибі! Я читав навколо, і я мав враження, що мені знадобиться exec screen -R. Радий, що це спрацювало
Рональд Дреган

Це погана ідея ставити logoutчи exitодразу після цього рядка st сеанс ssh негайно припиняється, коли екран закривається ctrl + D?
Griddo

Це для мене не вийшло. Я запустив кілька десятків екранів, оскільки рядок виконується кожного разу, коли починається сеанс. Як ти це зробив, щоб цього не сталося?
Томас

11

У мене виникли проблеми з створенням 40 сеансів каскадних екранів із деякими рішеннями під час запуску нового вікна або екранного сеансу. Мені вдалося усунути каскадний екран і створити новий сеанс, якщо такого не існувало:

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

Він перевіряє, чи перебуваєте ви на сеансі екрану і screen -Rчи працює він, якщо ви цього не робите. Без тесту ви отримуєте "Вкладення зсередини екрана?" попередження з екрана щоразу, коли ви створюєте нове вікно екрана.


+1 - як це краще, ніж screen -lsтест, про який згадував Тоні
квітня 1616

10

screen -RR приєднається до першого доступного сеансу або створить, якщо необхідно.


це було дуже корисно, оскільки використання екрана -R викликало у мене проблеми з декількома сесіями.
Девід В.

Це приголомшливо, дякую! Він підключається до першого знайденого сеансу "Окреме" (якщо такі є) та ігнорує додані сеанси. Таким чином, це дозволяє вам увійти та відкрити кілька вікон, але все ж переконайтесь, що кожен сеанс має захист роботи на екрані. Наші OPS люди дякую!
Ian McGowan

8

Якщо я розумію вашу потребу, спробуйте:

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

Він створить лише один екранний сеанс, інакше він відновиться до існуючого в режимі з декількома вікнами (навіть якщо у вас є декілька сеансів ssh, ви перейдете до того ж сеансу на екрані)


Мені подобається ця ідея за те, що ми визнали, що у нас є багатовіконні клієнти SSH (або іноді переходимо та входимо безпосередньо на машині). Це досить гнучко, якщо ви використовуєте щось на зразок Bitvise і у вас відкрито кілька термінальних вікон - ви можете перетворити окремі вікна екрана в окремі фізичні вікна.
Піку

1
Все це можна замінити на screen -xR, який, здається, розбирається як "приєднати, якщо є щось, до чого можна долучити, інакше зробити новий екран".
Пісквор вийшов з будівлі

0

Ось невелике розширення,

сценарій для bashrc перевірити, чи є більше одного сеансу окремого екрана. Якщо їх більше, то потрібно вибрати сеанс вручну. Якщо є окремий сеанс, ви повертаєтесь до цієї сесії. Якщо ви вийдете з сеансу, то і сеанс ssh закриється.

 #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

0

Якщо ви хочете автоматично підключитися до екранного сеансу під час підключення через SSH, додайте код нижче до свого .bash_profileабо свого .bashrcна віддаленій машині, це:

  • Почніть новий сеанс на екрані кожного разу при підключенні через SSH.
  • Повторне використання вже існуючого окремого сеансу екрана, завжди починаючи з останнього. Якщо відсутні окремі сеанси, він починає новий.
  • Коли ви відкриєте кілька підключень SSH до машини, ви отримаєте інший сеанс екрану, оскільки ми використовуємо лише повторно відокремлені.
  • Уникайте циклів у випадку, якщо ви додаєте сценарій до свого .bashrc

Ось сценарій:

#!/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: Якщо ви хочете включити це для локального терміналу, видаліть && ! -z "${SSH_CLIENT}у першому рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.