Sudo sudo: nguồn: lệnh không tìm thấy


15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

Có vẻ như một shell khác bashđược chạy để thực thi source /etc/environmentvà shell đó không có sourcesẵn.

Nhưng shell mặc định của tôi và root là cả hai bash.

$ echo $SHELL
/bin/bash

Nếu sudoindeed sử dụng một vỏ khác, tại sao nó? Tôi thấy câu trả lời của slm , nhưng không hiểu trong trường hợp của tôi.


4
sourcelà một shell được tích hợp..bạn không thể sử dụng sudođể chạy shell được xây dựng như một lệnh bên ngoài ..
heemayl

Là vấn đề mà bạn không thể đọc tệp, hoặc bạn muốn môi trường được xác định trong tệp áp dụng cho các lệnh sudo tiếp theo?
Random832

@ Random832: muốn môi trường được xác định trong tệp áp dụng cho các lệnh sudo tiếp theo
Tim

Câu trả lời:


23

sourcelà một shell dựng sẵn, vì vậy nó không thể được thực thi nếu không có shell. Tuy nhiên, theo mặc định, sudokhông chạy shell. Từsudo

Mô hình quy trình

Khi sudo chạy một lệnh, nó gọi fork (2), thiết lập môi trường thực thi như được mô tả ở trên và gọi cuộc gọi hệ thống thực thi trong tiến trình con

Nếu bạn muốn thực thi shell một cách rõ ràng, hãy sử dụng -stùy chọn:

# sudo -s source /etc/environment

Mà vẫn vô dụng vì sau khi thoát vỏ, thay đổi môi trường bị mất.


7

Trong lĩnh vực giải quyết vấn đề thay vì trả lời câu hỏi , đây là cách rõ ràng nhất (với tôi) để lấy một tệp mà chỉ root mới có thể đọc được:

source <(sudo cat /etc/environment)

Điều này sử dụng thay thế quá trình . Nó nhận đầu ra của catlệnh và biến nó thành một tệp giả, mà bạn có thể chuyển đến source. nguồn sau đó chạy các lệnh trong shell hiện tại.

Lưu ý rằng trên hầu hết các hệ thống, /etc/environmentcó thể đọc được trên thế giới, vì vậy bạn phải có khả năng chạy nó:

source /etc/environment

1
cái này hoạt động, cái được chấp nhận không
Claudiu Creanga

2

sudomong đợi một lệnh nhưng bạn đang đưa ra một shell dựng sẵn để nó không thể tìm thấy lệnh. Nếu bạn viết type source, bạn có thể thấy đầu ra: source is a shell builtinvà đầu ra which sourcetrống.

Ví dụ sudo stracesẽ hoạt động và which stracesẽ cho đầu ra vì strace là một lệnh.

Chỉnh sửa: Ngoài ra, bạn có thể thấy sudo su;sudo source /etc/environmentcác tác phẩm độc đáo để vỏ khác nhau không được sử dụng.

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.