Uruchom skrypt powłoki jako inny użytkownik

42

Jaki jest dobry sposób uruchamiania skryptu powłoki jako inny użytkownik. Używam etiudy Debiana i wiem, którego użytkownika chcę podszyć się.

Gdybym robił to ręcznie, zrobiłbym:

su postgres
./backup_db.sh /tmp/test
exit

Ponieważ chcę zautomatyzować proces, potrzebuję sposobu na uruchomienie backup_db.sh jako postgres (dziedziczenie środowiska itp.)

Dzięki!

Wadih M.
źródło

Odpowiedzi:

67

Aby uruchomić skrypt jako inny użytkownik jako jedno polecenie, uruchom:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

Polecam zawsze używać pełnych ścieżek w skryptach takich jak ten - nie zawsze możesz zagwarantować, że znajdziesz się we właściwym katalogu, kiedy su (może ktoś zmienił homedir na ciebie, kto wie). Zawsze też używam pełnej ścieżki do su (/ bin / su), ponieważ jestem paranoikiem. Możliwe, że ktoś może edytować twoją ścieżkę i spowodować, że używasz zhakowanej wersji su.

baumgart
źródło
Zawsze będzie to wymagało wpisania hasła? Jak to obejść?
zjffdu
2
Zawsze będziesz musiał wpisać hasło, jeśli uruchamiasz komendę jako użytkownik inny niż root. Jeśli chcesz uniknąć hasła, możesz skonfigurować sudo, aby na to zezwalać. JEDNAK - konfiguracja sudo w celu umożliwienia użytkownikowi uruchomienia su pozwala mu zostać dowolnym użytkownikiem. Sugerowałbym utworzenie skryptu dla twojego polecenia, ustawienie uprawnień do skryptu na 700 i należących do roota, a następnie skonfigurowanie sudo, aby umożliwić użytkownikowi uruchomienie tego pojedynczego skryptu.
baumgart
Uważam, że chociaż ta odpowiedź może zadziałać dla PO, nie jest ona do końca poprawna. Według mojej wiedzy, używanie obu -(lub --login) razem z --command, -ctak naprawdę nie uruchamia sesji logowania, ponieważ -czawsze wymusza powłokę niezalogowaną.
JeanMertz
1
Uwaga: w celu zapewnienia przenośności - postgresspowinien pojawić się na końcu polecenia. Ze strony When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
podręcznika
23

Jeśli docelowy użytkownik do uruchomienia ma zdefiniowaną powłokę nologin, możesz użyć opcji -s, aby określić powłokę:

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

Zobacz następujące pytanie: uruchom skrypt jako użytkownik, który ma powłokę nologin

Bazyli A.
źródło
9

Aby zautomatyzować to zgodnie z harmonogramem, możesz umieścić go w crontab użytkownika. Zadania Crona nie uzyskają pełnego środowiska, ale może być lepiej umieścić wszystkie potrzebne zmienne env w samym skrypcie.

Aby edytować crontab użytkownika:

sudo crontab -u postgres -e
Kyle Brandt
źródło
Czy możesz wyjaśnić więcej?
saravanakumar
3

Powinien to być informacyjny read - setuid w skryptach powłoki

Jeśli uruchomisz su z - usernamesekwencją argumentów, spowoduje to, że użytkownik zaloguje się do powłoki w takim samym środowisku jak użytkownik. Zwykle służy do szybkiego wykonania skryptu w środowisku domowym z innego loginu.

nik
źródło
Może to być przydatne, jeśli musisz wykonać szereg czynności. Należy jednak pamiętać, że większość kont usług systemowych nie powinna mieć prawidłowych ścieżek głównych i powłok.
Dan Carley,
2

Wypróbuj stronę man su:

su -c script_run_as_postgres.sh - postgres

Alternatywnie, możesz użyć sudo, aby pozwolić ci uruchamiać tylko ten comman jako postgres bez hasła. Jednak wymaga to trochę konfiguracji w / etc / sudoers.

pjz
źródło
2

Metoda „su -c ...” opublikowana przez innych jest dobra. W celu automatyzacji możesz dodać skrypt do crontab użytkownika, którego potrzebujesz, aby go wykonać jako.

Geoff Fritz
źródło
1

Jeśli użytkownik ma już wpis do sudo i nie znasz hasła administratora, możesz spróbować wykonać następujące czynności: Ten uruchamia ponownie postgres zainicjowany na /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
smishra
źródło
-1

Możesz także użyć:

sudo -u postgres script_run_as_postgres.sh

Xandersoft
źródło