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!

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.


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


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

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.


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.


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.


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"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.