Odpowiedzi:
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: -
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
sudomożna tylko dostać to: root is not in the sudoers file. Co stanowi su - <username> -c "command to run"jedyną opcję.
sudo -u kilgore mv this that)
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.