我在该位置的系统中安装了xampp /opt/lampp
。之后,我使用以下命令将php位置添加到我的路径变量中
export PATH=$PATH:/opt/lampp/bin
因此,当我php -v
使用终端运行时,将获得预期的输出。
PHP 5.6.8 (cli) (built: Apr 20 2015 18:37:47)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
但是当我跑步时sudo php -v
我得到了:
sudo: php: command not found
我不知道为什么会这样。将其添加到路径变量时,我做错什么了吗?
编辑:
这个问题不是使用'sudo'运行时环境变量的重复,因为在那个问题中,zetah询问了如何将任意变量传递给python命令。他们是能够执行python
使用sudo
,但我不能执行php
使用sudo
。
按照此答案,我将PATH添加到sudo
使用以下命令:
sudo PATH=$PATH:/opt/lampp/bin php -v
但我得到的输出像以前一样:
sudo: php: command not found
按照此答案,我添加-E
到sudo
,但得到的结果相同:
$ sudo -E php -v
sudo: php: command not found
sudo
不使用您的PATHsudo
忽略PATH变量的原因是它具有自己的secure_path
,并且已确定使用它。
如果您是sudo cat /etc/sudoers
或sudo grep secure /etc/sudoers
,您将看到此路径在您的系统上。我有这条线:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
的目的sudo
的secure_path
就是尽量使其不太可能与用户sudo
的权限会(意外)运行危险代码为根后的路径已被修改,可能包括本地目录。
可以避免通过修改来注释掉该行而完全sudo
使用它,但这将是一个坏主意,因为它删除了安全措施,并且也没有必要,因为您可以通过各种可取的方式轻松地解决它。secure_path
/etc/sudoers
sudo
使用您的PATH要覆盖secure_path
和sudo
使用当前定义的PATH(如muru commented),您可以使用:
sudo env PATH="$PATH" command
请注意,-E
标志或仅分配变量不起作用(至少在Ubuntu上)。
$ mkdir junk # create a test directory to add to PATH
$ echo "echo foo" > junk/useless # create a harmless program
$ chmod u+x junk/useless # make it executable
$ PATH="$PATH":~/junk # add directory to PATH
当添加到PATH时,请使用绝对路径(外壳将~
在分配变量之前扩展)。我不需要export
(这样做无济于事),因为PATH已经导出,更改其值也将导致子进程也继承更改。
$ useless
foo
$ sudo useless
sudo: useless: command not found
$ sudo -E useless
sudo: useless: command not found
人们通常希望这能奏效……man sudo
说:
-E, --preserve-env
Indicates to the security policy that the user wishes to
preserve their existing environment variables.
但这是行不通的。该-E
标志不起作用secure_path
,可能是一个错误。
$ sudo PATH="$PATH" useless
sudo: useless: command not found
这不会影响sudo
自己的环境,该环境是根据所配置的安全策略设置的/etc/sudoers
。这包括env_reset
并secure_path
作为Ubuntu的默认设置,从而导致加载最小的环境,并将PATH设置为中的任何值secure_path
。
如果sudo
能够useless
在其自己的路径目录之一中找到调用的命令并运行该命令,则该命令将传递PATH=$PATH
到其环境中,如此处所示。但是它本身不会使用给定的PATH值。解决方案是运行:
$ sudo env PATH="$PATH" useless
foo
此解决方法使用env
命令来设置PATH。与不同sudo
,env
使用给定变量设置环境,然后查找命令参数并在修改后的环境下运行命令。如上info (coreutils) env invocation
所说:
修改要
PATH
在搜索命令之前生效。
当您将PATH变量更改为包括目录时/opt/lampp/bin
,您使用了以下命令:
export PATH=$PATH:/opt/lampp/bin
这对于当前的shell和所有当前shell的子进程(例如从此shell调用的shell)将是有效的。当您退出此shell并退出其所有子级时,该修改过的PATH变量已被完全遗忘,而当您打开新的shell时,您会发现不包含的旧PATH变量/opt/lampp/bin
。因此,muru建议的完整命令,
sudo env PATH="$PATH:/opt/lampp/bin" php -v
如果您仍未使用已添加的Shell,则很有必要/opt/lampp/bin
。
要永久更改路径,您需要编辑一些配置文件来修改您的用户环境,或者在外壳启动时由外壳读取。您可以在中添加一行以分配环境变量~/.profile
,例如:
PATH="$PATH:/opt/lampp/bin"
然后,注销并重新登录(或运行source ~/.profile
以立即查看效果)之后,您将始终能够运行
php -v
或者
sudo env PATH="$PATH" php -v
无需先调整您的PATH。
一个更方便的解决方法是在secure_path
默认路径PATH和默认路径中建立到可执行文件的符号链接,例如:
sudo ln -s /opt/lampp/bin/php /usr/local/bin/php
这样,使用调用命令时sudo
,您将不需要做任何特殊的事情,也不需要永久或临时地采取任何步骤来调整PATH。
如果要安装的程序的名称与系统进程可能尝试调用的另一个程序的名称相同,请给符号链接一个不同的名称,以避免混淆这些进程。您可以使用以下type
命令来检查您要使用的名称是否不是其他命令的名称:
$ type php
bash: type: php: not found
因此,在此系统上,我现在可以创建命令php
而不必担心任何错误。如果php
将来安装其他提供命令的程序,则可能不得不重新考虑我的配置。
您还可以为该命令创建一个别名并将其添加到您的中~/.bashrc
,例如:
alias sudo-php='sudo env PATH="$PATH:/opt/lampp/bin/php"'
然后,您可以(在运行source .bashrc
或打开新的shell之后)运行
sudo-php
而不sudo php
是以root用户身份运行该程序,并且sudo
不会声称自己不知道其位置。
该别名仅在交互式shell中可用,因此不会混淆其他程序。
当然,可以使用来为其创建别名,sudo
以使其始终使用您的PATH alias sudo='sudo env PATH="$PATH"'
,但这是一个坏主意,因为它会使系统的安全性降低。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句