запустити сценарій як користувач, який має оболонку nologin


87

Все, що мені потрібно зробити, це запустити певний сценарій як конкретний користувач, у якого 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 дуже непотрібною :) Дякую січень!
jirka

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>]".
Різноробочий5

Я думаю, що використання sudo -u, ймовірно, не є гарною ідеєю для запуску команд як користувача нологіну, оскільки це виявляє 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

насправді найкращий спосіб зробити це через рунузер

детальну інформацію див. на сторінці чоловіка

цей інструмент використовується для вирішення ситуації, як заявляє розробник на своєму сміху

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

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

я розміщую цю відповідь у багатьох палацах, пробачте мене, якщо ви вважаєте це дратує


Будь ласка, не публікуйте відповіді лише для посилань, щоб запобігти гниттю посилання. Натомість додайте до своєї відповіді найбільш релевантну інформацію із посилання або, замість відповіді, опублікуйте її як коментар. Щоб отримати додаткову інформацію, перегляньте цю статтю довідкового центру serverfault.com/help/how-to-answer .
Федеріко Галлі

@FedericoGalli вже додана найрелевантніша інформація, немає необхідності копіювати та вставляти користування, сторінка man надає достатньо інформації
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.