Uruchom część skryptu bash jako inny użytkownik

Odpowiedzi:

42

Użyj polecenia sudo w skrypcie.

W formie:

sudo -u username command

polecenie sudo uruchamia polecenie jako nazwę użytkownika .

Jeśli skrypt jest uruchamiany jako root, nie sądzę, aby monitował o hasło. W przeciwnym razie w tym artykule omówiono, jak używać sudo z hasłem w jednym wierszu polecenia? , a w tym artykule omówiono korzystanie z sudo bez hasła?

pcapademic
źródło
5
Jest to przyjemne i łatwe, ale czy można to zrobić dla grupy poleceń zamiast pojedynczo?
Andrew
napisz skrypt bash, uczyń go wykonywalnym, chmod +x script.sha następnie po prostusudo -u username script.sh
NiCU,
@Andrew Zastanawiałem się nad tym sam i następujące działały dla mnie: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell
Uwzględnij również iopcję, jeśli chcesz uzyskać środowisko użytkownika
neoDev,
6

Ta odpowiedź jest dobra, ale porada dotycząca błędu serwera jest nieco niebezpieczna - pozwoliłby każdemu uruchomić coś jako root! Publikuję tutaj, ponieważ nie mogę sformatować komentarza.

Polecam użycie visudo, aby dać potrzebne uprawnienia tak dokładnie, jak to możliwe. Wpisz visudoi dodaj wiersz, taki jak:

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

Jeśli potrzebujesz uruchomić to samo na wielu hostach, możesz otworzyć to za pomocą:

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

Ale ** nie * nie użyłbym:

username ALL=(ALL) NOPASSWD: ALL

lub nazwa użytkownika nazwa hosta = WSZYSTKIE

Strona podręcznika sudoer ma wiele krwawych szczegółów

DaveParillo
źródło
Czy działałoby to dla polecenia dostępnego tylko dla konkretnego użytkownika?
Manish Mathai
Możesz określić, że tylko konkretni użytkownicy mogą uruchamiać polecenie (w powyższych przykładach zastąp usernamenazwę użytkownika, który powinien móc uruchomić polecenie). Jeśli plik wykonywalny, który chcesz uruchomić, może być wykonywany tylko przez jednego konkretnego użytkownika, to też jest w porządku - po prostu przekaż tę nazwę użytkownika w sudo -u username commandlinewierszu skryptu.
James Polley,
@Manish. Tak. Plik sudoers mówi: „Zezwól tej nazwie użytkownika na tym hoście na uruchomienie polecenia 1 bez konieczności podawania hasła.
DaveParillo
6

# I = lubię:

#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

# ./biegać

1: root
2: nobody
3: root
AX Labs
źródło
10
Czy możesz dodać tekst wyjaśniający?
Kazark
4

W przypadku sonarqube:

sudo -u sonar /usr/bin/sonar start

gdzie sonarjest nazwą użytkownika użytego do uruchomienia polecenia/usr/bin/sonar start

burtsevyg
źródło
2

nie jestem tego pewien, ale jeśli chcesz, aby TYLKO koniec tego skryptu działał jako inny użytkownik, możesz dodać go su someuserprzed końcem skryptu.

Czy coś brakuje?

Mam nadzieję, że to pomaga

pozdrowienia

dag729
źródło
1
Myślę, że jest to najbardziej odpowiednia odpowiedź, ponieważ wszystkie inne odpowiedzi sugerują sudo, które często nie jest instalowane domyślnie w niektórych minimalnych instalacjach z Linuksem.
Tim
1

W ten sposób koniec skryptu zostanie wykonany przez innego użytkownika (root). Zwróć uwagę na połączenia $[LINENO+2]i exit $?. Są one wymagane, aby koniec skryptu wykonał się tylko raz i aby zachować kod wyjścia sudowywołania.

#!/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
dparalen
źródło