Запустіть частину сценарію bash як інший користувач


33

Чи є спосіб зробити частину скрипту запустити як інший (некоріозний) користувач? Якщо це допомагає, частина, яку потрібно запустити як інший користувач, виникає в кінці сценарію

Редагувати:
ОС -> Ubuntu 9.04


Відповіді:


42

Використовуйте команду sudo в сценарії.

У формі:

sudo -u username command

команда sudo запускає команду як ім'я користувача .

Якщо сценарій запускається як root, я не думаю, що він запропонує ввести пароль. Інакше в цій статті йдеться про те, як використовувати sudo з паролем в одному командному рядку? , і ця стаття розповідає про те, як користуватися sudo без пароля?


5
Це приємно і просто, але чи існує спосіб це зробити для групи команд замість однієї за одною?
Андрій

написати сценарій bash, зробити його виконуваним, chmod +x script.shа потім простоsudo -u username script.sh
NiCU

@Andrew Мені це було цікаво, і для мене працювало наступне: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell

Також включіть iопцію, якщо ви хочете придбати середовище користувача
neoDev

6

Ця відповідь хороша, але порада сервера за замовчуванням трохи небезпечна - дозволила б будь-кому запустити що-небудь як root! Тож я публікую тут, бо не можу відформатувати коментар.

Я рекомендую використовувати visudo, щоб надати необхідні дозволи максимально точно. Введіть visudoі додайте рядок типу:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Якщо вам потрібно запустити цю саму річ на багатьох хостах, ви можете відкрити її за допомогою:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Але я б ** не використовував:

username ALL=(ALL) NOPASSWD: ALL

або ім'я хоста користувача = ВСІ

На сторінці чоловіка судора є безліч деталей горілого


Чи працюватиме вона для команди, доступної лише конкретному користувачеві?
Маніш Матхай

Ви можете вказати, що команду можуть виконувати лише певні користувачі (у наведених вище прикладах замініть usernameім'ям користувача, який повинен мати можливість виконувати команду). Якщо виконуваний файл, який ви хочете запустити, виконується лише одним конкретним користувачем, це теж добре - просто переведіть це ім'я користувача у sudo -u username commandlineрядку сценарію.
Джеймс Поллі

@Manish. Так. Про що пише файл sudoers: "Дозвольте цьому користувачу на цьому хості запускати command1, не
вказуючи

6

# I = як:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./run

1: root
2: nobody
3: root

10
Чи можете ви додати якийсь пояснювальний текст?
Kazark

4

Для sonarqube:

sudo -u sonar /usr/bin/sonar start

де sonarім'я користувача, яке використовується для запуску команди/usr/bin/sonar start


2

не дуже впевнений у цьому, але якщо ви хочете, щоб ТІЛЬКИ кінець цього сценарію запустився як інший користувач, ви можете додати його su someuserдо кінця сценарію.

Я щось пропускаю?

Сподіваюся, що це допомагає,

З повагою


1
Я думаю, що це найбільш відповідна відповідь, оскільки всі інші відповіді пропонують sudo, який часто не встановлюється за замовчуванням на деяких мінімальних установках Linux.
Тім

1

Таким чином, кінець сценарію буде виконаний іншим користувачем (root). Зверніть увагу на дзвінки $[LINENO+2]та exit $?дзвінки. Вони потрібні, щоб закінчити сценарій, щоб виконати його лише один раз, і зберегти код виходу sudoвиклику.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.