Назад | Перейти на главную страницу

Экран GNU: «Невозможно открыть терминал / dev / pts / 3» - проверьте »

В моей системе есть демон, он запускается внутри экземпляра экрана, и все это делается от непривилегированного пользователя. Я добавил себя в специальную группу 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'