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

Я только что установил 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»?


person foobar    schedule 12.02.2011    source источник
comment
Как вы редактировали корневой PATH?   -  person Dennis Williamson    schedule 12.02.2011
comment
После долгих попыток я сделал это, и оно работает: ‹pre› sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh ‹/pre›   -  person    schedule 20.06.2011


Ответы (14)


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

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 установок с довольно загадочным сообщением об ошибке.

person Michael Dillon    schedule 21.02.2011
comment
Мне просто любопытно, нужно ли делать эту привязку только в системе Amazon AMI? Отделяет ли система Amazon AMI корневой путь от пути пользователя? - person user482594; 23.02.2012
comment
Отсутствие node-waf вызывает ошибку npm rebuild. Есть ли чистый способ исправить это? Нужно ли мне? - person user730569; 06.06.2012
comment
У меня это не сработало по нескольким причинам. 1) У меня нет доступа к sudo. Я нахожусь на общем хосте. 2) /usr/local не существует. Тем не менее, я создал каталог ~ / local. 3) После удаления /usr и sudo из каждой из этих строк кода и запуска их через мою консоль ничего не изменилось. - person Wolfpack'08; 06.07.2013
comment
Это было полезно. Но может ли кто-нибудь объяснить, почему и как все работает? - person Tarun Gupta; 27.12.2013
comment
@Tarun: прочтите переменную PATH оболочки и то, как она используется, чтобы найти, какой двоичный файл выполнить для любой данной команды. Команда ln просто связывает второе имя с тем же файлом. - person Michael Dillon; 27.12.2013
comment
Спасибо @MichaelDillon. ln означает предоставление другой ссылки для пути. Правильно? - person Tarun Gupta; 28.12.2013
comment
Помог мне с аналогичной проблемой с композитором на экземпляре EC. Установлено глобально composer self-update дало ошибку разрешений [ErrorException] rename(/home/ec2-user/.composer/cache/composer-temp.phar,/usr/local/bin/composer): Permission denied НО sudo composer self-update не смог найти composer. Добавление ссылки, как было предложено, сработало. - person Tofuwarrior; 13.05.2015
comment
Я использую Amazon Linux. Строка «sudo ln -s / usr / local / lib / node / usr / lib / node» означает «sudo ln -s / usr / local / lib / node_modules / usr / lib / node_modules»? - person stevejay; 18.07.2015
comment
Вау! Спас мою жизнь (Y) - person softvar; 25.01.2016
comment
Хотел бы я проголосовать за это дважды, я использовал его несколько раз в течение 2 дней - person christophetd; 22.03.2016
comment
sudo ln -s $(which node) /usr/bin/node если вы боитесь опечаток и используете nvm, как я. Я также добавил символические ссылки sudo ln -s /path/to/lib/node_modules /usr/lib/node_modules и sudo ln -s $(which npx) /usr/bin/npx на всякий случай. - person Stardust; 02.02.2021
comment
Работал как шарм. Благодаря тонну. - person Siva Karthikeyan; 10.07.2021

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

$ sudo visudo

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

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

To:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
person Jack Frost    schedule 02.01.2014

это происходит из-за того, что исполняемый файл узла не найден в / 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

Это сделано!

person Jeff Pal    schedule 31.01.2018
comment
отличный совет - я также сделал sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npm, когда пытался выполнить sudo npm install на моем экземпляре aws ec2 после того, как следовал ссылка - person NULL pointer; 14.08.2018

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

sudo /usr/local/bin/node server.js
person Shripad Krishna    schedule 16.02.2011
comment
лучшее решение, работает и не портит систему, как все ln решения. - person SidOfc; 21.05.2020
comment
Кажется, единственное решение, которое работает - person KylianMbappe; 20.12.2020

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

export PATH=$PATH:/usr/local/bin
sudo node --version
person Amro    schedule 12.02.2011
comment
Не работает для дистрибутивов, для которых secure_path установлен в sudoers файле. - person kenorb; 24.12.2015

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

sudo `which node`
person Pavel Zubkou    schedule 09.02.2017

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

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

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

потом

npm install mongojs

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

person user1839216    schedule 26.02.2013

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

person Will Voelcker    schedule 25.01.2019

Вот подход, который не использует символические ссылки и не требует 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

person Jack Murphy    schedule 21.02.2012

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

person shubham    schedule 26.10.2017

Войдите как 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)"
person Baimyrza Shamyr    schedule 11.08.2020

Это то, что я сделал, чтобы решить похожую проблему. Примечание: я установил узел с помощью оснастки.

Шаг 1. Установите узел с помощью оснастки

sudo snap install node --classic

Шаг 2. Найдите, где был установлен узел

whereis node

В моем случае

/snap/bin/node.npm 
/snap/bin/node.npx 
/snap/bin/node.yarn 
/snap/bin/node 
/snap/bin/node.yarnpkg

Шаг 3. Создайте символические ссылки на node, npm, npx и yarn.

sudo ln -s /snap/bin/yarn /usr/bin/yarn
sudo ln -s /snap/bin/node /usr/bin/node
sudo ln -s /snap/bin/npm /usr/bin/npm

Наконец, узел доступен для всех пользователей, даже для группы sudo

sudo node

Установка узла через оснастку для всех пользователей, ubuntu, debian

person slimgera00    schedule 24.05.2021

Я пробовал все, что упоминалось в приведенных выше ответах, но ничего не сработало. Вероятно, из-за моего непонимания концепций, связанных с символьными ссылками. Я решил проблему, не используя nvm. Я только что создал новый экземпляр ec2 и не устанавливал nvm. Вместо этого я установил node и npm вот так:

sudo apt update
sudo apt install nodejs npm

И это сделало это для меня.

person Farhan Ali    schedule 25.06.2021

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

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, и теперь я могу устанавливать любые пакеты, которые хочу.

person bdavis    schedule 22.03.2011