Wykonaj skrypt z rc.local jako użytkownik zamiast root

26

Chcę wykonać skrypt przy każdym uruchomieniu mojego serwera. Problem polega na tym, że muszę być pewnym użytkownikiem, aby wykonać skrypt, jeśli spróbuję to zrobić jako root, nie mogę znaleźć niektórych pakietów (takich jak Ruby).

Próbuję zmienić na xxx user01.

sudo su user01
/etc/init.d/script start

To jednak nie działa.

Philip
źródło
Opublikować swój skrypt inicjujący?
kwanty
Czy masz jakieś dzienniki?
Dom
Dlaczego po prostu nie użyjesz suw skrypcie rc?
Mat
Zobacz stackoverflow.com/questions/8940771/… .
Ferdinand Prantl

Odpowiedzi:

30

Uruchomienie sudo su user01w skrypcie nie oznacza, że ​​następujące polecenia są wysyłane do wynikowej powłoki. W rzeczywistości prawdopodobnie oznacza to, że nowa powłoka jest spawnowana jako użytkownik01, która nigdy nie wychodzi!

Dwie rzeczy:

  • Możesz wykonać polecenie jako inny użytkownik, przekazując -c 'command...'argument do su, np su user01 -c '/etc/init.d/script start'.
  • Uruchomienie usługi korzystającej z /etc/init.d z rc.local nie jest właściwym rozwiązaniem. Chcesz skorzystać z usługi włączania podczas uruchamiania przy użyciu narzędzi dystrybucji, takich jak chkconfiglub update-rc.d. Nie chcesz także zadań w /etc/init.d, które nie powinny być uruchamiane jako root. Same zadania mogą swobodnie przejść do innego konta użytkownika, ale należy je wywołać przez root.
Kyle Smith
źródło
8

Możesz coś włożyć /etc/crontabi uruchomić@reboot

@reboot username /etc/init.d/script start
user9517 obsługuje GoFundMonica
źródło
2
lub we własnym pliku crontab użytkownika.
Jake
4

Możesz po prostu uruchomić polecenie poprzez sudo w następujący sposób:

sudo -H -u user01 /etc/init.d/script start

-H ustawia zmienną środowiskową HOME na zmienną użytkownika

-u określa nazwę użytkownika do uruchomienia jako

joetek
źródło
0

Na pewno nie można uruchomić tego skryptu z sudo ze względu na wymaganie (wymusza, że ​​użytkownicy muszą być zalogowani) w sudoers. Możesz chcieć wyłączyć, co jest nieco ryzykowne

Istnieje również nieco stare narzędzie o nazwie runsuid: http://freecode.com/projects/runsuid

HTH

sebelk
źródło