登录Ubuntu系统时,登录用户为“ root
”。
然后,我想代表“ non_root
”执行一些 bash 脚本:
root@test_pc:~# echo $USER
root
root@test_pc:~# sudo -E -u non_root -g non_root -H /bin/bash -c "echo $USER"
root
root@test_pc:~#
但输出仍然是“ root
”,换句话说,该命令仍然在“ root
”用户下执行,而不是“ non_root
”。
预期输出如下:
root@test_pc:~# sudo -E -u non_root -g non_root -H /bin/bash -c "echo $USER"
non_root
root@test_pc:~#
以下是实际操作:
sudo -E -u non_root -g non_root -H /bin/bash -c "systemctl --user disable pulseaudio.service"
但出现以下错误:
Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)
non_root
以“ ”用户登录时,如何以“ ”的身份执行任何 bash 命令root
?
答案1
不用说,你所做的,即以用户身份登录root
是不受鼓励的,因此root
在 Ubuntu 上默认情况下禁用该用户。
话虽如此,...
Bash 命令字符串周围的双引号允许在执行命令之前在当前命令行上的当前 shell 中进行参数扩展……查看其实际运行情况:
root@Lenovo:~# whoami
root
root@Lenovo:~# set -x
root@Lenovo:~# sudo -E -u ubuntu -g ubuntu -H /bin/bash -c "echo $USER"
+ sudo -E -u ubuntu -g ubuntu -H /bin/bash -c 'echo root'
root
虽然您的命令实际上是以预期用户身份执行的:
root@Lenovo:~# sudo -E -u ubuntu -g ubuntu -H /bin/bash -c "whoami"
ubuntu
$USER
要在为运行该 Bash 命令字符串而创建的子 shell 中展开,请改用单引号将命令字符串引起来:
root@Lenovo:~# sudo -E -u ubuntu -g ubuntu -H /bin/bash -c 'echo $USER'
ubuntu
还要注意,pulseaudio 是一种用户服务,需要用户登录才能运行...例如https://askubuntu.com/a/1465201并且 Dbus 也是用户的用户运行环境的一部分,并且也需要用户登录...例如https://askubuntu.com/a/1470118