私のパスにbinディレクトリを追加しましたが、「sudoコマンド」を使用してそのディレクトリからコマンドを実行することはできません。

私のパスにbinディレクトリを追加しましたが、「sudoコマンド」を使用してそのディレクトリからコマンドを実行することはできません。

binすべてのスクリプトが配置されているホームフォルダにディレクトリを作成しました。それから私の.bashrcに以下を追加しました:

export PATH=$PATH:/home/myusername/bin

これにより、私が置いたファイルにどこからでもアクセスできます。ただし、一部のスクリプトはrootとして実行する必要があります。だから私は私の.bashrcをrootにシンボリックリンクすることができると思いました(例えば、/root/.bashrcが/home/myusername/.bashrcを指していますが、それが賢明なものかどうかはわかりません)。そのため、rootでスクリプトを実行する必要がある場合は、次の操作しか実行できません。

sudo program_that_requires_root

しかし、私は次のような結果を得ます:

sudo: program_that_requires_root: command not found

rootとしてログインしてプログラムを実行するとうまくいきます。それでは、私が望むことを達成する正しい方法は何ですか?

答え1

sudoersファイルにこの2行があることを確認する必要があります。

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$

詳細については、次のURLを参照してください。

答え2

sudoほとんどの構成では、環境変数を組み込みPATH値または管理者が提供したデフォルト値にリセットします。だから、単に入力することはできませんsudo myscript

ラッパー関数を作成できます。

sudo () {
  local cmd
  case $1 in
    -*) :;; # there are options, change nothing
    */*) :;; # explicit path, change nothing
    *) # a command name, look it up in our $PATH
      cmd=$(type -p -- "$1")
      if [[ -n $cmd ]]; then shift; set -- "$c" "$@"; fi;;
  esac
  command sudo "$@"
}

(これはbashで動作します。kshまたはzshtype -Pに変更してください。)type -p

答え3

デフォルトでは、sudoは環境をリセットします。 rootの.bashrcにパスを追加してみましたか?または、-Eを使用してsudoを呼び出します(sudoersのsetenvが設定されている場合、またはそのコマンドにSETENVフラグが設定されている場合にのみ有効です)。

関連情報