Почему перенаправление 'script' в / dev / null / позволяет 'screen' работать, пока он используется как другой пользователь?

37

Я был привлечен к пользователю для запуска определенного долго работающего скрипта. Я хотел использовать экран, но я получил сообщение об ошибке «Не удается открыть ваш терминал '/ dev / pts / 4' - пожалуйста, проверьте».

Так что я погуглил и наткнулся на сообщение на форуме, которое инструктировалось для запуска $ script '/dev/null/'. Я так и сделал, и тогда я смог посмотреть.

Почему это работает? Что делает su, что экран не может работать от имени пользователя su? Почему перенаправление 'script' в / dev / null делает это иначе? Использует ли скрипт скрипт для записи логов в качестве исходного пользователя куда-нибудь?

Ichorus
источник
2
Очиститель будет запускаться suиз сеанса экрана.
Justarobert
@justarobert нет, если вы хотите, чтобы несколько пользователей могли подключаться к одному и тому же экрану для учетной записи, выполняющей сервис / пакетный скрипт.
Эшли

Ответы:

41

Ну, технически вы ничего здесь не перенаправляете.

Вызов script /dev/nullпросто делает scriptсохранить всю машинопись в /dev/nullкоторый на практике означает отбрасывание содержимого.

Смотрите man scriptподробную информацию и пакет util-linux-ng для реализации ( misc-utils/script.c).

Это не имеет ничего общего с на screenсамом деле. Почему это работает вызывает scriptпобочный эффект создания псевдо-терминала для вас в /dev/pts/X. Таким образом, вам не придется делать это самостоятельно, и у экрана не будет проблем с разрешениями - если вы suпереходите от пользователя A к пользователю B , то при непосредственном вызове screenвы пытаетесь захватить владение псевдотерминалом пользователя A. Это не удастся, если вы не root . Вот почему вы видите сообщение об ошибке.

Karol J. Piczak
источник
6

Для вывода непосредственно в окно терминала запущенная программа должна иметь возможность записи на ваш управляющий терминал. Если вы используете xterm или ssh или другое виртуальное соединение (в отличие от реального живого терминала с прямым подключением), ваш управляющий терминал является псевдотермическим (pty).

Ваш pty настроен с правами на запись только для вас, когда вы входите в систему, в противном случае другие пользователи могут писать на вашем дисплее (или читать). Таким образом, когда вы выполняете su для другого пользователя (и этот пользователь не является пользователем root), этот пользователь не имеет доступа к базовому pty.

Тем не менее, более сложные операции ввода-вывода, такие как screen, требуют прямого доступа к pty, чтобы управлять магией всего экрана. Именно тогда вы столкнетесь с проблемами, когда у человека, выполняющего команду, нет надлежащего доступа к управляющему терминалу.

Перенаправление скрипта в / dev / null приводит к тому, что экран не пытается выполнить запись на управляющий терминал, поэтому он не сталкивается с проблемой прав доступа.

Фил Холленбек
источник
2
Так как же мне узнать, что пишет экран, если он переходит в / dev / null? Я почти уверен, что неправильно понял, и он не идет к / dev / null, но куда он девается?
user63623
«это», означающее вывод на экран, не идет в /dev/null. Во-первых: скрипт записывает ваш сеанс (см. Man-страницу), и он вам вообще не нужен: так что он идет в / dev / null. Но у него нет побочного эффекта: он создает псевдотерминал, и теперь вы его используете, и screen может писать в ответ этого oneSee @ karol-piczak.
Нанн