Как эффективно использовать экран и SSH?

12

Я хотел бы настроить SSH и экран таким образом, чтобы при входе в систему всегда использовался экранный сеанс. В идеале, эта сессия не будет прекращаться, но будет отключена, когда я нажму Cd. Как этого достичь? И какие еще полезные настройки существуют для облегчения моей SSH-жизни?

Тобиас Кинцлер
источник

Ответы:

9

Я просто сделал следующее для всех своих серверов, чтобы при подключении через SSH я автоматически включался в сеанс Screen.

Добавьте следующее в ~ / .bashrc для ваших учетных записей:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Это запустит сеанс экрана с именем main, если он не существует, или повторно подключится к нему, если он существует. Это было сделано, потому что у меня есть несколько других сеансов экрана, запущенных отдельно для различных сервисов, и я не хотел подключаться к ним.

Демон Хаоса
источник
Я просто хотел добавить, что комбинация клавиш CTRL-d является стандартной на экране, чтобы отсоединиться от сеанса рабочего экрана.
Демон Хаоса
8

У меня есть следующее .bash_profile на моих удаленных серверах:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Это делает две вещи: во-первых, устанавливает функцию оболочки для замены оболочки и переноса соединения ssh-agent, во-вторых, она вызывает функцию после паузы в течение нескольких секунд (если вы не хотите, чтобы экран запускался).

Первое ifпредложение будет истинным, если еще не запущенный screen ( -z "${STY}") подключен к терминалу ( -t 0), а я не запускаю sudo (который иногда не меняется $USER).

reattachФункция будет сначала проверить , если SSH был вызван с портом SSH-агент активным ( -n "${SSH_AUTH_SOCK}"). Затем он заменит все, что находится в ~/.ssh/agent-scriptтекущем активном файле сокета, и заменит переменную среды ( $SSH_AUTH_SOCK) новым значением. Затем скрипт заменит текущую оболочку одним screenсеансом (убедившись, что должен существовать только один). Все аргументы reattachфункции передаются в команду ( ${1:+"$@"}).

Последняя часть сначала удаляет все мертвые сессии ( screen -wipe), сообщает пользователю (мне), что экран скоро запустится, и вместо этого может вернуться в оболочку, нажав Ctrl- C. Затем он ждет 5 секунд и вызывает reattachфункцию.

Arcege
источник
4

Во-первых, если вы используете byobu, вы можете настроить новый сеанс оболочки, чтобы всегда автоматически запускать byobu (что, по сути, является хорошей конфигурацией экрана, хотя более новые версии могут использовать tmux в качестве бэкэнда). Если вы действительно не хотите byobu, вы можете настроить экран для подключения вручную, отредактировав свой .profileили другой скрипт конфигурации оболочки в exec screenif TERM != "screen".

Если вам это не нравится, вы можете использовать authorized_keysфайл для запуска определенной команды для соединений с определенным ключом (и вы можете иметь столько ключей, сколько захотите). Смотрите man sshdподробности. Я бы посоветовал вам заставить команду запустить скрипт, который проверяет, работает ли экран и подключается, или же запускает новый сеанс.

Что касается отключения на Ctrl-D, экран позволяет вам настроить сопоставления клавиш в вашем .screenrc. Смотрите man screenподробности. Вы ищете "Bindkey".

военно-картографическая служба
источник
2

Может быть, совершенно не имеет отношения к вашему вопросу, но вы когда-нибудь задумывались об использовании TMUX вместо этого. Он выполняет множество функций, которые вы ищете из коробки.

Например. если вы отключаетесь от сеанса SSH, когда находитесь под TMUX, все, что вам нужно сделать, это вернуться по ssh и запустить «tmux a», чтобы подключиться к вашему сеансу. Так как я начал использовать TMUX, я забыл, что такое команды nohup / disown ... если вам нужно что-то запустить и выйти из системы - запустите его внутри tmux и отсоедините. Вывод команды будет буферизован, поэтому вы можете просмотреть его позже.

для автоматического присоединения вы можете добавить что-то похожее на .bashrc:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

или даже проще

tmux a 2>/dev/null

Он имеет меньший объем памяти и в целом ИМХО гораздо лучше / проще в использовании.

Ярлык meta-d является отображением по умолчанию для отключения в TMUX.

Alex
источник
0

screen -dAr default || screen -AS defaultработает для меня. Я добавляю это к моему ~ / .bashrc .

Кратко объясняя переключатели:

  • d - Отсоедините экран, если он все еще подключен, от другого сеанса.
  • A - Адаптируйте окна на экране к новому размеру терминала.
  • r default - Прикрепить к экрану под названием по умолчанию.

Если первая экранная команда (предыдущая ||) не выполняется, запускается вторая:

  • A - Как объяснено выше ...
  • S default- Создайте новый сеанс экрана с именем по умолчанию .
Batandwa
источник
0

Я предлагаю использовать Бёбу . Этот инструмент использует tmux и предоставляет хорошую панель инструментов и другие удобные средства переключения окон, горячие клавиши и т. Д.

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

С помощью приведенных выше команд после успешного входа в систему по SSH попытайтесь подключиться к существующему сеансу byobu-tmux, в противном случае он создаст новый сеанс.

Sandeep
источник