gar*_*tor 99 scripting bash su sudo
我想知道如何从脚本中以另一个用户身份运行命令。
我将脚本的所有者设置为 root。我还在脚本中运行以下命令以作为 hudson 用户运行命令:
su -c command hudson
Run Code Online (Sandbox Code Playgroud)
这是正确的语法吗?
Oli*_*Oli 101
是的。这是--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
Run Code Online (Sandbox Code Playgroud)
还有一些测试(我用过,sudo因为我不知道nobody帐户的密码)
$ sudo su -c whoami nobody
[sudo] password for oli:
nobody
Run Code Online (Sandbox Code Playgroud)
当您的命令接受参数时,您需要引用它。如果你不这样做,奇怪的事情就会发生。在这里,我以 root 身份尝试在 /home/oli(作为 oli)中创建一个目录而不引用完整命令:
# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'
Run Code Online (Sandbox Code Playgroud)
它仅被读取mkdir为-c标志的值,并试图用作用/home/oli/java户名。如果我们引用它,它就有效:
# 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: -
Run Code Online (Sandbox Code Playgroud)
Mic*_*zek 63
注意:“我将脚本的所有者设置为 root”不做任何事情;即使您设置了 setuid 位,它仍然不起作用
但是,假设您实际上以 root 身份运行脚本,您可以使用sudo. su主要用于切换用户,而sudo用于以其他用户身份执行命令。该-u标志可让您指定以哪个用户身份执行命令:
sudo -u hudson command
Run Code Online (Sandbox Code Playgroud)