如何使这样的命令“$ sudo php -v”工作?

如何使这样的命令“$ sudo php -v”工作?

我已经从源代码安装并运行 PHP53。

PATH 设置~/.profile如下:export PATH=$PATH:/usr/local/php53/bin

$ php -v # works good

但:

$ sudo php -v # sudo: php: command not found

我需要运行sudo composer self-update,它给了我一条消息:

/usr/bin/env: php: No such file or directory

$ composer -v # works good (installed globally by this manual https://getcomposer.org/doc/00-intro.md#globally

简而言之:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

我在使用 Apache22 时遇到了类似的问题apachectl,但我使用完整路径通过 sudo 运行。但这是一种解决方法,我想知道如何使它正常工作。

问题是,它$ sudo php -v不起作用sudo composer self-update

更新: 我在 /root/.profile 中添加了 PHP53 的新路径:

# ~/.profile: executed by Bourne-compatible login shells.


export PATH=$PATH:/usr/local/php53/bin


if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

消息

然后我重新启动了操作系统,以下是各种测试的结果:

$ echo $PATH # /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/apache2_2/bin:/usr/local/php53/bin
$ php -v # works, as before
$ sudo php -v # "sudo: php: command not found"


$ sudo su
# echo $PATH # /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games , i.e. "export PATH=$PATH:/usr/local/php53/bin" did not have effect on $PATH.
# php -v # "The program 'php' is currently not installed. You can install it by typing:
apt-get install php5-cli"
# . /root/.profile 
# php -v # "PHP 5.3.29 (cli) (built: Sep 24 2015 13:05:17) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies

但:

$ sudo php -v # still, "sudo: php: command not found"

为了缓解一下压力,

$ sudo /usr/local/php53/bin/php -v # is working 
PHP 5.3.29 (cli) (built: Sep 24 2015 13:05:17) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies

看来我们至少有两个问题:

  1. /root/.profile 中的导出 $PATH 无效(操作系统重启后测试!)
  2. 即使我这样做了# . /root/.profilesudo php -v仍然不起作用。

操作系统:Ubuntu 12.04,最新更新。

答案1

这取决于如何sudo定义它的PATH。基本上,它要么获取PATH调用它的用户的,要么如果这样配置,它将读取在secure_path变量中设置的内容/etc/sudoers

因此,您有两个选择:

  1. 将二进制文件所在的目录添加php到安全路径。运行sudo visudo,找到这一行:

    Defaults   secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$
    

    并将其更改为

    Defaults   secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/php53/bin:$
    
  2. 只需注释掉该secure_path行,并sudo与调用用户共享相同的路径。当然,这不是最安全的选择,但这取决于您。为此,请运行并在行首sudo visudo添加:#

    # Defaults   secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$
    

保存文件并退出visudo,您应该能够sudo php -v按预期运行。

相关内容