Na EC2: nie znaleziono polecenia węzła sudo, ale węzeł bez sudo jest w porządku

120

Właśnie zainstalowałem nodejs na nowej instancji micro EC2.

Zainstalowałem go normalnie, ./configure -> make -> sudo make install.

Problem: Kiedy uruchamiam "node" pod ec2-user, działa idealnie. Kiedy uruchamiam „węzeł sudo”, kończy się niepowodzeniem.

Dowiedziałem się, że węzeł jest w:

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

a obecna ścieżka to

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

ale ścieżka sudo jest

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

następnie próbowałem edytować główną ścieżkę PATH, aby uwzględnić ścieżki do węzła, więc „węzeł” działa, gdy jestem zalogowany jako root - ale nadal nie będzie działać, gdy zaloguję się jako ec2-user i uruchomię „sudo node” .

Potrzebuję tego, aby zainstalować npm rightfly. Masz jakiś pomysł, jak dołączyć ścieżkę do węzła podczas uruchamiania „węzła sudo”?

foobar
źródło
Jak wyedytowałeś główną ścieżkę PATH?
Wstrzymano do odwołania.
Po wielu próbach zrobiłem to i działa: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Odpowiedzi:

320

Tak, jest to trochę denerwujące, ale możesz to naprawić za pomocą kilku linków:

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

Może być ich więcej, ale to wszystko, na co do tej pory się natknąłem. Brak węzła-waf spowoduje, że niektóre npminstalacje zakończą się niepowodzeniem, wyświetlając dość tajemniczy komunikat o błędzie.

Michael Dillon
źródło
Jestem po prostu ciekawy, czy to linkowanie trzeba robić tylko w systemie Amazon AMI? Czy system Amazon AMI oddziela ścieżkę roota od ścieżki użytkownika?
user482594
Brak node-wafpowodów npm rebuilddo błędów. Czy istnieje czysty sposób, aby temu zaradzić? Czy muszę?
user730569
1
To nie zadziałało dla mnie z kilku powodów. 1) Nie mam dostępu do sudo. Jestem na wspólnym hoście. 2) /usr/localnie istnieje. Zrobiłem jednak katalog ~ / local. 3) Po usunięciu /usri sudoz każdej z tych linii kodu i uruchomieniu ich przez moją konsolę nic się nie zmieniło.
Wolfpack'08,
1
To było pomocne. Ale czy ktoś może wyjaśnić, dlaczego i jak to działa?
Tarun Gupta
2
@Tarun: przeczytaj zmienną PATH powłoki i dowiedz się, jak jest używana do znalezienia pliku binarnego do wykonania dla danego polecenia. Polecenie ln po prostu łączy drugą nazwę z tym samym plikiem.
Michael Dillon
33

I dodaje /usr/local/binsię secure_pathw/etc/sudoers

$ sudo visudo

Następnie zmień tę linię:

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

Do:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Dziadek Mróz
źródło
19

dzieje się tak, ponieważ plik wykonywalny węzła nie został znaleziony w / usr / bin. Więc postępuj zgodnie z instrukcjami:

  1. znajdź węzeł:

whereis node

w moim przypadku: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. utwórz dowiązanie symboliczne dla węzła:

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

Zrobione!

Jeff Pal
źródło
świetna wskazówka - zrobiłem również tak, sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmjak próbowałem zrobić sudo npm installna mojej instancji aws ec2 po kliknięciu linku
wskaźnik NULL.
9

Dlaczego nie użyć bezwzględnej ścieżki do węzła? Jeśli planujesz użyć skryptu początkowego, i tak będzie potrzebować bezwzględnej ścieżki.

sudo /usr/local/bin/node server.js
Shripad Krishna
źródło
1
najlepsze rozwiązanie, działa i nie psuje systemu jak wszystkie inne lnrozwiązania.
SidOfc
5

spróbuj następujących rzeczy:

export PATH=$PATH:/usr/local/bin
sudo node --version
Amro
źródło
2
Nie będzie działać dla dystrybucji, które zostały secure_pathustawione w sudoerspliku.
kenorb
5

Możesz przekazać pełną ścieżkę do nodepliku wykonywalnego z rodzica (powłoki innej niż sudo) za pomocą whichpolecenia.

sudo `which node`
Pavel Zubkou
źródło
4

W moim przypadku wystarczyło zmienić własność folderu węzła z roota na ec2-user (zalogowany jako ec2-user).

(Uwaga: utworzyłem folder węzła w / var / lib /)

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

Następnie

npm install mongojs

powinno działać dobrze (oczywiście pod warunkiem, że zainstalowałeś npm ok!)

user1839216
źródło
3

Oto podejście, które nie używa linków symbolicznych lub wymaga roota:

$ 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

Potem zrobiłem:

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

Korzyści wynikające z nieużywania węzła jako root są omówione tutaj:

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

Jest wbudowany w:

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

Jack Murphy
źródło
3

Co powiesz na użycie „sudo $ (który węzeł)” zamiast „sudo node”?

Will Voelcker
źródło
Działał jak urok!
lordneru
1

W moim przypadku Node został zainstalowany bez prefiksu sudo . Więc węzeł był niedostępny dla superużytkownika, dlatego nie działasudo node server

shubham
źródło
0

Wpisz jako root za pomocą

sudo su

a następnie wykonaj standardowe czynności

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)"
Baimyrza Shamyr
źródło
-1

Nie wiem, czy to właściwy sposób, ale tak właśnie zrobiłem ...

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

Zainstalowałem npm i mogę teraz zainstalować dowolne pakiety, które chcę.

bdavis
źródło