web-dev-qa-db-ja.com

「sudo pip」は通常の「pip」とは異なります

実行するとき

which pip3

それが指す

/usr/.../anaconda3/bin/pip3

ただし、実行すると

Sudo which pip3

結果は

/usr/bin/pip3

この問題はどこから来て、どのようにSudo pip/usr/.../anaconda3/bin/pip3を指すようにするのですか?

4
PKuhn

Sudoは、コマンドを実行する前に環境をサニタイズします。その際、ディレクティブsecure_pathの値が設定されている場合、現在のPATHではなく、SudoコマンドのPATHとして使用されます。

私のシステムでは:

% Sudo grep -E 'secure_path' /etc/sudoers
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

ので、私は持っています:

% echo $PATH
/home/foobar/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

% Sudo bash -c 'echo $PATH' 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

現在のパスを維持するため、またはSudoPATH/usr/.../anaconda3/binを追加するためにできること:

  • PATHコマンドの環境でwhichを渡します。

    Sudo PATH="$PATH" which pip3
    

    必要なPATHも設定できます。

  • Sudoを実行している間、現在の環境を維持します:

    Sudo -E which pip3
    
  • secure_pathを先頭に配置して#値を無効にするか、行を削除して現在のPATHを保持します。

    # Defaults        secure_path="....."   
    

    代わりに、secure_pathを変更して、単に/usr/.../anaconda3/binを追加することもできます先頭

  • PATHenv_keepディレクティブに追加して、PATHSudo提供環境に保持します。

    Defaults        env_keep += "PATH"
    
5
heemayl