Sudo как другой пользователь и рабочий экран

167

Сегодня выяснилось, что запуск экрана от имени другого пользователя, в который я могу войти, не будет работать!

т.е.

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

У меня есть скрипт, который запускается как «монитор» пользователя. Мы запускаем его в сеансе экрана, чтобы увидеть результат на экране. Проблема в том, что у нас есть ряд пользователей, которые входят в систему со своей учетной записью (например, bob, james, susie и т. Д.), А затем они переходят в пользователя «monitor». Предоставление им доступа к «монитору» пользователя не может быть и речи.

luckytaxi
источник
13
Это ошибка, которую вы получаете? «Невозможно открыть ваш терминал '/ dev / pts / 0' - проверьте."
Джим
да это тот. Я понимаю, почему это происходит, но есть ли обходной путь?
luckytaxi
4
Комментарий к вашим командам - ​​я продолжаю видеть бегущих людей sudo su "user" -. Почему бы не использовать sudo -u user -s?
Эндрю Айлетт
2
@Jim: +1 за предоставление отсутствующего сообщения об ошибке.
Деннис Уильямсон
1
@ Andrew Большинство парней, которых я знаю, знают sudo su- я думаю, что это то, к чему люди привыкли (в моем случае это потому, что вам не нужно знать какие-либо флаги sudo sudo su- я не думаю, что когда-либо читал man-страницу sudo :)
voretaq7

Ответы:

246

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

voretaq7
источник
5
Re: последствия для безопасности, о которых я ничего не знаю (но это не значит, что их нет :) - IIRC полагается на побочный эффект «сценария» открытия нового оконечного устройства (когда пользователь его вызывает) и так как вы отправляете вывод скрипта в / dev / null, нечего захватывать. Это также определенно более безопасно, чем добавление пользователей в группу tty (IMHO)
voretaq7
2
@nalply Честно говоря, вам не следует путать несколько оболочек, если вы являетесь системным администратором Unix - то scriptесть можно использовать для запуска screen. Тогда вам нужно только выйти дважды (один раз screen, один раз su). (Это то, что scriptman-страница может прояснить для вас, если вы потратите время на ее чтение ...)
voretaq7
10
Или просто беги sudo -u bob script -q -c 'screen -dr myscreen' /dev/null. Тогда у вас есть только один терминал для выхода / отсоединения.
Энди Шульман
4
Спасибо, это спасло меня. Но почему это исправить? Из того, что я понимаю, он печатает все от стандартного до ... нигде. И это как-то исправляет экран.
Судо
3
@sudo Чтобы сделать это, откройте scriptсобственное tty-устройство, принадлежащее пользователю, который его запустил (загляните внутрь, /devи вы увидите, что оно появилось после запуска script). screenзатем захватывает это tty устройство (которое принадлежит пользователю, работающему, screenчтобы у него не было проблем с доступом к нему). Это полная хакерская работа, но она работает. Глядя на некоторые из моих машин, кажется, что новые версии экрана, кажется, устанавливают setuid-root, который также работает, но означает, что у вас есть другой бинарный файл setuid-root, который делает некоторых людей оправданно неудобными.
voretaq7
33

Я использую функцию обертки screenдля пользователя (ей), что я sudo su. Это функция-обертка, которую я добавил для пользователя (ей) ~/.bashrc:

экран функции () {
  / usr / bin / script -q -c "/ usr / bin / screen $ {*}" / dev / null
}

Это позволяет мне использовать все параметры и параметры, screenкоторые я мог бы использовать. Я обдумываю возможность использования этой функции в масштабе всей системы.

steviethecat
источник
1
Работает отлично. Для тех, кто хочет использовать эту систему в целом, я рекомендую добавить ее в /etc/bash.bashrc - работает для всех пользователей.
Someguy123
2
Это не приведет к правильному выводу аргументов на экран, иначе будет хорошим решением.
Авгурар
7

Предполагая, что они в любом случае SSHing к хосту, вы можете добавить открытые ключи ssh для каждого пользователя, которому требуется доступ к учетной записи монитора, в файле ~ monitor / .ssh / authorized_keys. Затем на удаленной машине каждого пользователя они могут работать

ssh -t monitor@remote.machine screen -RD

Alex
источник
Это еще один хороший подход - вы должны будете указывать принудительные команды в файле авторизованных ключей (в соответствии с указанием luckytaxi «предоставить им доступ к пользователю« monitor »не может быть и речи» выше - принудительные команды могут ограничить их только прикрепление экрана сеанса)
voretaq7
2
Я не был уверен, как ответить на этот вопрос в своем ответе, потому что он сказал: «предоставить им доступ ... не может быть и речи», но также сказал: «... они превращаются в пользователя« монитора »». Но я согласен, что принудительное ограничение команд в авторизованных ключах должно позаботиться об этом.
Алекс
7

Предполагая, что мы говорим об этой ошибке:

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

Вот одна строка (например, может использоваться как «псевдоним гобоб»):

sudo su - bob -c "script -c bash /dev/null"'

Объяснение:

Это запустит оболочку (например, login shell) от имени пользователя bob. Запускается пользовательский bob script, которому предписывается вызывать bash (может быть dash или ksh ...), и копия сеанса выбрасывается.

basic6
источник
0

Вероятно, придется изменить разрешения для рассматриваемого устройства или добавить монитор в группу, которая имеет разрешение на чтение этого устройства, что было бы моим первым уклоном. Но вам придется взвесить последствия безопасности для этого.

Барт Сильверстрим
источник
0

Вы говорите, что делаете:

sudo su "monitor" -

Я задаюсь вопросом о задней черте. Я обычно делаю:

sudo su - username

Тире (на странице su man) говорит su «сделать оболочку оболочкой для входа». Это означает, что он будет исходить из всех обычных сценариев запуска оболочки и правильно настраивать такие вещи, как PATH и HOME.

Даг Харрис
источник
3
Нет. sudo su - usernameи sudo su username -сделать то же самое.
Тим Людвински
-4

Я просто ударил эту проблему. Решил это chmod +rw $(tty)до запуска sudo. Проблема с этим решением состоит в том, что любой может после этого подключиться и отслеживать свой терминал.

Амос Шапира
источник
2
Похоже, отличное решение.
Эван Кэрролл
10
@EvanCarroll Это отличное решение, кроме той части, где оно дает всему миру доступ для чтения и записи к своему терминалу. Просто небольшая проблема безопасности - ни одна программа не будет заботиться об этом, за исключением, конечно, всего, что проверяет безопасность терминала перед принятием паролей ( gpgнапример). И, конечно же, он никогда не tty
попадет
Будьте осторожны : никогда не пробуйте это дома! это опасно !!!
ruizpauker