LINUX.ORG.RU

can't access tty; job control turned off

 ,


0

2

Делаю в скрипте

# Скрипт запущен от рута\sudo. Надо дать пользователю его шелл
su $user -c /bin/sh

Получаю шелл и в прибавку к нему: «/bin/sh: 0: can't access tty; job control turned off».

Если запустить что-то и сделать ^C, то все поломается нафиг:

/bin/sh: 0: can't access tty; job control turned off
$ ping ya.ru 
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=54 time=27.1 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=54 time=28.6 ms
^C
Сеанс завершён, выполняется завершение оболочки…
--- ya.ru ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 27.149/27.897/28.646/0.766 ms

$ exit
 … ожидает завершения потомка.

Так что не работает.

В инете такую штуку нашел только если ОСь не грузится или когда делают sh /dev/console. Тут просто sh. Как лечить?

Xubuntu 16.04

★★★★★

Последнее исправление: PPP328 (всего исправлений: 2)

Скрипт запущен от рута. Надо дать пользователю его шелл
su $user -c /bin/sh

/bin/sh оболочкой пользователя, скорее всего, не является.

user@maria:~
$ cat /tmp/ppp328
#!/bin/bash -x

su $SUDO_USER

user@maria:~
$ sudo /tmp/ppp328
+ su user

user@maria:~
$ exit

user@maria:~
$
Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

На su $user -c «/bin/bash -x» он выплевывает содержимое какого-то конфига, а перед этим это:

bash: невозможно установить группу терминального процесса (-1): Неприменимый к данному устройству ioctl
bash: в этой оболочке нет управления задачей

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

И? Зачем вы вообще попытались сделать эту глупость?

Zmicier ★★★★★
()
Ответ на: комментарий от PPP328

setsid

Эм? Мне надо одним файлом.

И? Где противоречие?

Но повторю — делать это просто излишне.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

su(1) разве сам не вызывает setsid(2)?

А вы прочитайте man. при -с не вызывает, и прямо так в man-е и написано.

vodz ★★★★★
()
Ответ на: комментарий от vodz

А вы прочитайте man. При -с не вызывает, и прямо так в man-е и написано.

Ну, во-первых, давайте прочитаем.

       -c, --command COMMAND
           Specify a command that will be invoked by the shell using
           its -c.

           The executed command will have no controlling
           terminal. This option cannot be used to execute interactive
           programs which need a controlling TTY.

Как видите, нет.

А во-вторых, какая еще «-c», когда нужно ровно обратное?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Бинго! Проблема с -c.

Вот сколько себе говорил, что с вами спорить — только расстраиваться. В попытке показать, что вы непогрешимы вы идёте на полный подлог и такое кривляение, что руки опускаются... Какое нафиг бинго? Вы оба с ТСом не могли полсуток прочитать man su, а теперь лицедействуете «там написано наооборот, а нам надо наоборот». Тьфу.

vodz ★★★★★
()
Ответ на: комментарий от PPP328

НУ ок, я дурак. И чо как решать?

Да не, это нормально. Ведь job control — весьма специфическая часть каждой ОС и не такая простая вещь сама по себе. Просто надо понимать, что захват терминала для управления задачами на нём — это одно из привелегий, даётся для пользователя опцией. Потому, если «su -l» не проходит по причине, что пользователю не разрешён интерактивный вход, значить вы хакаете опции системы, специально придуманные. Можно ли обойти? Ну можно, только нестандартыми средствами, програмкой враппером над шелом, который умыкнёт управляющий терминал. А вот стандартными нельзя не по причине, что дураки не догадались, а по причине желания вами замкнутого круга: я хочу чтобы вот эта опция работала, но обходилась, но не обходилось если вот так на шкаф залезть и так до бесконечности.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Да не хакаю я опции системы. Мне нужен примитивный скрипт, который меняет время на заданное, дает пользователю шелл для действий, по выходу из шелла вертает время взад. Скрипт надо запускать от sudo\root, ибо время в линуксе меняет только рут. Пользовательский шелл должен быть с обычными пользовательскими привилегиями, ибо действия, которые надо в нем совершать надо проводить от мени пользователя.

И что? В Линуксе нет средств понизить привилегии?

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Да не хакаю я опции системы

Судя по описанию, вы чёрт-е что там хакаете :)

Пользователь до этого скрипта как добирается? Логинится на консоль, по сети или вообще в своей сессии вдруг вздумается и вызовет ваш скрипт? Если логинится, то без программирования проще всего на PAM, если он у вас в системе сеть. Там есть pam_exec, можно сделать вызов скрипта на вход и на выход.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Просто делает sudo xxxx.sh. Залогинившись. Что, это такая сложная задача, понизить юзера временно обратно до user-level? Без PAM, костылей и неизвестно щее чего?

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Что, это такая сложная задача

Да бросьте вы этот возмущающийся тон.

понизить юзера временно обратно до user-level?

Нет, конечно. Дело не в понижении привилегий, хотя для скрипта это и не тривиально, так как в обычных шелах такой именно встроенной (а иначе никак) команды — нет. Вы хотите другое поведение su, которая специально сконструирована вот для обеспечения таких спецификаций по безопасности: либо даём login shell либо запускаем программу без управляющего терминала. Есть вещь такая — логика. Вы хотите дать интерактивный шел тому, которому не дали. Ну значить надо искать что-то что даст управляющий терминал само. Вот скажем «su -c screen» может вам и не подойдёт, но зато прекрасно демонстрирует подход к решению.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Да бросьте вы этот возмущающийся тон.

Я возмущаюсь только тем, что до меня никто не столкнулся с задачей понижение привилегий.

Вы хотите другое поведение su, которая специально сконструирована вот для обеспечения таких спецификаций по безопасности: либо даём login shell либо запускаем программу без управляющего терминала

Окей, как сделать это без su? Я согласен, давайте не использовать su.

Вы хотите дать интерактивный шел тому, которому не дали.

Что мешает мне написать в скрипте /bin/sh? Будет то, что я хочу, но от рута. Мне надо от пользователя.

Ну значить надо искать что-то что даст управляющий терминал само.

expect умеет режим interact, но подозреваю, что это ничего не даст.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Вам уже в первом же ответе написали, что вам нужно:

su $user
но вы продолжаете упроствовать из зачем-то добавлять туда ″-с″, и пытаетесь запустить для пользователя именно /bin/sh, хотя пользователь в праве ожидать, что получит шелл, указанный в /etc/passwd.

mky ★★★★★
()
Ответ на: комментарий от vodz

Вот сколько себе говорил, что с вами спорить — только расстраиваться.

И все равно не смогли удержаться? :-D

Вы оба с ТСом не могли полсуток прочитать man su, а теперь лицедействуете «там написано наооборот, а нам надо наоборот».

А вы забавнее, чем я думал.

Zmicier ★★★★★
()
Ответ на: комментарий от PPP328

Что мешает мне написать в скрипте /bin/sh?

Решительно ничего не мешает:

#!/bin/bash

su -s /bin/sh $SUDO_USER

Просто *не надо* этого делать, если только на самом деле вам надо запустить не /bin/sh, а какой-нибудь /usr/bin/guile. Пользователь ожидает, что будет запущена его любимая оболочка, а не урезанная.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от mky

Вам уже в первом же ответе написали, что вам нужно

Если б там ещё объяснение было б правильным...

хотя пользователь в праве ожидать, что получит шелл, указанный в /etc/passwd.

Теоретически в такой задаче наоборот пользователь не вправе ожидать охрененный шел, а должен быть связан по рукам и ногам. :) Ну в самом деле, ТС уже расписал тонкости, там какой-то ужас с точки зрения безопасности...

vodz ★★★★★
()
Ответ на: комментарий от Zmicier

И все равно не смогли удержаться? :-D

Отож. Топик буксовал, один тормозил, другой за показным издевательством так и не смог оформить человеческую мысль, которой скорее всего и не было, про понимание и речи не шло.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.