Судо як різний користувальницький і запущений екран


167

Дізнався сьогодні, що запущений екран як іншого користувача, до якого я судо, не працюватиме!

тобто

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

У мене є сценарій, який працює як "монітор" користувача. Ми запускаємо його на екрані, щоб побачити вихід на екрані. Проблема полягає в тому, що у нас є декілька користувачів, які входять у свій обліковий запис (наприклад, bob, james, susie тощо), а потім вони входять до користувача "монітора". Надання їм доступу до "моніторного" користувача не підлягає сумніву.


13
Це помилка, яку ви отримуєте? "Неможливо відкрити свій термінал '/ dev / pts / 0' - перевірте."
Джим

так, це один. Я розумію, чому це відбувається, але чи існує рішення?
luckytaxi

4
Коментар до ваших команд - я постійно бачу людей, що бігають sudo su "user" -. Чому б не використовувати sudo -u user -s?
Ендрю Ейлетт

2
@Jim: +1 для надсилання відсутнього повідомлення про помилку.
Денніс Вільямсон,

1
@Andrew Більшість хлопців, яких я знаю, sudo su- я думаю, що це просто те, до чого звикають люди (в моєму випадку це тому, що вам не потрібно знати жодних прапорів судо-до sudo su- я не думаю, що я ніколи не читав манекенник судо :)
voretaq7

Відповіді:


245

Спробуйте запуститись script /dev/nullяк користувач, який ви маєте, suперш ніж запустити екран - це маленьке гетто злому, але це повинно зробити екран щасливим.


5
Re: наслідки для безпеки, жодного я не знаю (але це не означає, що їх немає :) - IIRC це покладається на побічний ефект "скрипту" відкриття нового термінального пристрою (як користувач викликає його) , а оскільки ви надсилаєте вихід скрипта в / dev / null, нічого не можна захопити. Це, безумовно, безпечніше, ніж додавати користувачів до групи tty (IMHO)
voretaq7

2
@nalply Чесно кажучи, ви не повинні знаходити кілька оболонок заплутаним, якщо ви системний адміністратор Unix - це було сказано, scriptщо для запуску можна використовувати screen. Тоді вам доведеться лише двічі вийти (один раз screen, один раз su). (Це те, що ця scriptсторінка може уточнити для вас, якщо ви знайдете час, щоб її прочитати ...)
voretaq7

10
Або просто бігати sudo -u bob script -q -c 'screen -dr myscreen' /dev/null. Тоді у вас є лише один термінал для виходу / відключення.
Енді Шульман

4
Дякую, це мене врятувало. Але чому це це виправляє? З того, що я розумію, він друкує все, від stdout до ... ніде. І це якось виправляє екран.
судо

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які я б хотів використовувати. Я роздумую над тим, як цю функцію використовувати в усьому світі.


1
Працює чудово. Для тих, хто хоче цю систему, я рекомендую додати її до /etc/bash.bashrc - працює для всіх користувачів.
Someguy123

2
Це не наводить аргументи на екрані правильно, інакше хороше рішення.
серпень

7

Якщо припустити, що вони все-таки SSHing переходять у хост, ви можете додати відкриті ключі ssh для кожного користувача, якому потрібен доступ до облікового запису монітора у файлі ~ monitor / .ssh / санкціонований_кейс. Потім на віддаленій машині кожного користувача вони можуть працювати

ssh -t monitor@remote.machine -RD


Це ще один хороший підхід - вам потрібно буде вказати примусові команди у файлі авторизованих ключів (хоча, згідно з посиланням на luckytaxi "надання їм доступу до" монітора "користувача не викликає сумнівів), зверніть увагу вище - примусові команди можуть обмежити їх лише приєднання екранного сеансу)
voretaq7

2
Я не знав, як вирішити це у своїй відповіді, тому що він сказав, що "надати їм доступ ... не виникає сумніву", але також сказав "... вони надіслані на" монітора "користувача". Але я погоджуюсь, примушуючи це забороняти примушення обмеження команд у санкціонованих_ ключах.
Олексій

7

Припустимо, що ми говоримо про цю помилку:

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

Ось один вкладиш (може бути використаний як "псевдонім gobob", наприклад):

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

Пояснення:

Це запустить оболонку (як оболонку входу) як bob користувача. Запускається bob користувача script, який повідомляється викликати баш (може бути тире або ksh ...), а копія сеансу викидається.


0

Можливо, доведеться змінити дозволи на розглянутому пристрої або додати монітор до групи, яка має дозвіл читати цей пристрій, це було б моїм першим нахилом. Але вам доведеться зважити наслідки безпеки для цього.


0

Ви кажете, що робите:

sudo su "monitor" -

Мені цікаво про задніх тире. Я зазвичай роблю:

sudo su - username

Тире (на сторінці su man) говорить su, щоб "зробити оболонку оболонкою для входу". Це означає, що він створить всі звичні сценарії запуску оболонки і правильно встановить такі речі, як PATH та HOME.


3
Ні. sudo su - usernameі sudo su username -робити те саме.
Тім Людвинський

-4

Я просто потрапив на цю проблему. Вирішили це chmod +rw $(tty)перед тим, як запустити судо. Проблема цього рішення полягає в тому, що після цього кожен може підключитися і прослухати ваш термінал.


2
Звучить як чудове рішення.
Еван Керролл

10
@EvanCarroll Це чудове рішення, за винятком тієї частини, де він надає всьому світу доступ для читання і запису до свого терміналу. Лише незначна проблема із безпекою - жодна програма не підозрюватиме про це, крім звичайно нічого, що перевіряє безпеку терміналу перед тим, як приймати паролі ( gpgнаприклад). І, звичайно, він ніколи не буде в системі зі зловмисними користувачами, які б дивилися ttyта
нюхали

Будьте попереджені : ніколи не пробуйте цього вдома! це небезпечно !!!
ruizpauker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.