su options-以其他用户身份运行命令


75

我想知道如何从脚本中以另一个用户的身份运行命令。

我将脚本的所有者设置为root。我还在脚本中运行以下命令以以hudson用户身份运行该命令:

su -c command hudson

这是正确的语法吗?


对于其他Google员工:某些用户可能故意禁用了此功能。您可以运行sudo cat /etc/passwd | grep user-abc。如果您看到类似这样的内容:user-abc:x:994:994::/home/user-abc:/bin/false它将无法正常工作。这是因为最后一部分“ /bin/false”表示该用户没有外壳。
亚历山大·伯德

Answers:


78

是。这是--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

和一些测试(我曾经用过,sudo因为我不知道该nobody帐户的密码)

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

当命令接受参数时,需要将其引用。如果您不这样做,将会发生奇怪的事情。在这里,我是root用户,试图在/ home / oli中创建目录(以oli身份)而不引用完整命令:

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

它仅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: -

52

注意:“我已将脚本的所有者设置为root”,它什么都不做;即使您设置了setuid位,它仍然不起作用


假设您实际上以root用户身份运行脚本,则可以使用sudosu主要用于切换用户,而sudo与其他用户一样执行命令。该-u标志使您可以指定执行该命令的用户:

sudo -u hudson command

1
我多次(在对sudoers进行良好管理的系统上)遇到尝试使用sudo您可以得到以下信息:root is not in the sudoers file。这是su - <username> -c "command to run"唯一的选择。
RAM237 '18

执行非平凡命令时不需要引号。(例如,sudo -u kilgore mv this that
toraritte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.