在我的 Fedora VM 上,使用我的用户帐户运行时/usr/local/bin,我的路径中有:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Run Code Online (Sandbox Code Playgroud)
同样在运行时su:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Run Code Online (Sandbox Code Playgroud)
但是,运行 via 时sudo,此目录不在路径中:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
为什么运行 via 时路径会不同sudo?
我基本上需要这样做:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Run Code Online (Sandbox Code Playgroud)
这不起作用。如何将环境变量 $DUMMY 传递给 su?-p 不适用于 -l。
在经历了令人沮丧的头砖墙接触之后,我发现了这一点:
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/steve/bin
$ sudo bash
# echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)
但
$ sudo bash -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin
$ sudo bash -Ec 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
我从另一篇文章中收集到sudo路径是从中读取的/etc/sudoers- 但为什么呢?设置是否$PATH在/root/.profile任何意义,或者是只是上面的混乱配方(即产卵实际外壳导致不同$PATH的是,在不经意中使用sudo的命令......)?
我在 RHEL 6.4 上使用 bash。
示例命令:
drush cc all
Run Code Online (Sandbox Code Playgroud)
有效,但这:
sudo drush cc all
Run Code Online (Sandbox Code Playgroud)
给我:
sudo: drush: command not found
Run Code Online (Sandbox Code Playgroud)
为什么?如何解决这个问题?
每当我似乎手动安装软件时,我都会收到共享库错误。执行后echo $LD_LIBRARY_PATH它显示为..没有。我试过添加/usr/local/lib到一个.conf文件中,/etc/ld.so.conf.d但它似乎永远不会执行。
这不起作用,要么(引号或其他):
LD_LIBRARY_PATH="/usr/local/lib"
export LD_LIBRARY_PATH
sudo ldconfig -v
Run Code Online (Sandbox Code Playgroud)
该值将被临时设置,但如果我退出终端窗口,它将不会保留该值。重新启动也没有任何作用。
$ su -
Password:
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
logout
$ su
Password:
# echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Run Code Online (Sandbox Code Playgroud)
我不知道为什么 /bin 和 /sbin 没有添加到$PATH,如果我做普通的 su 。过去就是这样。我怎样才能解决这个问题?我确实注意到:
-rw-r--r-- 1 root root 0 Jan 8 2018 /etc/environment
Run Code Online (Sandbox Code Playgroud)
但除此之外,我的系统似乎很正常。
编辑:我忘了强制性的 uname -a
Linux rpi3 4.17.0-1-arm64 #1 SMP Debian 4.17.8-1 (2018-07-20) aarch64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
编辑2:
$ cat /etc/issue
Debian GNU/Linux buster/sid \n \l
Run Code Online (Sandbox Code Playgroud)
所有的包都来自“测试”repo,因为“稳定”的包在 aarch64 上不能很好地工作。
到目前为止,我在这里看到的其他解决方案基于一些系统定义,但实际上可以通过正确调用它来
sudo使用当前PATH(使用env命令)和/或环境的其余部分(使用-E选项) :Run Code Online (Sandbox Code Playgroud)sudo -E env "PATH=$PATH" <command> [arguments]事实上,我们可以用它来做一个别名:
Run Code Online (Sandbox Code Playgroud)alias mysudo='sudo -E env "PATH=$PATH"'(也可以自己命名别名
sudo,替换原来的sudo.)
鉴于
-E, --preserve-env 指示用户希望保留其现有环境变量的安全策略。如果用户没有保护环境的权限,安全策略可能会返回错误。
我想知道为什么以下不起作用
sudo -E <command> [arguments]
Run Code Online (Sandbox Code Playgroud)
?
鉴于这"PATH=$PATH" <command> [arguments]也是一个命令,我想知道为什么以下不起作用:
sudo "PATH=$PATH" <command> [arguments]
Run Code Online (Sandbox Code Playgroud)
?
谢谢。