su options - uruchomienie polecenia jako inny użytkownik

75

Zastanawiałem się, jak uruchomić polecenie jako inny użytkownik ze skryptu.

Mam właściciela skryptu ustawionego jako root. Mam również następujące polecenie uruchamiane w skrypcie, aby uruchomić polecenie jako użytkownik Hudson:

su -c command hudson

Czy to poprawna składnia?

Śmieciarz
źródło
Dla innych pracowników Google: niektórzy użytkownicy mogą celowo wyłączyć tę funkcję. Możesz biegać sudo cat /etc/passwd | grep user-abc. Jeśli zobaczysz coś takiego: user-abc:x:994:994::/home/user-abc:/bin/falseto nie zadziała. Jest tak, ponieważ ostatnia część „ /bin/false” oznacza, że ​​nie ma powłoki dla tego użytkownika.
Alexander Bird

Odpowiedzi:

78

Tak. Oto --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

I trochę testowania (użyłem, sudoponieważ nie znam hasła do nobodykonta)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

Kiedy twoje polecenie przyjmuje argumenty, musisz je zacytować. Jeśli nie, zdarzają się dziwne rzeczy. Oto jestem - jako root - próbuję utworzyć katalog w / home / oli (jako oli) bez cytowania pełnego polecenia:

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

Jest odczytywany tylko mkdirjako wartość -cflagi i próbuje użyć go /home/oli/javajako nazwy użytkownika. Jeśli go zacytujemy, to po prostu działa:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -
Oli
źródło
52

Uwaga: „Mam właściciela skryptu ustawionego jako root” nic nie robi; nawet jeśli masz ustawiony bit setuid, nadal nie działa


Zakładając, że faktycznie uruchamiasz skrypt jako root, możesz jednak użyć sudo. susłuży głównie do przełączania użytkowników, podczas gdy sudosłuży do wykonywania poleceń jak inni użytkownicy. -uFlaga pozwala określić, które użytkownik może wykonać polecenie jako:

sudo -u hudson command
Michał Mrożek
źródło
1
Wiele razy stojące (na systemach gdzie sudoers jest dobrze podawać), że stara się wykorzystać sudomożna tylko dostać to: root is not in the sudoers file. Co stanowi su - <username> -c "command to run"jedyną opcję.
RAM237
Cudzysłowy nie są potrzebne przy wykonywaniu nietrywialnych poleceń. (Np. sudo -u kilgore mv this that)
toraritte