Làm cách nào để chạy lệnh sudo cần nhập mật khẩu trong nền?


29

Gần đây tôi đã vô hiệu hóa sudokhả năng lưu trữ xác thực để nó luôn nhắc tôi nhập mật khẩu mỗi lần.

Và mặc dù điều này tốt cho bảo mật, nhưng nó đã gây ra một vấn đề nhỏ mà tôi chưa thể tìm ra giải pháp cho, tôi không thể chạy các lệnh đi theo dòng:

sudo <command> &

Trước đây tôi đã chạy một sudolệnh trước đó, nó sẽ lưu mật khẩu của tôi và cho phép tôi chạy sudocác lệnh mà không cần nhắc trong vài phút tiếp theo, và do đó nó sẽ cho phép tôi chạy lệnh.
Nhưng khi tôi chạy nó ngay bây giờ vì không có bộ nhớ đệm trước khi nó bắt đầu một luồng mới ngay lập tức và sudothậm chí không nhắc tôi nhập mật khẩu, tôi không thể chạy nó theo cách này.

Vì vậy, trừ khi tôi chạy sudo -itrước nó, tôi không thể chạy một lệnh ở định dạng này đang trở nên khá khó chịu.
Vì vậy, tôi đã tự hỏi nếu có bất kỳ cách nào để khắc phục điều này và vẫn chạy các chương trình và lệnh theo cách này?

Tôi đang chạy Ubuntu Gnome 15.10 với Gnome 3.18, và cụ thể chương trình tôi muốn chạy theo kiểu này là etherapenếu điều đó khác biệt, nhưng tôi thực sự muốn giải pháp hoạt động cho tất cả các chương trình và lệnh.


3
@kossince &không thực sự tìm kiếm được, tôi đang thay đổi nó thành … sudo command in the background.
muru

@muru Nếu bạn có thể làm cho các công cụ tìm kiếm phổ biến tìm kiếm các ký tự đặc biệt thay thế. : P
kos

Câu trả lời:


56

Thay vì chạy sudotrong nền, hãy bảo sudochạy lệnh trong nền. Từ man sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

Ví dụ:

sudo -b sleep 10

Một cách khác là chỉ sử dụng shell để chạy lệnh:

sudo sh -c 'sleep 10 &'

Một tùy chọn khác sẽ chỉ định một chương trình đồ họa để lấy mật khẩu và gửi sudođến nền nào:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Các chương trình Askpass thường được sử dụng cho SSH. Một gói như vậy được cung cấp bởi ssh-askpass-gnomegói, được cài đặt theo mặc định, ít nhất là trên Ubuntu 15.10.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

Nếu bạn sẵn sàng đặt timestamp_timeoutít nhất một cái gì đó như 0.02(1,2 giây, tôi sẽ nói là an toàn như 0) trong /etc/sudoers(cần thiết trong trường hợp của bạn, nhưng với cài đặt mặc định hoặc timestamp_timeoutđược đặt thành bất cứ thứ gì ngoại trừ 0người ta có thể làm như sau) , bạn có thể đặt bí danh như thế này ~/.bashrc, điều này sẽ không yêu cầu bạn phải nhớ làm gì đó trước khi chạy lệnh và điều này sẽ cho phép bạn giữ quyền kiểm soát quy trình.:

alias sudo='sudo -v; [ $? ] && sudo'

Thủ thuật ở đây là dấu chấm phẩy, sẽ khiến Bash phân tích cú pháp sudo -vtrước và riêng biệt, xác thực người dùng và giới hạn phần nền tiềm năng cho [ $? ] && sudolệnh, sẽ kiểm tra xem có thành công sudo -vhay không và chạy sudolại (có khả năng làm nền) trong trường hợp đó.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

sudo -vmở rộng bộ nhớ đệm thông tin ngay cả khi bộ nhớ đệm bị vô hiệu hóa? Và, IIRC <để bí danh mở rộng, khoảng trắng phải ở cuối lệnh, không phải ở đầu.
muru

@muru RIght Tôi quên anh ấy đã timestamp_timeoutđặt 0. Và vâng, tôi hoàn toàn nhầm lẫn với điều mở rộng bí danh, thực ra bí danh không nên mở rộng. Cảm ơn.
kos

Sẽ không alias sudo='sudo -v && sudo'tốt như vậy?
G-Man nói 'Tái lập Monica'

@ G-Man Không, điều này hoạt động vì ;làm cho Bash phân tích cú pháp sudo -vđầu tiên và riêng biệt; sử dụng &&Bash sẽ phân tích cả hai như một lệnh đơn và nền tảng ngay lập tức.
kos

8

Bạn không thể. Việc &gửi lệnh đến nền ngay lập tức. Đó là, một lớp con được tạo trong nền và lệnh được thực thi ở đó. Khi lệnh đó đưa ra một dấu nhắc, như trường hợp của sudo, dấu nhắc đó được hiển thị trong nền và bạn không bao giờ nhìn thấy nó.

Cách duy nhất là đưa lệnh trở lại nền trước, cung cấp mật khẩu và gửi lại cho nền. Ví dụ:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

Bây giờ, nhập mật khẩu của bạn, nhấn Entervà sau đó nhấn CtrlZđể gửi lại vào nền và bgbảo nó tiếp tục chạy.

Một cách tiếp cận đơn giản hơn là không bao giờ sử dụng &và thay vào đó, gửi công việc đến nền theo cách thủ công với CtrlZbgsau khi khởi chạy chúng.

Cuối cùng, bạn có thể muốn xem xét đặt thời gian chờ mật khẩu của sudo thành khoảng 1 hoặc 2 giây. Điều đó vẫn sẽ cung cấp cho bạn đủ bảo mật (trừ khi bạn đang cố gắng chống lại Flash) và cho phép bạn chạy các lệnh như mong đợi.


Flash đã ăn cắp bánh sô cô la của tôi vì vậy ... ; P

2
Trong thời đại của các lỗ hổng Adobe và phần mềm độc hại lây nhiễm phần sụn, cảnh giác với Flash được bảo hành.
Damian Yerrick


Bên cạnh đó, có thực sự có thể đặt thời gian chờ thành giây không? man sudoersnói timestamp_timeoutgiá trị của quy định chi tiết phút với một phần phân đoạn có thể (mà bằng cách này làm cho sudolôi ra nếu tôi cố gắng để xác định một, không chắc chắn lý do tại sao).
kos

2
@kos nghe có vẻ như vậy. 2.5hoạt động tốt ở đây (Arch, sudophiên bản 1.8.15).
terdon
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.