「sudo」で$ PATHを保持する方法は?


123

/ opt / godi / sbin(カスタムディレクトリ)にインストールされたプログラムを実行する必要があります。次の行を.bashrcファイルに追加して、そのディレクトリをPATHに追加する場合

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

その後、コマンドを正常に実行しようとすることができます(sudoが必要であるため失敗します)。ただし、sudoを使用しようとすると:

sudo godi_console

次のエラーが表示されます

sudo: godi_console: command not found

sudoを使用した後にPATH変数を調べると、通常のユーザーと同じPATHが含まれていないことがわかります。

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATHが同じではないのはなぜですか?私は何か間違っていますか?私はDebian Jessieを使用していますが、残念ながら、sudoにgodi_consoleへの絶対リンクを渡すことで問題を回避することはできません。godi_console自体も正しく設定されているPATHに依存しているためです。


2
試してくださいsudo -E godi_console-E「環境の維持」を意味します。
D_Bye

5
@D_Bye、secure_pathおよび/またはenv_resetがsudoDebianのような多くの展開の場合のように構成されている場合は機能しません。
ステファンシャゼラス

@StephaneChazelas情報をありがとう-私はDebianを使用していないので、おそらく黙っておくべきだったでしょう!
D_Bye


関連する質問は、程度suではないsudo、あるunix.stackexchange.com/questions/460478
JdeBP

回答:


149

いつでもできます:

sudo env "PATH=$PATH" godi_console

Debianの上のセキュリティ対策として、/etc/sudoers持ってsecure_path安全な値に設定するオプションを選択します。

ご了承ください:

sudo "PATH=$PATH" godi_console

どこsudo含む引数有数のお菓子=自体が環境変数の代入などの文字は、また、実行中に働くだろうgodi_console、あなたの $PATH(とは対照的に、secure_pathその環境で)が、影響しないsudoの実行可能ファイルの検索パスを、それほど役に立たないsudoことを見つけることにgodi_console


5
それはグローバル設定を変更する必要が避けられるので、私は(つまりは、最小特権の原則を維持する)最高この回答が好き
アロイスMahdal

5
sudo "PATH=$PATH" godi_console ちなみにCentOs7では動作しませんでした。環境が必要
ハカン馬場

1
@StéphaneChazelas sudo "PATH=$PATH" godi_console本当に機能しますか?sudo受け入れVAR=value、それが実行するコマンドの環境に影響を与える、引数を、しかしとは異なりenv、またはbashsudoこれはどのように影響させていないようです、それはコマンドを検索します。これは(最近)Ubuntu 16.04でのみテストしました。しかしexempt_groupsudoers(テストのためだけに、これを解決策とは考えていません!)にオプションを追加してみましたが、結果は明らかになりました。フォームのコマンドは機能しPATH="$PATH" sudo some-command始めましたが、フォームのコマンドはsudo PATH="$PATH" some-command まだ機能していませんでした。
エリアケイガン

2
@ballsatballsdotballs。そのエイリアスはインタラクティブシェルにのみ影響するため、比較的害はありません。
ステファンシャゼル

2
これらのタイプの場合、psudoというエイリアスを作成します。エイリアスpsudo = "sudo env \" PATH = $ PATH \ ""。その後、私の通常のsudoの使用は影響を受けません。
mikeTronix

46

デフォルトのPATHを設定することもできます /etc/sudoers

を使用してファイルを編集します visudo

そして行をあなたが望むものに更新します: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDOはデフォルトでenv変数をリセットしています。

env_resetというマニュアルとオプションを確認してください。

/ etc / sudoersで無効にするだけです。


5
クール!Ubuntuでは、secure_pathとenv_resetの行をvisudoしてコメントアウトできます。システムの安全性が大幅に低下するため、注意してください。
-RawwrBag

無効化してもPATHの動作env_resetに影響しないようsudoです。
ザンナ

5

これは動作します:

sudo $(which your_command)

gpsNvidia GPUのプロセスをリストするスクリプトを呼び出す例:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

説明 :

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x

3
sudo --preserve-env=PATH env [command]

これは私の側のsecure_pathをovverrides


1

これはうまくいきました:

sudo "PATH=$PATH" [your command]

パス値で$ PATHを変更しないでください。このように書くだけです

例: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....


0

OPが求めることは正確ではないかもしれませんが、これは役に立つかもしれません:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

これにより、sudoedコマンドのPATHが変更されます。

編集:上記はほとんどナンセンスなので、私はこれが何を意味したのか分かりません。代わりに次を使用してください。

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.