Đã thêm thư mục bin vào đường dẫn của tôi, không thể thực thi các lệnh trong đó bằng 'lệnh sudo'


7

Tôi đã tạo một binthư mục trong thư mục nhà của tôi, nơi tôi đặt tất cả các tập lệnh của mình. Sau đó, trong .bashrc của tôi, tôi đã thêm vào như sau:

export PATH=$PATH:/home/myusername/bin

Vì vậy, tôi có thể truy cập các tập tin tôi đặt ở đó từ bất cứ đâu. Nhưng một số kịch bản cần phải được thực thi như root. Vì vậy, tôi nghĩ rằng, tôi có thể symlink Tôi chỉ có thể làm:

sudo program_that_requires_root

Nhưng sau đó tôi nhận được một:

sudo: program_that_requires_root: command not found

Nếu tôi đăng nhập bằng root và thực thi chương trình, nó vẫn hoạt động tốt. Vì vậy, cách chính xác để thực hiện những gì tôi muốn là gì?


2
Tôi đoán: sudocó thể là sử dụng secure_paththay vì của bạn $PATH. Chạy sudo -Vdưới dạng root (ví dụ sudo sudo -V) và tìm kiếm các dòng có chứa PATH.
jw013

2
Có, ít nhất là trong Debian, mở tệp /etc/sudoersvà tìm dòng này: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin(đường dẫn có thể thay đổi) - nếu bạn thêm binđường dẫn người dùng của mình , nó sẽ hoạt động. (Có lẽ giải pháp đó không được khuyến khích vì những lý do khác; tôi không biết.) Ồ, trong tệp được đề cập, nó nói rằng bạn không nên thay đổi nó, nhưng tôi đã làm, và nó hoạt động rất tốt, ít nhất là về những gì tôi đã cố gắng để đạt được (có cùng một vấn đề như bạn).
Emanuel Berg

Câu trả lời:


4

Bạn phải chắc chắn rằng hai dòng này có trong tệp sudoers.

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$

Xem các URL này để biết thêm chi tiết:


1
Tôi đoán $ở cuối dòng (mã) thứ hai theo sau khi bạn sao chép - tất nhiên nó phải là một trích dẫn kết thúc. Ngoài ra, phải thêm đường dẫn mới đến các tệp nhị phân của người dùng (và các tệp thực thi khác, như các tập lệnh đã đề cập @Carlito). (Bạn có thể đã làm điều này; vừa bị băm nhỏ.)
Emanuel Berg

Cảm ơn, tôi đã xem trong tập tin sudoers và thêm đường dẫn của tôi vào dòng thứ hai, hoạt động rất tốt!
Carlito

1

sudoĐặt lại PATHbiến môi trường thành mặc định tích hợp hoặc do quản trị viên cung cấp, trong hầu hết các cấu hình. Vì vậy, bạn sẽ không thể chỉ gõ sudo myscript.

Bạn có thể viết một hàm bao bọc:

sudo () {
  local cmd
  case $1 in
    -*) :;; # there are options, change nothing
    */*) :;; # explicit path, change nothing
    *) # a command name, look it up in our $PATH
      cmd=$(type -p -- "$1")
      if [[ -n $cmd ]]; then shift; set -- "$c" "$@"; fi;;
  esac
  command sudo "$@"
}

(Đây là cho bash; thay đổi type -Pthành type -pksh hoặc zsh.)


Hừm, mặc dù tôi không nghi ngờ điều này, nhưng nó có vẻ hơi phức tạp - liệu thực tế có một số lợi ích tiềm ẩn, so với chỉnh sửa /etc/sudoers, có vẻ là một giải pháp đơn giản hơn nhiều?
Emanuel Berg

1
@EmanuelBerg Nếu đây là máy tính của bạn, bạn có thể chỉnh sửa sudoerstệp và thay đổi secure_path. Nếu đây là máy dùng chung, quản trị viên khó có thể sẵn sàng cung cấp cho bạn: secure_pathcài đặt do người dùng chọn hoặc biên dịch lại sudo mà không có tùy chọn đó, sẽ là vấn đề đau đầu về bảo trì.
Gilles 'SO- ngừng trở nên xấu xa'

0

Theo mặc định sudo đặt lại môi trường. Bạn đã thử thêm đường dẫn đến .bashrc của root chưa? Hoặc gọi sudo với -E (chỉ hoạt động nếu setenv trong sudoers được đặt hoặc lệnh tương ứng có bộ thẻ SETENV).


2
Thay đổi root .bashrcsẽ không giúp đỡ: sudokhông bắt đầu một ví dụ tương tác của bash ở đây.
Gilles 'SO- ngừng trở nên xấu xa'
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.