На 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»?

Foobar
источник
Как вы редактировали корневой 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
Amro
источник
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!)

user1839216
источник
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

Джек Мерфи
источник
3

Как насчет использования sudo $ (which node) вместо sudo node?

Уилл Фёлькер
источник
Работал как шарм!
lordneru
1

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

Shubham
источник
0

Войдите как root с

sudo su

а затем выполните стандартные шаги

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node
node -e "console.log('Running Node.js ' + process.version)"
Баймырза Шамыр
источник
-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, и теперь я могу устанавливать любые пакеты, которые хочу.

bdavis
источник