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

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

su -c command hudson


这是正确的语法吗?

评论

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

#1 楼

是。这是--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)中创建目录而不引用完整的命令:

mkdir标志的值,并尝试使用-c作为用户名。如果我们引用它,它就可以工作:

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


评论


使用-c选项,su是否会调用shell并在shell中执行命令?还是执行命令而没有其他shell?

– jinbeom hong
20年6月6日上午10:57

这是一个子外壳。尝试睡眠,看看pstree,group等

–奥利
20年6月6日在17:19

它不会加载用户的环境变量

–caot
20年8月30日在14:27

#2 楼

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


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

sudo -u hudson command


评论


我多次(在对sudoers进行了良好管理的系统上)遇到尝试使用sudo的情况,您可以得到以下提示:root不在sudoers文件中。这使su- -c“命令运行”成为唯一选项。

–RAM237
18/09/3在12:26



执行非平凡命令时不需要引号。 (例如,sudo -u kilgore mv that that)

–toraritte
19年5月23日在21:10