293

これはPATHsudoなしの変数です:

$ echo 'echo $PATH' | sh 
/opt/local/ruby/bin:/usr/bin:/bin

これはPATHsudoの変数です:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

私が知る限り、手付かずsudoのままにしておくことになっています。PATHどうしたの?これを変更するにはどうすればよいですか?(これはUbuntu 8.04にあります)。

更新: 私が見る限り、ルートの変更として開始されたスクリプトはありませんPATH

からman sudo:

コマンドのスプーフィングを防ぐために、sudo は、ユーザーの PATH でコマンドを検索するときに、最後に ``.'' と ``'' (どちらも現在のディレクトリを示す) をチェックします (一方または両方が PATH にある場合)。ただし、実際の PATH 環境変数は変更されず、sudo が実行するプログラムにそのまま渡されることに注意してください。

4

18 に答える 18

248

これは迷惑な機能 多くのディストリビューションでのsudoの機能。

ubuntuでこの「問題」を回避するには、〜/.bashrcで次のようにします。

alias sudo='sudo env PATH=$PATH'

上記は、$PATH自体をリセットしないコマンドで機能することに注意してください。ただし、 `su'は$PATHをリセットするため、-pを使用してリセットしないように指示する必要があります。IE:

sudo su -p
于 2008-11-03T00:51:10.947 に答える
125

他の誰かがこれに遭遇し、すべてのユーザーのすべてのパス変数の変更を無効にしたい場合。
次のコマンドを使用して、sudoers ファイルにアクセスしますvisudo。次の行がどこかにあるはずです。

デフォルト env_reset

次の行に次を追加する必要があります

デフォルト !secure_path

secure_path はデフォルトで有効になっています。このオプションは、sudo 時に $PATH を何にするかを指定します。感嘆符は機能を無効にします。

于 2010-12-31T19:46:32.197 に答える
33

PATHは環境変数であるため、デフォルトではsudoによってリセットされます。

これを行うには、特別な権限が必要です。

からman sudo

       -E -E(環境の保持)オプションは、env_resetをオーバーライドします
           sudoers(5)のオプション)。どちらかが一致した場合にのみ使用可能です-
           ingコマンドにSETENVタグがあるか、sudo-でsetenvオプションが設定されています
           ers(5)。
       コマンドに設定する環境変数も渡される場合がありますVAR = value
       
       の形式のコマンドライン。例: LD_LIBRARY_PATH = / usr / local / pkg/lib。コマンドで渡される変数
       ラインには、通常の環境変動と同じ制限が適用されます。
       1つの重要な例外を除いて可能です。setenvオプションがで設定されている場合
       sudoersの場合、実行するコマンドにSETENVタグが設定されているか、コマンドがあります
       一致するのはALLであり、ユーザーは過度に適切な変数を設定できます-
       入札しました。詳細については、sudoers(5)を参照してください。

使用例:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 sudo sh test.sh 
MYEXAMPLE=1 sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

アップデート

男5sudoers:

     env_reset設定されている場合、sudoは環境をリセットして含むだけにします
                       LOGNAME、SHELL、USER、USERNAME、およびSUDO_ * vari-
                       できる。呼び出し元の環境内の変数
                       一致するenv_keepリストとenv_checkリストが追加されます。
                       env_keepおよびenv_checkのデフォルトの内容
                       sudoがrootによって実行され、
                       -Vオプション。sudoがSECURE_PATHでコンパイルされた場合
                       オプションの場合、その値はPATH環境に使用されます
                       変数。このフラグはデフォルトでオンになっています。

したがって、これがでコンパイルされている/コンパイルされていないことを確認する必要があるかもしれません。

Gentooではデフォルトです

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 
于 2008-11-03T00:29:53.533 に答える
18

このバグはかなり前から存在しているようです。役立つと思われるいくつかのバグ リファレンスを次に示します (購読/投票、ヒント、ヒント...):


Debian バグ #85123 (「sudo: SECURE_PATH はまだオーバーライドできません」) (2001 年から!)

このバージョンの sudo には Bug#20996 がまだ残っているようです。変更ログには、実行時にオーバーライドできると書かれていますが、その方法はまだわかりません。

彼らは、あなたの sudoers ファイルに次のようなものを入れることについて言及しています:

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

しかし、少なくともUbuntu 8.10でそれを行うと、次のエラーが表示されます:

visudo: unknown defaults entry `secure_path' referenced near line 10

Ubuntu バグ #50797 (「--with-secure-path でビルドされた sudo には問題があります」)

さらに悪いことに、私が知る限り、sudoers ファイルで secure_path を再指定することは不可能です。したがって、たとえば、ユーザーが /opt の下にあるものに簡単にアクセスできるようにしたい場合は、sudo を再コンパイルする必要があります。


はい。再コンパイルせずにこの「機能」をオーバーライドする方法が必要です。セキュリティ偏見者が環境にとって何が最善かを教え、それを無効にする方法を提供しないことほど悪いことはありません。


これは本当に迷惑です。セキュリティ上の理由から、デフォルトで現在の動作を維持するのが賢明かもしれませんが、ソース コードから再コンパイルする以外に、それをオーバーライドする方法があるはずです! 多くの人が PATH 継承を必要としています。なぜメンテナがそれを調査しないのだろうかと思います。これは、容認できる解決策を簡単に思いつくように思えます。


私はこのようにそれを回避しました:

mv /usr/bin/sudo /usr/bin/sudo.orig

次に、以下を含むファイル /usr/bin/sudo を作成します。

#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"

次に、通常の sudo は、非セキュアパス sudo と同じように機能します


Ubuntu バグ #192651 (「sudo パスが常にリセットされる」)

このバグの複製が最初に 2006 年 7 月に報告されたことを考えると、効果のない env_keep がどのくらいの期間運用されていたかはわかりません。上記のようなトリックをユーザーに強制することのメリットが何であれ、sudo と sudoers の man ページは、PATH を変更するオプションが事実上冗長であるという事実を反映する必要があります。

実際の実行を反映するようにドキュメントを変更することは、不安定にならず、非常に役立ちます。


Ubuntu バグ #226595 (「PATH を保持/指定できない」)

PATH に標準以外のバイナリ フォルダーを追加して sudo を実行できるようにする必要があります。要件を既に /etc/environment に追加していたので、sudo でコマンドを実行したときにコマンドが見つからないというエラーが表示されたときは驚きました.....

これを修正するために次のことを試みましたが、成功しませんでした。

  1. " sudo -E" オプションの使用 - 機能しませんでした。私の既存のPATHはまだsudoによってリセットされていました

  2. /etc/sudoers でDefaults env_reset" " を " " に変更しても機能しませんでした (sudo -E と組み合わせても)Defaults !env_reset

  3. /etc/sudoers でのコメント解除env_reset(" " など) も機能しませんでした。#Defaults env_reset

  4. ' Defaults env_keep += "PATH"' を /etc/sudoers に追加しても機能しませんでした。

明らかに - man ドキュメントにもかかわらず - sudo は PATH に関して完全にハードコーディングされており、ユーザーの PATH を保持することに関して柔軟性がありません。sudo を使用してルート権限でデフォルト以外のソフトウェアを実行できないため、非常に面倒です。

于 2008-12-17T19:43:53.213 に答える
11

実際には、sudo で PATH をリセットすることが望ましいと思います。そうしないと、ユーザー アカウントを侵害した攻撃者が、あらゆる種類のツールのバックドア バージョンをユーザーの PATH に配置し、sudo の使用時にそれらが実行される可能性があります。

(もちろん、sudo で PATH をリセットすることは、この種の問題に対する完全な解決策ではありませんが、役に立ちます)

これは実際に使用するとどうなりますか

Defaults env_reset

exempt_groupまたはを使用せずに /etc/sudoers でenv_keep

これは、ユーザーのパスに追加しなくても、ルートのみに役立つディレクトリ ( や など) を sudo パスに追加できるため、便利/sbinです/usr/sbin。sudo で使用するパスを指定するには:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
于 2011-12-09T15:16:11.487 に答える
7

Karmic リポジトリの sudo を使用して動作するようになりました。私の構成からの詳細:

root@sphinx:~# cat /etc/sudoers | grep -v -e '^$' -e '^#'
Defaults    env_reset
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/grub-1.96/sbin:/opt/grub-1.96/bin"
root    ALL=(ALL) ALL
%admin ALL=(ALL) ALL
root@sphinx:~# cat /etc/apt/sources.list
deb http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe

deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe

deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe
root@sphinx:~# 

root@sphinx:~# cat /etc/apt/preferences 
Package: sudo
Pin: release a=karmic-security
Pin-Priority: 990

Package: sudo
Pin: release a=karmic-updates
Pin-Priority: 960

Package: sudo
Pin: release a=karmic
Pin-Priority: 930

Package: *
Pin: release a=jaunty-security
Pin-Priority: 900

Package: *
Pin: release a=jaunty-updates
Pin-Priority: 700

Package: *
Pin: release a=jaunty
Pin-Priority: 500

Package: *
Pin: release a=karmic-security
Pin-Priority: 450

Package: *
Pin: release a=karmic-updates
Pin-Priority: 250

Package: *
Pin: release a=karmic
Pin-Priority: 50
root@sphinx:~# apt-cache policy sudo
sudo:
  Installed: 1.7.0-1ubuntu2
  Candidate: 1.7.0-1ubuntu2
  Package pin: 1.7.0-1ubuntu2
  Version table:
 *** 1.7.0-1ubuntu2 930
         50 http://au.archive.ubuntu.com karmic/main Packages
        100 /var/lib/dpkg/status
     1.6.9p17-1ubuntu3 930
        500 http://au.archive.ubuntu.com jaunty/main Packages
root@sphinx:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin
root@sphinx:~# exit
exit
abolte@sphinx:~$ echo $PATH
/home/abolte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/chromium-17593:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/xpra-0.0.6/bin
abolte@sphinx:~$ 

ハックを使わずに最終的にこれを解決できたのは素晴らしいことです。

于 2009-07-02T06:54:12.903 に答える
4
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"
于 2009-12-15T22:09:57.627 に答える
3

/etc/sudoers の "Defaults env_reset" をコメントアウトするだけです

于 2010-03-19T18:07:46.623 に答える
3

で編集env_keepするだけ/etc/sudoers

次のようになります。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

最後に PATH を追加するだけなので、変更後は次のようになります。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

ターミナルを閉じてから、もう一度開きます。

于 2011-08-09T11:13:05.630 に答える
2

Secure_path はあなたの友達ですが、secure_path から自分を除外したい場合は、

須藤visudo

そして追加

デフォルト免除グループ=あなたのグループ

多数のユーザーを除外する場合は、グループを作成し、すべてのユーザーをそのグループに追加して、それを免除グループとして使用します。man 5 sudoers 詳細については。

于 2010-06-29T00:40:20.653 に答える
1

OpenSUSEディストリビューションのコメントで推奨される解決策は、変更することを提案しています:

Defaults env_reset

に:

Defaults !env_reset

そして、おそらく必要のない次の行をコメントアウトします。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"
于 2011-07-08T18:53:14.073 に答える
1

ファイルを sudoers used ディレクトリに移動することもできます:

    sudo mv $HOME/bash/script.sh /usr/sbin/ 
于 2015-03-25T17:24:59.330 に答える
0

ええと、パスに何かを追加しなければ、実際にはテストではありません。

bill@bill-desktop:~$ ls -l /opt/pkg/bin
合計 12
-rwxr-xr-x 1 ルート ルート 28 2009-01-22 18:58 foo
bill@bill-desktop:~$ which foo
/opt/pkg/bin/foo
bill@bill-desktop:~$ sudo su
root@bill-desktop:/home/bill# which foo
root@bill-desktop:/home/bill#
于 2009-01-23T03:02:10.577 に答える