sudoの使用時にコマンドが見つかりません


52

私の問題に関連しているように見えるサイト上にいくつかの質問がありますが、それらのいずれにも解決策が見つかりませんでした。

私のオペレーティングシステムはUbuntu 12.04です。にmvnインストールし/tools/noarch/apache-maven-3.1.1、私の最後に次の行を追加しました/etc/profile

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

その後、実行しsource /etc/profileます。

今、私の問題は次のとおりです。mvn --versionコマンドをmvn実行すると実行可能ファイルが見つかり、実行すると次のsudo mvn --versionようになりますsudo: mvn: command not foundPATHコマンドを実行すると異なる場合があることを知っているので、sudoこれを試しました:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

私が試した別のことは、実行sudo su -してから入力することmvn --versionです。この場合mvn、正常に検出され、コマンドは成功します。ここで何が起こっていますか?


回答:


37

$PATH シェルによって評価されるため、期待どおりにチェックが機能しません。

/etc/sudoersPATHデフォルトのものに置き換えるように設定されています。

sudoコマンドを実行する前にログインシェル環境をロードしないため、デフォルトのPATHfrom /etc/sudoersが使用されます。su -を含むログインシェルを開きます/etc/profileman bashセクションINVOCATIONを参照してください。

PATHリセットを削除するだけ/etc/sudoersです。おそらく、というルールsecure_pathです。


CentOS

CentOSではPATH、次のDefaults env_keepセクションに追加できます。

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"

答えてくれてありがとう。それは問題を解決しますが、PATH内のすべてのコマンドではなく、Mavenに対してのみ変更を実行するため、他の2つの回答の解決策の提案を好みます。
イゾモルフィウス14年

参考:回答の更新に注意してください。
kriegaex

現在のディレクトリでバイナリをsudo実行する方法sudo: ./<some_binary>: command not found。Arch Linuxを使用しています。
ネクトウィ

47

sudo電流PATHを与えます:

sudo env "PATH=$PATH" your_command

設定を変更する必要がなく、発信者が必要なことをすべて実行できるようにする素晴らしい回答。-Eさらにオプションを使用して、残りの環境を保存します。実際、これは非常に便利なので、スクリプト/エイリアス/関数に入れて簡単に使用できます。これを別の回答として追加します-しかし、@ opyateに称賛を!
トム

このコマンドを実行しようとすると、次のようになりますenv: cmd: No such file or directory-なぜそうなるのでしょうか?
アンディ

2
@Andyは、cmdを実際のコマンドに置き換えます。
オピエート

現在のディレクトリでバイナリをsudo実行する方法sudo: ./<some_binary>: command not found。Arch Linuxを使用しています。
ネックトウィ

12

@opyateの答えを詳しく説明すると、次のシェルスクリプトを使用しています(mysudoたとえば、という名前の場合があります)。

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Esudo環境を保存するように指示します。
  • env "PATH=$PATH"sudo呼び出しの外部で拡張され、外部PATHも内部で使用可能になりsudoます(これは-EPATH通常、環境全体が受ける処理に加えて特別な処理を受けるために必要です)。
  • "$@"スクリプトが受け取る引数をsudo行に渡します。

のディレクトリにあるファイルにスクリプトを保存し、アクセス許可をPATH与え+xます。


これは、既存のファイルを編集したくない場合には、はるかに優れたソリューションです。
qaisjp

4

現在の答えは少しあいまいなので、/etc/sudoersパスを変更する特定の設定はsecure_path次のとおりです。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

で変更できますがsudo visudo、さらに良いのは、必要なディレクトリを追加することです:

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

2

Mavenを最初にインストールしたときに同じ問題が発生しました。2行追加した後、問題は解決しました。

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

4つのファイルに:

/root/.bashrc
/root/.profile

そして現在のユーザー(mehran私のUbuntuユーザー名です):

/home/mehran/.bashrc
/home/mehran/.profile

1

自分の場合とまったく同じようにルートのPATH変数を変更する必要があります。つまり、/ root / .bashrcにあるsudoのプロファイルにこれらの2行を追加して、ソースにします。


1
私は/root/.bashrcを編集し、それを調達することができませんていますsudo source /root/.bashrc:取得sudo: source: command not foundとせずにsudo私を得る(予想通り)の許可が拒否されました。理論的には、新しい端末を起動することはソースと同じであるはずですが、新しい端末を起動した後sudo mvn --versionでも何も見つかりません。
イゾモルフィウス14年

@izomorphiusソースをsudoすることはできません。最初にコマンドsudo suを使用してsudoに切り替える必要があり、次に問題のファイルを入手できます。他の方法はありません。
MariusMatutiae 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.