Ubuntu 20.04.2 LTS
我遇到的问题是作为另一个用户运行命令(sudo/runuser/...)。我无法找到使用目标用户的 $PATH 设置运行命令的任何选项的一组选项。我第一次看到这个问题是通过 Ansible 运行 rake 命令,但我将其归结为使用名为“deploy”的用户进行的一些简单的命令行测试。
以 ubuntu 用户身份运行命令时:
ubuntu@dev:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
与用户部署相同的命令:
deploy@dev:/home/ubuntu$ echo $PATH
/home/deploy/.yarn/bin:/home/deploy/.config/yarn/global/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
#(This is the desired PATH value)
尝试使用 sudo 在用户部署时运行命令:
ubuntu@dev:~$ sudo su deploy -c "echo $PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
#(Wrong $PATH value, it's the path for user ubuntu again)
ubuntu@dev:~$ sudo -u deploy --login echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(Wrong $PATH value, it's the path for user ubuntu again)
尝试使用 runuser 作为用户部署运行命令:
ubuntu@dev:~$ sudo runuser -l deploy -c 'echo $PATH'
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin
#(Wrong $PATH value, not sure which but it's not the PATH of deploy)
命令“echo $PATH”只是我尝试运行的 rake 命令的替代。我尝试过很多其他组合。它们都失败了,大部分返回运行命令的会话的路径。有谁知道命令和选项的组合可以运行命令,就好像指定的用户启动了 shell 并具有用户特定的 PATH 值一样?
谢谢 。
答案1
@berndbausch 的评论是正确的,您需要单引号,而不是双引号。您还可以从使用模拟完整登录的-l
选项中受益:su(1)
# sudo su -l deploy -c 'echo $PATH'
答案2
当我尝试时:
$ echo $PATH
/home/bbausch/bin:/home/bbausch/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ sudo sh -c "echo $PATH"
/home/bbausch/bin:/home/bbausch/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ sudo sh -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
请注意单引号。之所以如此,是因为 shell 在调用命令之前在双引号字符串中执行变量扩展。但是,可以在文件中配置如何处理环境变量sudoers
。