запустить скрипт как пользователь, у которого есть nologin shell


88

Все, что мне нужно сделать, - это запустить определенный скрипт от имени конкретного пользователя, для которого nologin/falseоболочка указана в /etc/passwd.

Я бы запустил скрипт от имени пользователя root, и он должен работать от имени другого пользователя. Бег:

~# su -c "/bin/touch /tmp/test" testuser

будет работать, но мне нужна корректная оболочка для тестируемого. Я знаю, что могу отключить пароль passwd -d testuserи оставить оболочку /bin/bashтаким образом, что бы немного обезопасить себя, но мне нужна nologin/falseоболочка.

По сути, мне нужно то crontab, что нужно делать, когда мы настраиваем задания на выполнение от имени конкретного пользователя, независимо от того, есть ли у него nologin/falseоболочка.

PS Я нашел этот поток, выполняя команду от имени пользователя nologin , но я понятия не имею, как выполнить concatenateкоманду su -s /bin/sh $userдля скрипта, который мне нужно запустить.

Ответы:


119

Вы можете использовать ключ -s для su для запуска определенной оболочки

su -s /bin/bash -c '/path/to/your/script' testuser

(Перейдите sudoк описанному выше, если testuserпользователь без пароля.)


Что делать, если Су root:root -rwsr-x---?
Патрик

1
Что делать, если у пользователя нет пароля?
CMCDragonkai

3
@Wesley Обнаружил, что вам нужно быть пользователем root, чтобы запустить эту команду для пользователя без пароля.
CMCDragonkai

1
@lain, если предполагается, что у пользователя нет оболочки, процесс, связанный с командой, не должен быть дочерним процессом bash. Таким образом, вы также должны использовать exec для замены оболочки скриптом. И если вы хотите сделать сценарий дочерним по отношению к init, просто используйте &, в качестве примераsu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor

1
Так как последние 20 минут я потратил на то, чтобы добиться того же результата, используя runuser, я хотел бы отметить, что su -s SHELLпараметр делает команду runuser практически бесполезной :) Спасибо, Ян!
Джирка

12

Вы можете сделать это, sudo -uесли у вас установлено:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin

Как вы передаете параметры sudo -u apache whoami?
CMCDragonkai

@CMCDragonkai Любые параметры после команды будут переданы. Вы можете думать об этом как "sudo [-u apache] [whoami <param1> <param2>]".
Handyman5

Я думаю, что использование sudo -u, вероятно, не является хорошей идеей для запуска команд от имени пользователя nologin, потому что оно выявляет SUDO_USERв среде, которая является реальной, вызывает команду. Может быть, я просто обдумываю это.
мяу

5

Предоставив скрипт в качестве аргумента для выполнения в / bin / sh:

su -s "/bin/sh /your/script/location" username

2

только что понял :

su -s "/ bin / bash" -c "/ bin / touch / tmp / testuser" testuser

может есть лучший способ ?!


0

на самом деле, лучший способ сделать это через runuser

см. справочную страницу для деталей

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

Когда служба работает от имени пользователя root и хочет изменить UID с помощью оболочки, она должна использовать runuser.

http://danwalsh.livejournal.com/55588.html

я разместил этот ответ во многих дворцах, прости меня, если ты находишь это раздражающим


Пожалуйста, не публикуйте ответы только для ссылок, чтобы предотвратить гниение ссылок. Вместо этого добавьте наиболее релевантную информацию из ссылки в свой ответ или, в качестве альтернативы, опубликуйте ссылку как комментарий, а не как ответ. См. Эту статью справочного центра serverfault.com/help/how-to-answer для получения дополнительной информации.
Федерико Галли

@FedericoGalli самая актуальная информация уже добавлена, нет необходимости копировать и вставлять информацию об использовании, справочная страница предоставляет достаточно информации
Z-Y00

-1

Используйте sudo -u, чтобы указать пользователя. Также используйте флаг -i, чтобы также установить переменные окружения целевого пользователя.

sudo -i -u user command

1
это даетThis account is currently not available.
knocte

-3

Используйте команду su с командами shell -s и -c. Как показано ниже

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash

2
Это именно то решение от ответа с самым высоким рейтингом.
Джеральд Шнайдер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.