uruchom skrypt jako użytkownik, który ma powłokę nologin

87

Wszystko, co muszę zrobić, to uruchomić określony skrypt jako konkretny użytkownik, który ma nologin/falsewskazaną powłokę /etc/passwd.

Uruchomiłbym skrypt jako root i powinien on działać jako inny użytkownik. Bieganie:

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

działałoby, ale potrzebuję poprawnej powłoki dla testuser. Wiem, że mogę wyłączyć hasło passwd -d testuseri pozostawić powłokę w /bin/bashten sposób, by trochę zabezpieczyć, ale muszę mieć nologin/falsepowłokę.

Zasadniczo potrzebuję tego, co robię, crontabgdy ustawiamy zadania tak, aby działały jako konkretny użytkownik, niezależnie od tego, czy ma on nologin/falsepowłokę.

ps Znalazłem ten wątek Wykonywanie polecenia jako użytkownik nologin , ale nie mam pojęcia, jak wykonać concatenatepolecenie su -s /bin/sh $userdo skryptu, który muszę uruchomić.

Tommaso
źródło

Odpowiedzi:

119

Możesz użyć przełącznika -s, aby su uruchomić określoną powłokę

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

(Przejdź sudodo powyższego, jeśli testuserjest użytkownikiem bez hasła).

Iain
źródło
Co jeśli su jest root:root -rwsr-x---?
Patryk
1
Co jeśli użytkownik nie ma hasła?
CMCDragonkai
3
@Wesley Dowiedz się, że musisz być rootem, aby uruchomić to polecenie dla użytkownika bez hasła.
CMCDragonkai
1
@lain, jeśli użytkownik nie powinien mieć powłoki, proces związany z poleceniem nie powinien być potomkiem procesu bash. Dlatego powinieneś również użyć exec do zastąpienia powłoki skryptem. A jeśli chcesz, aby skrypt był dzieckiem init, po prostu użyj &, jako przykładusu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor
1
Ponieważ spędziłem ostatnie 20 minut na wypracowaniu tego samego rezultatu runuser, chciałbym zaznaczyć, że su -s SHELLparametr sprawia, że ​​polecenie runuser jest prawie bezużyteczne :) Dzięki Jan!
jirka
12

Możesz to zrobić, sudo -ujeśli masz zainstalowany:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
Złota rączka 5
źródło
Jak przekazujesz parametry sudo -u apache whoami?
CMCDragonkai
@CMCDragonkai Wszelkie parametry po poleceniu zostaną przekazane. Możesz myśleć o tym jak „sudo [-u apache] [whoami <param1> <param2>]”.
Złota rączka 5
Myślę, że używanie sudo -uprawdopodobnie nie jest dobrym pomysłem do uruchamiania poleceń jako użytkownik nologin, ponieważ naraża SUDO_USERśrodowisko, które jest tym, które wywołuje polecenie. Może po prostu to przemyślam.
Miau
5

Podając skrypt jako argument do wykonania w / bin / sh:

su -s "/bin/sh /your/script/location" username
adapttr
źródło
2

właśnie zrealizowałem:

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

może jest lepszy sposób?

Tommaso
źródło
0

tak naprawdę najlepszym sposobem na to jest skorzystanie z Runuser

zobacz stronę podręcznika, aby uzyskać szczegółowe informacje

to narzędzie służy do radzenia sobie z sytuacją, jak powiedział deweloper w swoim bolg

Ilekroć usługa działa jako root i chce zmienić UID za pomocą powłoki, powinna używać runuser.

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

zamieściłem tę odpowiedź w wielu pałacach, wybacz mi, jeśli uznasz to za denerwujące

Z-Y00
źródło
Nie publikuj odpowiedzi zawierających tylko linki, aby zapobiec gniciu linków. Zamiast tego dodaj najodpowiedniejsze informacje z linku do swojej odpowiedzi lub alternatywnie opublikuj link jako komentarz zamiast odpowiedzi. Więcej informacji można znaleźć w tym artykule serverfault.com/help/how-to-answer w centrum pomocy.
Federico Galli
@FedericoGalli dodano już najistotniejsze informacje, nie ma potrzeby kopiowania i wklejania użycia, strona podręcznika dostarcza wystarczających informacji
Z-Y00
-1

Użyj sudo -u, aby określić użytkownika. Użyj także flagi -i, aby ustawić zmienne środowiskowe docelowego użytkownika.

sudo -i -u user command
Wayne Shelley
źródło
1
to dajeThis account is currently not available.
knocte
-3

Użyj polecenia su z poleceniem shell -s i -c. Jak pokazano niżej

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash
chetan
źródło
2
To jest dokładnie rozwiązanie z najwyżej ocenianej odpowiedzi.
Gerald Schneider