Khi sử dụng && và sudo trên lệnh đầu tiên, lệnh thứ hai có chạy như sudo không?


64

Nếu tôi chạy một lệnh.

sudo some-command && some-other-command

Là lệnh thứ hai đang được chạy với ưu tiên sudocũng?

Câu trả lời:


110

TL; DR: KHÔNG


Lệnh đầu tiên là

sudo some-command

Lệnh thứ hai là

some-other-command

Lệnh sudonhận lệnh sau và thực thi nó với các đặc quyền nâng cao. Các &&Tuy nhiên, không thuộc về một lệnh và được giải thích bằng vỏ, trước khi thực hiện lệnh đầu tiên. Nó báo bash để thực hiện lệnh đầu tiên và thành công lệnh thứ hai.

Vì vậy, sudokhông biết về && some-other command. Khi quá trình nâng cao kết thúc, bash lấy giá trị trả về của nó và sau đó thực thi lệnh khác, một lần nữa không biết đến lệnh đầu tiên.

Điều này có thể được chứng minh dễ dàng:

$ sudo whoami && whoami
root
username

Để đạt được những gì bạn muốn, bạn có thể bắt đầu bash nâng cao và để nó thực thi cả hai lệnh:

$ sudo bash -c 'whoami && whoami'
root
root

Vì vậy, bây giờ, cả hai lệnh được thực thi với quyền root, vì toàn bộ quá trình được mô tả ở trên được thực thi trong một quy trình nâng cao, tức là phiên bash bắt đầu với lệnh này, ngay lập tức thoát ra sau khi kết thúc. Tuy nhiên, cả hai whoamikhông biết đến sự tồn tại của nhau.

Điều này không phù hợp với bất kỳ mục đích nào nhưng đối với cuộc biểu tình này, cách đơn giản hơn là làm

sudo some-command && sudo some-other-command

29
+1 cho whoamiví dụ.
Carl H


Cuộc biểu tình này thực sự tuyệt vời! Phải nghĩ về điều đó khi cố gắng dạy sudo cho người khác vào lần tới!
Phân mảnh cần thiết

20

Không. Một số ví dụ thực hiện điều này là:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

hoặc nếu bạn muốn các lệnh lồng, bạn thậm chí có thể làm:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Cái thứ 2 sử dụng vỏ khác.
  • Lưu ý rằng khi bạn sử dụng 'hoặc "trong phiên bản thứ 2, bạn cần phải thoát những lệnh đó trong các lệnh hoặc tham số của lệnh đó (ví dụ: \' hoặc \") để có thể trở nên phức tạp rất nhanh.

Phương pháp thứ ba không hoạt động: $ sudo -s -- whoami && whoamichoroot username
BartekChom

@BartekChom xin lỗi tôi đã bỏ lỡ các trích dẫn trên đó
Rinzwind

sudo -s -- "whoami && whoami"dường như đưa ra lệnh không được tìm thấy, ít nhiều giống như lệnh "whoami && whoami". Làm cách nào để sử dụng cấu trúc này với &&? Tôi thấy rằng sudo -s cd ..không có lỗi như trái ngược với sudo cd ...
BartekChom

Tôi đã học được một điều mới ngày hôm nay : sudo bash <<"EOF"! Cảm ơn! :-)
Fabby

4

Không, hoặc bạn phải viết sudo hai lần, hoặc làm một cái gì đó như

sudo bash -c 'foo && bar'

2

&&có nghĩa là lệnh bên phải (thứ hai) sẽ chỉ chạy nếu lệnh lest side (thứ nhất) thành công tức là mã thoát $?0.

Hai lệnh khác nhau và sẽ chạy trong môi trường riêng của chúng, vì vậy lệnh thứ hai sẽ không chạy có sudođặc quyền.

Điều này sẽ làm cho bạn rõ ràng:

$ sudo whoami && whoami 
root
foobar

1

KHÔNG, và những điều sau đây đã từng rất phổ biến.

sudo reboot && exit

Mọi người nên làm điều này ít nhất một lần

sudo apt-get update && sudo apt-get upgrade

Vì vậy, nó là một câu hỏi phỏng vấn "chuột mickey" tuyệt vời.

Điều này dễ dàng được kiểm tra đến mức câu hỏi có thể bị nghi ngờ đối với bài tập đệm stat.


0

Trên dòng lệnh, khi bạn thấy

$ command one && command two

mục đích thông thường là thực thi lệnh theo sau && chỉ khi lệnh đầu tiên thành công.

Là lệnh khác chạy như sudo cũng?

hoàn toàn không, đây chỉ là việc viết hai lệnh liên tiếp, điều này && không cung cấp thêm đặc quyền nào cho lệnh. Nó chỉ là một người ngăn cách .

Để chứng minh rằng chúng ta hãy lấy một ví dụ.

touch fileA fileB 

Tôi đã tạo hai tệp fileA và fileB. Bây giờ tôi sẽ chạy lệnh

sudo chown test:test fileA && chown test:test fileB

Tôi đang thay đổi người dùng và chủ sở hữu nhóm của các tệp này thành kiểm tra tên người dùng và nhóm. Bây giờ lệnh đầu tiên sẽ chạy trong khi còn lệnh kia thì sao?

Đầu ra là:

chown: changing ownership of `fileB': Operation not permitted

Vì vậy, lệnh không chạy vì nó cần sudovà mặc dù chúng ta có thể kết luận rằng && không phải là lệnh thay thế thứ haisudo

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.