У EC2: команда вузла sudo не знайдена, але вузол без sudo - це нормально


120

Я тільки що встановив nodejs на новому мікроакумуляторі EC2.

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

Проблема: Коли я запускаю "вузол" під користувачем ec2, він працює ідеально. Коли я запускаю "вузол судо", він виходить з ладу.

Я дізнався, що вузол знаходиться у:

[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

але, шлях судо є

[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 properfly. Будь-яка ідея про те, як включити шлях до вузла під час запуску "sudo node"?


Як ви редагували кореневий PATH?
Призупинено до подальшого повідомлення.

Після багато спроб я зробив це, і це працює: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Відповіді:


319

Так, це трохи дратує, але ви можете виправити це за допомогою деяких посилань:

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з ладу деяких установок із досить криптовим повідомленням про помилку.


Мені просто цікаво, чи потрібно це пов'язування здійснювати лише в системі AMI Amazon? Чи відокремлена система Amazon AMI від кореневого шляху від шляху користувача?
user482594

Відсутність node-wafпричин npm rebuildдля усунення помилок. Чи є чистий спосіб виправити це? Чи потрібно мені?
user730569

1
Це не спрацювало для мене з кількох причин. 1) У мене немає доступу до судо. Я на спільному хості. 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як намагався зробити 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 оболонки) за допомогою whichкоманди.

sudo `which node`

4

Для мене він працював, щоб просто змінити право власності на папку вузла з root на користувач ec2 (увійшов як ec2-користувач).

(Примітка. Я створив свою папку вузлів у / var / lib /)

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

Тоді

npm install mongojs

має працювати нормально (за умови, що ви встановили npm нормально, звичайно!)


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

Переваги не запуску вузла як кореня обговорюються тут:

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.