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”?


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.


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

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!


ś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

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

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`

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!)


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



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


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)"

-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ę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.