автоматически запускать экран при входе в систему через 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. Последующие входы в систему дали ожидаемый результат (повторное присоединение к сеансу экрана).

btanaka
источник
Благодарность! Я читал вокруг, и у меня сложилось впечатление, что мне понадобится exec screen -R. Рад, что это сработало
Рональд Дреган
Это плохая идея ставить logoutили exitсразу после этой строки st сессия ssh немедленно завершается после закрытия экрана ctrl + D?
Гриддо
Это не сработало для меня. Я запустил несколько десятков экранов, так как строка выполняется каждый раз, когда начинается сеанс. Как ты это сделал, чтобы этого не случилось?
Томас
11

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

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

Он проверяет, есть ли у вас сеанс экрана, и запускается, screen -Rесли нет. Без теста вы получаете «Прикрепление изнутри экрана?» предупреждение с экрана каждый раз, когда вы создаете новое окно экрана.

seq3
источник
+1 - это лучше, чем screen -lsтест, о котором говорил Тони
cwd
10

screen -RR подключится к первому доступному сеансу или создаст его при необходимости.

user1187902
источник
это было действительно полезно, так как использование screen -R вызывало у меня проблемы с несколькими сессиями.
Дэвид В.
Это здорово, спасибо! Он подключается к первому обнаруженному сеансу «Отдельно» (если он есть) и игнорирует присоединенные сеансы. Таким образом, он позволяет вам войти в систему и открыть несколько окон, но при этом убедиться, что каждый сеанс имеет защиту от запуска на экране. Наши сотрудники ОПС спасибо!
Ян МакГоуэн
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}в первой строке.

Николя Гарнье
источник