запустить скрипт как пользователь, у которого есть 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пользователь без пароля.)

Iain
источник
Что делать, если Су 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
Handyman5
источник
Как вы передаете параметры 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
adaptr
источник
2

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

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

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

Томмазо
источник
0

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

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

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

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

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

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

Z-Y00
источник
Пожалуйста, не публикуйте ответы только для ссылок, чтобы предотвратить гниение ссылок. Вместо этого добавьте наиболее релевантную информацию из ссылки в свой ответ или, в качестве альтернативы, опубликуйте ссылку как комментарий, а не как ответ. См. Эту статью справочного центра 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
Это именно то решение от ответа с самым высоким рейтингом.
Джеральд Шнайдер