Trên EC2: không tìm thấy lệnh nút sudo, nhưng nút không có sudo thì không sao


120

Tôi vừa cài đặt nodejs trên một phiên bản vi mô EC2 mới.

Tôi đã cài đặt nó bình thường, ./configure -> make -> sudo make install.

Vấn đề: Khi tôi chạy "nút" dưới ec2-user, nó chạy hoàn hảo. Khi tôi chạy "nút sudo", nó không thành công.

Tôi phát hiện ra rằng nút nằm trong:

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

và con đường hiện tại là

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

nhưng, con đường sudo là

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

sau đó tôi đã cố gắng chỉnh sửa PATH gốc để bao gồm các đường dẫn đến nút, vì vậy "nút" chạy khi tôi đăng nhập với tư cách là người chủ - nhưng nó vẫn không hoạt động khi tôi đăng nhập với tư cách người dùng ec2 và chạy "nút sudo" .

Tôi cần cái này để cài đặt npm rightfly. Bất kỳ ý tưởng nào về cách bao gồm đường dẫn nút trong khi chạy "nút sudo"?


Bạn đã chỉnh sửa PATH gốc như thế nào?
Tạm dừng cho đến khi có thông báo mới.

Sau nhiều lần thử, tôi đã làm được điều này và nó hoạt động: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Câu trả lời:


319

Có, nó hơi khó chịu nhưng bạn có thể khắc phục bằng một số liên kết:

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

Có thể có nhiều hơn nhưng đó là tất cả những gì tôi đã trải qua cho đến nay. Thiếu node-waf sẽ khiến một số npmcài đặt không thành công với một thông báo lỗi khá khó hiểu.


Tôi chỉ tò mò, liên kết này có phải chỉ được thực hiện trong hệ thống Amazon AMI không? Hệ thống Amazon AMI có tách đường dẫn gốc khỏi đường dẫn người dùng không?
user482594 22/02/12

Thiếu node-wafnguyên nhân npm rebuildđể xảy ra lỗi. Có một cách sạch sẽ để khắc phục điều này? Tôi có cần phải?
user730569

1
Điều này không hiệu quả với tôi vì một vài lý do. 1) Tôi không có quyền truy cập sudo. Tôi đang ở trên một máy chủ được chia sẻ. 2) /usr/localkhông tồn tại. Tuy nhiên, tôi đã tạo một thư mục ~ / local. 3) Sau khi loại bỏ /usrsudotừ mỗi một trong các dòng mã và chạy chúng thông qua giao diện điều khiển của tôi, không có gì đã thay đổi.
Wolfpack'08

1
Điều đó thật hữu ích. Nhưng có ai có thể giải thích lý do tại sao và cách nó làm cho mọi thứ hoạt động không?
Tarun Gupta

2
@Tarun: đọc biến PATH của shell và cách nó được sử dụng để tìm nhị phân nào sẽ thực thi cho bất kỳ lệnh nào. Lệnh ln chỉ liên kết tên thứ hai với cùng một tệp.
Michael Dillon

33

Tôi đã thêm /usr/local/binvào secure_pathtrong/etc/sudoers

$ sudo visudo

Sau đó, thay đổi dòng này:

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

Đến:

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

19

nó xảy ra vì không tìm thấy nút thực thi trong / usr / bin. Vì vậy, hãy làm theo các bước:

  1. tìm nút:

whereis node

trong trường hợp của tôi: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. tạo một liên kết tượng trưng cho nút:

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

Xong rôi!


mẹo tuyệt vời - Tôi cũng đã làm sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmnhư tôi đã cố gắng để làm sudo npm installtrên AWS tôi EC2 dụ sau khi làm theo liên kết
con trỏ NULL

9

Tại sao không sử dụng đường dẫn tuyệt đối đến nút? Nếu bạn định sử dụng một kịch bản mới nổi, bạn sẽ cần một đường dẫn tuyệt đối.

sudo /usr/local/bin/node server.js

1
giải pháp tốt nhất, hoạt động và không gây rối với hệ thống như tất cả các lngiải pháp khác.
SidOfc

5

hãy thử những điều sau:

export PATH=$PATH:/usr/local/bin
sudo node --version

2
Sẽ không hoạt động đối với các bản phân phối đã secure_pathđược thiết lập trong sudoerstệp.
kenorb

5

Bạn có thể chuyển đường dẫn đầy đủ đến nodetệp thực thi từ cha mẹ (không phải của trình bao sudo) bằng whichlệnh.

sudo `which node`

4

Đối với tôi, nó hoạt động để chỉ thay đổi quyền sở hữu của thư mục nút từ gốc thành ec2-user (đăng nhập với tư cách là ec2-user).

(Lưu ý: Tôi đã tạo thư mục nút của mình trong / var / lib /)

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

Sau đó

npm install mongojs

sẽ hoạt động tốt (tất nhiên với điều kiện bạn đã cài đặt npm ok!)


3

Đây là một cách tiếp cận không sử dụng liên kết tượng trưng hoặc yêu cầu 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

Sau đó, tôi đã làm:

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

Các lợi ích của việc không chạy nút với tư cách gốc được thảo luận ở đây:

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

Nội tuyến của nó với:

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



1

Trong trường hợp của tôi, Node đã được cài đặt mà không có tiền tố sudo . Vì vậy, nút không khả dụng cho superuser, lý do tại sao nó không hoạt độngsudo node server


-1

Tôi không biết đây có phải là cách đúng không, nhưng đây là những gì tôi đã làm ...

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 đã cài đặt này và bây giờ tôi có thể cài đặt bất kỳ gói nào tôi muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.