Pada EC2: perintah sudo node tidak ditemukan, tetapi node tanpa sudo tidak masalah

120

Saya baru saja menginstal nodejs pada instance mikro EC2 baru.

Saya menginstalnya secara normal, ./configure -> make -> sudo make install.

Masalah: Ketika saya menjalankan "node" di ec2-user, itu berjalan dengan sempurna. Ketika saya menjalankan "sudo node", gagal.

Saya menemukan bahwa node ada di:

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

dan jalur saat ini

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

tapi, jalur sudo adalah

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

kemudian saya mencoba mengedit PATH root untuk menyertakan jalur ke node, jadi "node" berjalan saat saya login sebagai root - tetapi masih tidak berfungsi saat saya login sebagai ec2-user dan menjalankan "sudo node" .

Saya membutuhkan ini untuk menginstal npm properfly. Adakah ide tentang cara memasukkan jalur node saat menjalankan "sudo node"?

foobar.dll
sumber
Bagaimana Anda mengedit PATH root?
Dijeda sampai pemberitahuan lebih lanjut.
Setelah banyak mencoba, saya melakukan ini dan berhasil: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Jawaban:

320

Ya, ini agak mengganggu tetapi Anda dapat memperbaikinya dengan beberapa tautan:

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

Mungkin ada lebih banyak tetapi hanya itu yang telah saya temui sejauh ini. Kurangnya node-waf akan menyebabkan beberapa npmpenginstalan gagal dengan pesan kesalahan yang agak samar.

Michael Dillon
sumber
Saya hanya penasaran, apakah penautan ini harus dilakukan hanya di sistem Amazon AMI? Apakah sistem Amazon AMI memisahkan jalur root dari jalur pengguna?
pengguna482594
Kurangnya node-wafpenyebab npm rebuildkesalahan. Apakah ada cara yang bersih untuk mengatasinya? Apakah saya perlu?
pengguna730569
1
Ini tidak berhasil untuk saya karena beberapa alasan. 1) Saya tidak memiliki akses sudo. Saya di host bersama. 2) /usr/localtidak ada. Saya membuat direktori ~ / local. 3) Setelah menghapus /usrdan sudodari setiap baris kode ini dan menjalankannya melalui konsol saya, tidak ada yang berubah.
Wolfpack'08
1
Itu sangat membantu. Tapi adakah yang bisa menjelaskan mengapa dan bagaimana hal itu bekerja?
Tarun Gupta
2
@Tarun: baca variabel PATH shell dan bagaimana ia digunakan untuk menemukan biner mana yang akan dieksekusi untuk perintah yang diberikan. Perintah ln hanya menghubungkan nama kedua ke file yang sama.
Michael Dillon
33

Saya menambahkan /usr/local/binke secure_pathdalam/etc/sudoers

$ sudo visudo

Kemudian ubah baris ini:

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

Untuk:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Jack Frost
sumber
19

itu terjadi karena node yang dapat dieksekusi tidak ditemukan di / usr / bin. Jadi ikuti langkah-langkahnya:

  1. temukan node:

whereis node

dalam kasus saya: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. buat tautan simbolis untuk node:

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

Selesai!

Jeff Pal
sumber
tip bagus - Saya juga melakukan sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmapa yang saya coba lakukan sudo npm installpada contoh ec2 aws saya setelah mengikuti tautan
NULL pointer
9

Mengapa tidak menggunakan jalur absolut ke node? Jika Anda berencana untuk menggunakan skrip pemula, itu akan membutuhkan jalur absolut.

sudo /usr/local/bin/node server.js
Shripad Krishna
sumber
1
solusi terbaik, berfungsi dan tidak mengacaukan sistem seperti yang dilakukan semua lnsolusi.
SidOfc
5

coba yang berikut ini:

export PATH=$PATH:/usr/local/bin
sudo node --version
Amro
sumber
2
Tidak akan berfungsi untuk distribusi yang telah secure_pathdiatur dalam sudoersfile.
kenorb
5

Anda bisa meneruskan path lengkap ke nodeexecutable dari induk (non-sudo shell) menggunakan whichperintah.

sudo `which node`
Pavel Zubkou
sumber
4

Bagi saya, ini berfungsi hanya dengan mengubah kepemilikan folder node dari root menjadi ec2-user (masuk sebagai ec2-user).

(Catatan: Saya membuat folder node saya di / var / lib /)

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

Kemudian

npm install mongojs

seharusnya berfungsi dengan baik (asalkan Anda telah menginstal npm ok tentu saja!)

pengguna1839216
sumber
3

Berikut adalah pendekatan yang tidak menggunakan symlink, atau membutuhkan 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

Kemudian saya melakukan:

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

Manfaat tidak menjalankan node sebagai root dibahas di sini:

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

Ini sejalan dengan:

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

Jack Murphy
sumber
3

Bagaimana jika menggunakan "sudo $ (node ​​yang mana)" daripada "sudo node"?

Will Voelcker
sumber
Bekerja seperti pesona!
lordneru
1

Dalam kasus saya, Node dipasang tanpa prefiks sudo . Jadi node tidak tersedia untuk superuser itu sebabnya tidak berfungsisudo node server

shubham
sumber
-1

Saya tidak tahu apakah ini cara yang benar, tetapi inilah yang saya lakukan ...

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

Ini menginstal npm, dan sekarang saya dapat menginstal paket apa pun yang saya inginkan.

bdavis
sumber