В моей системе есть демон, он запускается внутри экземпляра экрана, и все это делается от непривилегированного пользователя. Я добавил себя в специальную группу sudo, что позволяет мне запускать экран от этого пользователя, но когда я пытаюсь его использовать, например
sudo -u that_user -H /usr/bin/screen -R
Я понял тему этого поста.
Покопавшись, я обнаружил, что это сообщение означает, что экран не может захватывать или выводить данные на pty, который я фактически использую при его вызове. Обычный ответ на это - chmod мой / dev / pts / N, чтобы он был rw для других, но я помню, что мне как-то удавалось избежать этого раньше. Может, я пропустил сохранение среды для sudo?
В частности, я пытаюсь подключиться к демону rtorrent, запущенному на экране обычного пользователя, через sudo, ОС - Gentoo amd64. Вот как вызывается экран из rc-скрипта:
start-stop-daemon \
--start \
--make-pidfile \
--pidfile /var/run/rtorrentd.pid \
--background \
--user $USER \
--env HOME="${PWHOME:-/home/$USER}" \
--name rtorrent \
--exec /usr/bin/screen -- -D -m -S rtorrentd /usr/bin/rtorrent
Наконец, реальное решение получилось:
alias rtorrent="urxvt -hold -e /bin/bash -c \"chmod o+rw \\\`tty\\\` && sudo -u rtorrent -H screen -r rtorrentd\""
Поскольку вы бежите screen
как специальный пользователь, специальный пользователь должен иметь доступ к вашему pty. Единственный способ добиться этого - изменить разрешения на устройстве.
Лучшим подходом является использование многопользовательской функции экрана, которая позволяет пользователям подключаться к сеансу экрана другого пользователя без использования sudo. Для этого необходимо установить screen
двоичный setuid root:
sudo chmod u+s /usr/bin/screen
Затем создайте новый сеанс экрана, присвоив сокету значимое имя:
screen -S torrent
В этом сеансе экрана включите многопользовательский режим и авторизуйте других пользователей:
^A: multiuser on
^A: acladd tijagi
После этого вы сможете прикрепить сеанс экрана от имени себя:
screen -x that_user/torrent
Право собственности на терминальное устройство не меняется при использовании sudo, но изменение его разрешений на самом деле не единственное решение (хотя и не лучшее решение, потому что оно открывает дыру в безопасности).
Обычный подход - запустить сеанс «скрипта» (но не сохранять вывод, отправлять его в корзину), который работает, потому что он использует другое терминальное устройство.
sudo -su USER script -c bash /dev/null
# new terminal with sufficient permissions for screen
screen -R
Или все в одной команде, например, как псевдоним в вашем .bashrc
:
alias user-screen-attach='sudo -su USER script -c "screen -x" /dev/null'