web-dev-qa-db-ja.com

「$ 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が機能しないことです。

PDATE: PHP53への新しいパスを/root/.profileに追加しました:

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


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


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

mesg n

次に、OSを再起動しました。さまざまなテストの結果を次に示します。

$ 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

少なくとも2つの問題があるようです。

  1. /root/.profileの$ PATHをエクスポートしても効果はありません(OSの再起動後にテスト済みです!)
  2. # . /root/.profileを実行しても、Sudo php -vは機能しません。

OS:最新の更新を含むUbuntu 12.04。

1
bannndi

これは、SudoPATHをどのように定義するかにかかっています。基本的に、呼び出し元のユーザーのPATHを取得するか、そのように構成されている場合は、secure_path/etc/sudoers変数に設定されている内容を読み取ります。

したがって、2つの選択肢があります。

  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を期待どおりに実行できるはずです。

3
terdon