Як ефективно використовувати екран та SSH?


12

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

Відповіді:


9

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

Додайте до ~ / .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]

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


Я просто хотів додати, що комбінація клавіш 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-агент, по-друге, вона викликає функцію після призупинення на кілька секунд (якщо ви не хочете, щоб екран запускався).

Перше ifзастереження буде істинним, якщо -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функцію.


4

По-перше, якщо ви використовуєте byobu, ви можете налаштувати новий сеанс оболонки, щоб завжди автоматично запускати byobu (що по суті є приємною конфігурацією екрану, хоча нові версії можуть використовувати tmux як резервний). Якщо ви дійсно не хочете байбу, то, ймовірно, ви можете встановити екран для підключення вручну, відредагувавши ваш .profileабо інший скрипт конфігурації оболонки, exec screenякщо TERM != "screen".

Якщо вам це не подобається, ви можете використовувати authorized_keysфайл для запуску певної команди для з'єднань із певним ключем (і у вас може бути стільки клавіш, скільки вам потрібно). Детальніше man sshdдивіться. Я б запропонував вам зробити команду запустити скрипт, який перевіряє, чи екран запущений і підключається, інакше починається новий сеанс.

Що стосується відключення на Ctrl-D, екран дозволяє налаштувати відображення ключів у вашому .screenrc. Детальніше man screenдивіться. Ви шукаєте "bindkey".


2

Можливо, це абсолютно не має значення для вашого питання, але ви коли-небудь думали використовувати TMUX замість цього. Це робить багато функціональних можливостей, які ви шукаєте поза коробкою.

Напр. якщо ви від'єднаєтесь від сеансу SSH, коли ви перебуваєте під TMUX, все, що вам потрібно зробити, - це схити назад і запустити "tmux a", щоб приєднатися до сеансу. Оскільки я почав використовувати TMUX, я забув, що таке команди nohup / disown ... якщо вам потрібно щось запустити та вийти - запустіть його всередині tmux та від'єднайте. Вихід команди буде буферизований, тому ви зможете переглянути його пізніше.

щоб автоматично приєднатись, ви можете додати щось подібне нижче до .bashrc:

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

або навіть простіше

tmux a 2>/dev/null

Він має менший слід пам’яті та загальний IMHO значно кращий / простіший у використанні варіант.

Ярлик мета-d - це відображення за замовчуванням для від'єднання в TMUX.


0

screen -dAr default || screen -AS defaultпрацює для мене. Я додаю це до мого ~ / .bashrc .

Коротке пояснення перемикачів:

  • d - Від'єднайте екран, якщо він ще доданий, з іншого сеансу.
  • A - адаптуйте вікна на екрані до нового розміру терміналу.
  • r default - Додайте до екрану, який називається за замовчуванням.

Якщо перша команда екрана (перша раніше ||) не вдається, виконується друга:

  • A - Як було пояснено вище ...
  • S default- Створіть новий сеанс на екрані з типовим іменем .

0

Я пропоную використовувати byobu . Цей інструмент використовує tmux та забезпечує приємну панель інструментів та інші зручні засоби перемикання вікон, гарячі клавіші тощо.

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

За допомогою цих вище команд після успішного входу в систему SSH спробуйте спробувати приєднатись до існуючого сеансу byobu-tmux, якщо ні, це створить новий сеанс.

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