Вам необходимо screen -R -d
автоматически подключиться к существующему сеансу, если таковой существует, и создать сеанс в противном случае.
Убедитесь, что вы делаете это только на интерактивных оболочках . Bash исходники ~/.bashrc
даже для неинтерактивных оболочек, когда его родительским процессом является rshd или sshd (это упоминается в документации, но его легко пропустить). Вы можете сказать, что оболочка является интерактивной, потому что $-
содержит i
.
case $- in
*i*) screen -Rd;;
esac
Это не позволит вам легко запускать разные сеансы экрана в разных терминалах.
Вам нужно отсоединиться от экрана, а затем выйти из родительской оболочки, чтобы выйти из системы. Это можно решить, используя exec screen
вместо screen
.
Если вы запустите оболочку, отличную от оболочки входа в систему, вы попадете на экран, а это не то, что вам нужно в большинстве случаев. Я бы по крайней мере ограничил это тем, когда вы работаете непосредственно в интерактивном сеансе SSH, с чем-то вроде следующего ~/.bash_profile
:
case "/$(ps -p $PPID -o comm=)" in
*/sshd) screen -R -d;;
esac
Будьте осторожны, когда вы делаете сложные вещи, так .bashrc
как ошибка, которая приводит к выходу оболочки, затруднит вход в систему.
Я рекомендую не изменять файлы инициализации оболочки на сервере, а вместо этого запускать экран явно из клиента, как в
ssh -t host.example.com screen -R -d
(Вы, вероятно, создадите псевдоним оболочки или ярлык среды рабочего стола на клиенте.) Таким образом, вы можете легко не запускать экран, указывать альтернативное имя сеанса и т. Д.