我在Lubuntu 16.04上使用Bash。 LTS,但我不确定这对这个问题是否重要。
我注意到,当我以标准用户身份创建文件时,该文件具有664权限。但是当我是root并通过-u参数为同一个用户执行相同的命令时,它具有644权限,因此缺少该组的写权限。
我认为这是一个缺陷,因为sudo
手册明确指出:
-u user, --user=user
Run the command as a user other than the default target user (usually root). The user may be either a user name or a
numeric user ID (UID) prefixed with the ‘#’ character (e.g. #0 for UID 0). When running commands as a UID, many
shells require that the ‘#’ be escaped with a backslash (‘\’). Some security policies may restrict UIDs to those
listed in the password database. The sudoers policy allows UIDs that are not in the password database as long as the
targetpw option is not set. Other security policies may not support this.
现在我知道-u
参数的行为与必须预期的行为不同,我的问题是:
我怎样才能确保在root shell中启动的命令被执行完全,因为它将从另一个用户的shell执行?
备注:我知道我可以通过修改umask
来解决这个问题,但这并不能保证我的行为在任意数量的其他情况下都不会有所不同。
答案 0 :(得分:2)
看起来umask取决于shell是否是 interactive :
$ umask
0002
$ sudo -u $USER bash -c umask
0022
$ sudo -u $USER bash -ic umask
0002
这似乎来自/etc/bashrc
,仅在
umask 002
或来自/etc/profile
,如果满足最后两个条件则适用umask 002
。我不确定是否有其他东西覆盖了这个,因为无论shell是否是交互式的,shopt login_shell
都会打印相同的内容,并且UID也是相同的。
您可以获取用户的默认shell thusly:
$ getent passwd $USER | cut --delimiter=: --fields=7
/bin/bash
将它们结合起来:
$ sudo -u $USER $(getent passwd $USER | cut --delimiter=: --fields=7) -ic umask
0002
答案 1 :(得分:-1)
显示预期行为的一个漂亮而干净的解决方案是:
sudo su <username> -c '<any commands>'