У моєму .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
функцію.