sudo: source: lệnh không tìm thấy


54

Tôi đã cập nhật một số cấu hình mặc định cho bash và thấy từ các hướng dẫn tôi đang theo dõi rằng tôi có thể tải lại hồ sơ mới với các cài đặt môi trường mới bằng cách sử dụng:

source /etc/bash.bashrc

Điều duy nhất là - các biến môi trường mới chỉ có sẵn cho người dùng hiện tại của tôi - và bị bỏ qua khi tôi sử dụng sudo. Chúng chỉ có sẵn để sudo khi tôi đóng phiên cuối và tham gia lại.

Khi tôi cố gắng sử dụng:

sudo source /etc/bash.bashrc

Tôi nhận được lỗi:

sudo: source: command not found

Có cách nào đơn giản để tải trong cài đặt cấu hình bash mới cho sudo mà không phải đóng thiết bị đầu cuối và khởi động lại không?

- Ban đầu, tôi đang sử dụng một số tập lệnh cài đặt tham chiếu các biến. Tôi thấy rằng trong khi họ có thể truy cập các biến khi tôi gọi trực tiếp các tập lệnh (mặc dù vậy, điều này sẽ gây ra vấn đề về sau với việc tạo thư mục khi tôi cần root), gọi các tập lệnh cài đặt bằng sudo sẽ không.

Tôi đã chứng minh điều này bằng cách thử nghiệm với các lệnh đơn giản sau:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

Cái đầu tiên sẽ xuất giá trị của biến, nhưng cái thứ hai sẽ không tạo ra bất cứ thứ gì.


Làm thế nào bạn cố gắng sử dụng các biến từ sudo? Xin lưu ý rằng nếu bạn sử dụng "sudo lệnh $ biến" thì nó sẽ thay thế biến từ shell của bạn chứ không phải từ môi trường của sudo.
João Pinto

Câu trả lời:


72

Vấn đề là đó sourcelà một lệnh tích hợp bash (không phải là chương trình - như lshoặc grep). Tôi nghĩ một cách tiếp cận là đăng nhập bằng root và sau đó thực thi lệnh nguồn.

sudo -s
source /etc/bash.bashrc

3
Bạn nói đúng rằng vấn đề là sourcevỏ được tích hợp sẵn. sudo sulà một cách nói kỳ lạ - tốt hơn là chỉ nói sudo -stheo cách riêng của sudo "bắt đầu một cái vỏ như người dùng này." Phiên bản một dòng của bạn sẽ không hoạt động vì mỗi lệnh trong đó được chạy bởi trình bao chính của người dùng trong một quy trình con riêng biệt.
poolie

1
Đúng. Cộng với BASH đọc / etc / bashrc tại thời điểm đăng nhập. Vì vậy, bạn cũng có thể sử dụng 'su' với chuyển đổi -, -l hoặc --login để có được môi trường của người dùng đó: 'sudo su -' để trở thành root hoặc 'su - $ username' để trở thành người dùng khác.

Ví dụ "một dòng" sẽ không hoạt động vì subắt đầu một shell mới và "nguồn" chỉ được chạy sau khi nó kết thúc. Ví dụ đầu tiên chỉ hoạt động nếu dòng thứ hai được sử dụng bên trong vỏ gốc.
loevborg

sudo -slà không tốt hơn so với sudo su. Nó sẽ không có bất kỳ ảnh hưởng nào.
loevborg

1
sudo -scó tác dụng tương tự khi bắt đầu một shell, nhưng đối với tôi, dường như không phù hợp để xếp chồng hai lệnh "trở thành người dùng khác" khi thực hiện.
poolie

14

Vấn đề không phải sourcelà lệnh dựng sẵn shell. Thực tế đó là những gì thực sự command not foundgây ra lỗi cho bạn , nhưng điều đó không có nghĩa là nó sẽ hoạt động nếu có.

Vấn đề thực tế là làm thế nào các biến môi trường làm việc. Và chúng hoạt động như thế này: mỗi khi một quy trình mới được bắt đầu, nếu không có gì xảy ra, nó sẽ thừa hưởng môi trường của cha mẹ nó. Do đó, bằng cách sử dụng một lớp con (ví dụ: nhập bashvào một cá thể bash) và xem kết quả đầu ra envsẽ cho kết quả tương tự như cha mẹ của nó.

Tuy nhiên, do cách thức sudohoạt động (như đã nêu trong trang chủ của nó), sudo cố gắng tước môi trường của người dùng và tạo môi trường "mặc định" cho người dùng thay thế, để lệnh chạy được chạy như thể người dùng đã gọi nó là người dùng gọi (đó là hành vi dự kiến), và do đó chạy nautilus như sudo nautilussẽ mở một thư mục tại /rootthư mục, và không /home/yourusername.

Vì thế:

Làm một cái gì đó như sudo source script.shvà sau đó sudo command, ngay cả khi nó hoạt động, nó sẽ không thành công trong việc đặt bất kỳ biến nào cho sau này sudo command.

Để truyền các biến môi trường, bạn có thể yêu cầu sudo bảo vệ môi trường (thông qua công -Etắc; và có quyền thích hợp trong tệp sudoers của bạn) và / hoặc đặt nó cho lệnh như sudo VAR1=VALUE1 VAR2=VALUE2 command.


4

Sử dụng thay thế quá trình bash bạn có thể làm:

source <(sudo cat /etc/bash.bashrc)

1
Làm thế nào điều này sẽ giúp bắt đầu một vỏ gốc với các cài đặt mới, đó là những gì OP đang muốn làm?
muru

1
OP thực sự đã hỏi làm thế nào để "... tải lại hồ sơ mới ..." từ một vỏ cần sử dụng sudođể truy cập hồ sơ. Ở trên cung cấp một phương tiện để nhập hồ sơ trong khi tránh các sudo: source: command not foundvấn đề được đề cập.
TomDotTom

"Điều duy nhất là - các biến môi trường mới chỉ có sẵn cho người dùng hiện tại của tôi - và đã bị bỏ qua khi tôi sử dụng sudo."
muru

3

Như Marcos nói , vấn đề chính của bạn ở đây là sourcelệnh dựng sẵn shell chỉ ảnh hưởng đến quá trình shell mà nó chạy.

Giải pháp đơn giản là chỉ cần khởi động một shell mới với quyền root và bash sẽ tự động đọc /etc/bash.bashrckhi nó khởi động. Điều đó đơn giản như chỉ nói

sudo bash

2

Đóng và mở lại thiết bị đầu cuối không nên thay đổi mọi thứ. Theo mặc định, sudo dải môi trường. Để vô hiệu hóa điều đó, thêm -E vào sudo.


2

Lỗi xảy ra do nhị phân mà bạn đang cố gắng gọi từ dòng lệnh chỉ là một phần của biến PATH của người dùng hiện tại, nhưng không phải là một phần của PATH của người dùng gốc.

Bạn có thể xác minh điều này bằng cách định vị đường dẫn của nhị phân bạn đang cố truy cập. Trong trường hợp của tôi, tôi đã cố gắng gọi "bettercap-ng". Vì vậy, tôi đã chạy,

$ which bettercap-ng
/home/user/work/bin/bettercap`

Tôi đã kiểm tra xem vị trí này có phải là một phần của PATH người dùng gốc của tôi không.

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Vì vậy, sudo không thể tìm thấy nhị phân mà tôi đang cố gắng gọi từ dòng lệnh. Do đó trả về lệnh lỗi không tìm thấy.

Bạn có thể trực tiếp sudo để sử dụng PATH của người dùng hiện tại khi gọi một nhị phân như bên dưới.

sudo -E env "PATH=$PATH" [command] [arguments]

Trong thực tế, người ta có thể tạo ra một bí danh từ nó:

alias mysudo='sudo -E env "PATH=$PATH"'

Cũng có thể đặt tên bí danh là sudo, thay thế sudo gốc.

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.