sudo với mật khẩu trong một dòng lệnh?


115

Vào những ngày bận rộn, tôi muốn chạy

$ ./configure && make && sudo make install && halt

vào ban đêm và đi ngủ, hy vọng ứng dụng sẽ tự động được cài đặt. Nhưng những gì tôi thấy vào ngày hôm sau là màn hình nơi sudo hỏi tôi mật khẩu. Vậy làm thế nào tôi có thể chạy sudo với mật khẩu trong một dòng lệnh, hoặc có phương pháp nào khác để làm điều này không?


Bạn cần haltchạy như root.
Keith Thompson

1
Không sudocó thời gian chờ 15 phút? Bạn không thể chạy, nói, sudo lshoặc một cái gì đó tương tự, nhập mật khẩu của bạn, và sau đó chạy lệnh trên, có sudođặc quyền vẫn hoạt động? (Tôi không thể kiểm tra điều này vào lúc này, nếu không tôi sẽ đăng bài này dưới dạng câu trả lời.)
Matt

1
Thời gian chờ trên sudolà cấu hình. Những người có ý thức bảo mật (hay còn gọi là hoang tưởng, như tôi) đã đặt nó về 0 ... :-)
dda

Câu trả lời:


173

Có, sử dụng công -Stắc đọc mật khẩu từ STDIN:

$echo <password> | sudo -S <command>

Vì vậy, đối với trường hợp của bạn, nó sẽ trông như thế này:

$./configure && make && echo <password> | sudo -S make install && halt

Tất nhiên, thay thế <password>bằng mật khẩu của bạn.


42
Rõ ràng, người ta sẽ không muốn chạy nó nếu có bất kỳ nguy hiểm nào về việc người khác nhìn thấy mật khẩu trong lịch sử shell.
Brett Daniel

tìm kiếm các cách nhanh chóng để chạy các lệnh đặc quyền trên một máy chủ từ xa và điều này hoạt động được.
nelaaro

13
Nếu bạn quyết định sử dụng 'echo <password> | Tùy chọn sudo -S ', ​​để tránh lộ mật khẩu trên lịch sử lệnh, hãy khởi động lệnh bằng ký tự SPACE. Tất nhiên, tùy chọn tốt nhất là lấy mật khẩu từ một tệp bảo mật.
Shannon Haworth

Bạn có thể muốn sử dụng nó nếu bạn có mật khẩu trong $ VARIABLE (ví dụ: bạn có thể có điều khoản với
sops

9 năm sau và vẫn hoạt động như một cơ duyên :)
WinEunuuchs2Unix

10

Bạn có thể thay thế dòng lệnh của bạn bằng điều này:

$sudo su

$./configure && make && make install && halt

Bạn sẽ được nhắc nhập mật khẩu ngay lập tức, sau đó các lệnh còn lại sẽ chạy dưới dạng superuser.


8
một phiên bản thay thế (và có thể được ưa thích) của điều này:sudo sh -c "./configure && make && make install && halt"
quack quixote

2
Nhưng sau đó, tất cả các tệp biên dịch được tạo có quyền siêu người dùng không? Điều này sẽ ngăn bạn chạy ./mình && thực hiện như một người dùng thông thường sau này.
dùng45909

Vâng, user45909, bạn hoàn toàn đúng. Cá nhân tôi chưa bao giờ chạy lại ./mình && thực hiện ngoại trừ sau khi tải xuống bản cập nhật của gói chính, nhưng tôi có thể không phải là điển hình.
CarlF

10

Một số giải pháp khác có nhược điểm là chúng không cần thiết chạy ./configuremakelà root.

Đây là một chút phức tạp, nhưng nó sẽ hoạt động:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Lưu ý việc sử dụng dấu ngoặc kép để cho phép $USERmở rộng bằng trình bao (không phải root).

Tôi cũng có thể thêm một sleep 60trước haltlệnh. Đôi khi tôi đã làm những việc như thế này, hy vọng lệnh sẽ chạy trong một thời gian dài, nhưng có gì đó không ổn và nó chấm dứt ngay lập tức; các sleepphép tôi giết lệnh trước khi hệ thống tắt. Hoặc bạn có thể sử dụng shutdownvới một đối số thời gian.


9

Bạn cũng có thể định cấu hình sudo với visudođể cho phép người dùng sử dụng make như sudo mà không cần mật khẩu.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

Đặt HISTIGNORE thành " sudo -S "

$ export HISTIGNORE='*sudo -S*'

Sau đó chuyển mật khẩu của bạn một cách an toàn để sudo:

$ echo "your_password" | sudo -S -k <command>

"HISTIGNORE" có nghĩa là không lưu lệnh này vào lịch sử. Đó là lịch sử trong bộ nhớ hoặc tệp "~ / .bash_history".

Ví dụ, bên dưới sẽ chuyển mật khẩu của bạn sang lệnh sudo một cách an toàn mà không giữ lại lịch sử mật khẩu của bạn.

Cấm -Siên, có nghĩa là sử dụng stdin cho mật khẩu,

Có nghĩa là bỏ qua các thông tin được lưu trong bộ nhớ cache để buộc sudo luôn luôn hỏi. Điều này là cho hành vi nhất quán.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

Nhược điểm của phương pháp trên là nếu bạn muốn xem các lệnh bạn đã chạy trong lịch sử sau này thì chúng sẽ không ở đó. Một phương pháp khác là cập nhật bộ đệm xác thực sudo xác thực (mặc định được bật với thời gian chờ 5 phút), sau đó chạy sudo riêng. Nhưng nhược điểm của điều này là bạn sẽ cần lưu ý đến bộ đệm 5 phút.

Ví dụ:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Lưu ý Tôi đã chạy sudo trước mỗi lệnh để đảm bảo rằng bộ đệm sudo được cập nhật, vì mặc định là 5 mintues. Vâng, whoami không nên mất 5 phút, nhưng tôi có thể chạy nó trước mỗi lệnh để thống nhất. Bạn cũng có thể đặt "export HISTIGNORE = ' sudo -S'"trong tệp ~ / .bashrc của bạn, sau đó tải nó bằng". ~ / .bashrc "hoặc đăng xuất rồi đăng nhập. Tuy nhiên, tôi đang nghĩ sử dụng điều này cho mục đích kịch bản, vì vậy tôi sẽ giữ nó ở đầu tất cả các tập lệnh của mình để thực hành bảo mật tốt nhất. Đặt" echo "" | sudo -S -v "với một biến thay vào đó cũng có thể là một ý tưởng hay, sau đó chỉ cần chạy biến trước mỗi lệnh cần đặc quyền gốc, xem bình luận của Janar." Nhận xét của John T "cũng nên bao gồm tham số" -k " , như thể bạn chạy "sudo -S" mà không có "-k" và bộ đệm xác thực sudo đã có thông tin đăng nhập của bạn (và vẫn hợp lệ, bộ đệm xác thực sudo mặc định là 5 phút), sau đó bash sẽ chạy mật khẩu của bạn dưới dạng lệnh, đó là xấu.


1
Cũng giống như một lưu ý nhỏ về việc làm cho mọi thứ không có sẵn trong lịch sử, hãy chạy lệnh của bạn với một khoảng trống ở phía trước của nó. Vì một số lý do, điều này khiến lịch sử bỏ qua nó.
Matt Fletcher

4

Lưu ý, tôi đã thấy rằng phương thức này không hoạt động trên phiên bản cũ hơn của sudo, cụ thể là "Phiên bản Sudo 1.6.7p5":

$ echo "<your_password>" | sudo -S -k whoami

Trường hợp như phương pháp này không hoạt động trên các phiên bản cũ và mới sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

Đây không phải là một câu trả lời cho câu hỏi ban đầu. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
DavidPostill

@Darren DeHaven: Bạn có thể giải thích làm thế nào điều này trở thành câu trả lời cho câu hỏi được hỏi ở đây không?
Renju Chandran chingath

4

Bạn cũng có thể làm nó như vậy:

sudo -S <<< "password" command

chỉ cái này hoạt động với tôi trong mac os.
Mehdico

2

Nếu bạn muốn cẩn thận hơn, bạn có thể tạo một tập lệnh, thay đổi quyền của tệp để chỉ root mới có thể đọc và chỉnh sửa và sau đó chỉ cần chạy nó.

Ví dụ:
1) Tạo một tệp:

gedit ~/.easy.install  

2) Dán cái này và lưu lại:

./configure && make && echo <password> | sudo -S make install && halt  

3) Làm cho nó thực thi:

sudo chmod +x ~/.easy.install  

4) Thay đổi quyền của tệp để chỉ root mới có thể đọc và chỉnh sửa tệp:

sudo chmod 700 ~/.easy.install  

5) Chạy:

~/.easy.install  

Thưởng thức ;-)


echo <password> vẫn sẽ hiển thị trong danh sách quy trình và nếu ai đó gặp may mắn với ps aux vào đúng thời điểm, họ có thể thấy mật khẩu ở dạng văn bản rõ ràng. Tốt hơn là lưu mật khẩu vào một tệp và sử dụng <để chuyển hướng từ tệp vào sudo.
bobpaul

1

Thiết lập sudo như thế là nguy hiểm nếu ai đó tình cờ thấy thực tế là sudo không yêu cầu mật khẩu trên tài khoản của bạn. Trừ khi bạn biết những gì bạn đang làm, không làm điều đó. Tôi đã có nó xảy ra tại chương trình đào tạo A + tại địa phương với máy tính thử nghiệm của tôi quá nhiều lần ... -_-

Mặc dù những gì John T. nói nghe có vẻ tốt, ngoại trừ vẫn có nguy cơ tìm thấy mật khẩu trong lịch sử shell. Những gì CarlF nói nghe có vẻ tốt hơn, nhưng nếu một lệnh thất bại, máy tính vẫn sẽ chạy với các đặc quyền siêu người dùng.


0

Cá nhân tôi làm khá giống như John T đã trả lời vào ngày 9 tháng 11 lúc 10:47, tôi cũng đã cải thiện tôi theo hướng dẫn của câu trả lời của anh ấy, cảm ơn.

Sự khác biệt là tôi có xu hướng sử dụng các biến, đại loại như:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

Theo cách đó tôi có thể dễ dàng sử dụng biến của tôi thay vì sudo,

$AutoSuDo apt-get update;

Điều đó đến khá tiện dụng với một số kịch bản dài hơn. Tôi chủ yếu sử dụng những thứ này cho máy tính cá nhân của người khác, mà tôi phải duy trì.

Tôi cũng khuyên bạn nên chú ý về:

  • câu trả lời của desgua vào ngày 19 tháng 4 năm 11 lúc 23:30
  • user224306 bình luận vào ngày 14 tháng 5 năm 13 lúc 17:38 cho câu trả lời của John T vào ngày 9 tháng 11 'lúc 2:47

0

Vấn đề được giải quyết. Ví dụ: để người dùng root:

echo -e 'password\npassword\n' | sudo passwd root

Cờ -e làm gì, @jerson Martinez?
dùng674669

1
Cờ -e cho tiếng vang cho phép nó diễn giải các chuỗi nhất định là có ý nghĩa đặc biệt.
Jerson Martínez
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.