su 选项 - 以另一个用户身份运行命令

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)

  • 很多次我都遇到过(在 sudoers 管理良好的系统上)尝试使用“sudo”,你只能得到这样的信息:“root 不在 sudoers 文件中”。这使得“su - <用户名> -c“运行命令””成为唯一的选项。 (2认同)