Zajímalo by mě, jak spustit příkaz jako jiný uživatel ze skriptu.
Majitel skriptu je nastaven jako root. Mám také spuštěn následující příkaz ve skriptu, který příkaz spouští jako uživatel hudson:
su -c command hudson
Je to správná syntaxe?
Ano. Zde je --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
A nějaké testování (použil jsem Sudo
, protože neznám heslo pro účet nobody
)
$ Sudo su -c whoami nobody
[Sudo] password for oli:
nobody
Když váš příkaz vezme argumenty, musíte jej citovat. Pokud tak neučiníte, objeví se podivné věci. Tady se snažím vytvořit kořenový adresář v/home/oli (jako oli) bez citovat celý příkaz:
# su -c mkdir /home/oli/Java oli
No passwd entry for user '/home/oli/Java'
Jako hodnotu příznaku -c
Je pouze načteno mkdir
a jako uživatelské jméno se pokouší použít /home/oli/Java
. Pokud to citujeme, prostě to funguje:
# 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: -
Poznámka: „Mám majitele skriptu nastaveného jako root“ nic nedělá; i když máte nastavený bit setuid stále nefunguje
Za předpokladu, že skript ve skutečnosti používáte jako root, můžete však použít Sudo
. su
je primárně pro přepínání uživatelů, zatímco Sudo
je pro provádění příkazů jako ostatní uživatelé. Příznak -u
Umožňuje určit, který uživatel má provést příkaz, jako:
Sudo -u hudson command