На EC2: команда sudo node не найдена, но node без sudo в порядке


120

Я только что установил nodejs на новый микро-экземпляр EC2.

Я установил его нормально, ./configure -> make -> sudo make install.

Проблема: когда я запускаю «узел» под пользователем ec2, он работает отлично. Когда я запускаю «sudo node», он не работает.

Я узнал, что узел находится в:

[ec2-user@XXXX ~]$ whereis node
node: /usr/local/bin/node /usr/local/lib/node

и текущий путь

[ec2-user@XXXX ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/bin

но путь sudo

[root@ip-10-112-222-32 ~]# echo $PATH
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

затем я попытался отредактировать корневой PATH, чтобы включить пути к узлу, поэтому «узел» запускается, когда я вхожу в систему как root, но он все равно не работает, когда я вхожу в систему как пользователь ec2 и запускаю «sudo node» ,

Мне это нужно для правильной установки npm. Есть идеи, как включить путь к узлу при запуске «sudo node»?


Как вы редактировали корневой PATH?
Приостановлено до дальнейшего уведомления.

После долгих попыток я сделал это, и это сработало: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Ответы:


320

Да, это немного раздражает, но вы можете исправить это некоторыми ссылками:

sudo ln -s /usr/local/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/node /usr/lib/node
sudo ln -s /usr/local/bin/npm /usr/bin/npm
sudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf

Могло быть и больше, но это все, что я нашел до сих пор. Отсутствие node-waf приведет npmк сбою некоторых установок с довольно загадочным сообщением об ошибке.


Мне просто любопытно, должна ли эта привязка выполняться только в системе Amazon AMI? Отделяет ли система Amazon AMI корневой путь от пути пользователя?
user482594

Отсутствие node-wafпричин npm rebuildдля ошибки. Есть ли чистый способ исправить это? Нужно ли мне?
user730569 06

1
У меня это не сработало по нескольким причинам. 1) У меня нет доступа к sudo. Я нахожусь на общем хосте. 2) /usr/localне существует. Однако я сделал каталог ~ / local. 3) После удаления /usrи sudoкаждой из этих строк кода и запускать их через мою консоль, ничего не изменилось.
Wolfpack'08

1
Это было полезно. Но может ли кто-нибудь объяснить, почему и как все работает?
Тарун Гупта

2
@Tarun: прочтите переменную PATH оболочки и то, как она используется, чтобы найти, какой двоичный файл выполнить для любой данной команды. Команда ln просто связывает второе имя с тем же файлом.
Майкл Диллон

33

Я добавил /usr/local/binк secure_pathв/etc/sudoers

$ sudo visudo

Затем измените эту строку:

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

Для того, чтобы:

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

19

это происходит потому, что исполняемый файл узла не найден в / usr / bin. Итак, следуйте инструкциям:

  1. найти узел:

whereis node

в моем случае: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. сделать символическую ссылку для узла:

    sudo ln -s /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node /usr/bin/node

Это сделано!


отличный совет - я также сделал, sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmкак я пытался выполнить sudo npm installна моем экземпляре aws ec2 после перехода по ссылке
указатель NULL

9

Почему бы не использовать абсолютный путь к узлу? Если вы планируете использовать сценарий выскочки, ему в любом случае понадобится абсолютный путь.

sudo /usr/local/bin/node server.js

1
лучшее решение, работает и не портит систему, как все lnрешения.
SidOfc

5

попробуйте следующее:

export PATH=$PATH:/usr/local/bin
sudo node --version

2
Не будет работать для дистрибутивов, secure_pathустановленных в sudoersфайле.
kenorb

5

Вы можете передать полный путь к nodeисполняемому файлу из родительского (не-sudo shell) с помощью whichкоманды.

sudo `which node`

4

Для меня это сработало, просто сменив владельца папки узла с root на пользователя ec2 (вошедшего в систему как пользователь ec2).

(Примечание: я создал свою папку узла в / var / lib /)

sudo chown -R ec2-user /var/lib/node/

затем

npm install mongojs

должен работать нормально (конечно, при условии, что вы установили npm ok!)


3

Вот подход, который не использует символические ссылки и не требует root:

$ git clone https://github.com/joyent/node.git
$ cd node
$ mkdir ~/opt
$ export PREFIX=~/opt; ./configure
$ make
$ make install
$ echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc

Тогда я сделал:

$ git clone https://github.com/isaacs/npm.git
$ cd npm
$ make install

Здесь обсуждаются преимущества неиспользования узла с правами root:

http://increaseyourgeek.wordpress.com/2010/08/18/install-node-js-without-using-sudo/

Он соответствует:

https://github.com/joyent/node/wiki/Installation



1

В моем случае Node был установлен без префикса sudo . Итак, узел был недоступен для суперпользователя, поэтому он не работаетsudo node server



-1

Я не знаю, правильный ли это путь, но я так поступил ...

sudo su
export PATH=$PATH:/home/ec2-user/local/node/bin
curl http://npmjs.org/install.sh | sh
chown -R ec2-user /home/ec2-user/local/node
exit

Это установило npm, и теперь я могу устанавливать любые пакеты, которые хочу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.