私は問題があります。
最近、ソースから/ opt/nodeにnodejs
をインストールしました(それが何であるかわからない場合は、実際には問題ではなく、他の何かである可能性があります)。
$ ls -la /opt
...
lrwxrwxrwx 1 root root 11 2012-07-25 13:48 node -> node-0.6.3/
drwxr-xr-x 6 root root 4096 2012-07-25 13:48 node-0.6.3
...
したがって、バイナリは/opt/node/bin
にあります。
$ ls -la /opt/node/bin
...
lrwxrwxrwx 1 root root 38 2012-06-20 11:44 npm -> ../lib/node_modules/npm/bin/npm-cli.js
...
ご覧のとおり、npm
があります。コマンドラインから使いやすくするために、$PATH
スクリプト内の.bashrc
を修正しました。
HOME=$HOME:...:/opt/node/bin
ルートの.bashrc
もそうだった:
# which npm
/opt/node/bin/npm
しかし、Sudoでnpmを実行すると、npm
が見つかりません。
$ Sudo which npm
$ Sudo npm -g install uglify-js
Sudo: npm: command not found
それで、なぜそれが起こっているのですか?どうすれば欲しいものを手に入れることができますか?
ありがとう。
[〜#〜] update [〜#〜]:Paulのアドバイスに従って、追加しました
Defaults env_keep = PATH
/etc/sudoers
へ
しかし、とにかく問題は解決しません。
$ echo $PATH
... :/opt/node/bin
$ Sudo su -
#
# Sudo -V
...
Environment variables to preserve:
XAUTHORIZATION
XAUTHORITY
TZ
PS2
PS1
PATH
...
したがって、Defaults
ディレクティブはそれでうまくいきましたが、同じSudo: npm: command not found
を取得しています。
Sudo
は新しいシェルを呼び出し、新しいシェルに渡される環境変数は「/ etc/sudoers」ファイルによって管理されます。パスを通過させたい場合は、追加する必要があります
Defaults env_keep = "PATH"
'/ etc/sudoers'に移動すると、SudoシェルでPATH環境変数が保持されます
これが機能しない場合は、パスがsecure_path
ディレクティブによって上書きされている可能性があります(secure_pathがバイナリにコンパイルされる場合があります)。その場合は、このコマンドを追加して、グループ名を自分がメンバーになっているグループに置き換えてみてください。
exempt_group = "groupname"
または、secure_pathを独自のものでオーバーライドします。例:
secure_path = "/bin:/usr/bin:/sbin:/usr/sbin:/opt/node/bin"
私はこの問題を抱えていました->私の原因はnpm
が/use/local/bin
にインストールされていることです。
そして、/etc/sudoers
ファイルに次の行がありました。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
どのnpm
が啓発的な部分であったかを入力する:)