Nếu tôi gõ vào sudo Cảnh ở đầu một lớp lót, nó có áp dụng cho các lệnh còn lại không?


10

Nếu tôi gõ sudovào đầu một lớp lót trong bash, nó có áp dụng cho các lệnh còn lại không?

Nói cách khác, đây là:

sudo foo | foo2 | foo3

tương đương với điều này:

sudo foo | sudo foo2 | sudo foo3

Câu trả lời:


11

Như một cách để thuyết phục bản thân rằng sudochỉ chạy bằng lệnh đầu tiên đã cung cấp và mọi thứ khác sau khi đường ống đầu tiên được chạy dưới dạng ID người dùng ban đầu của bạn, bạn có thể sử dụng chuỗi lệnh vô dụng này để xem.

Ví dụ 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Sau đó, khi bạn sử dụng catcác tệp đó, bạn sẽ thấy các tên người dùng sau:

$ cat file{1..3}
root
saml
saml

Ví dụ # 2

Tuy nhiên nếu bạn chạy một subshell:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

Sau đó, khi bạn catcác tệp này, bạn sẽ thấy các tên người dùng sau:

$ cat file{4..6}
root
root
root

Ví dụ # 3

Nhận xét của bạn về sudo foo1 | sudo foo2 ...sẽ không bao giờ hoạt động, vì đầu ra từ sudo foo1sẽ được đưa đến sudo foo2. Sử dụng các whoamiví dụ của tôi, điều này cho thấy chuỗi lệnh đó không làm gì cả.

$ sudo whoami | sudo whoami | sudo whoami
root

Cái thứ nhất chạy, nhưng cái thứ 2 và thứ 3 không làm gì cả vì chúng không được trang bị đầu vào. Thay vào đó tôi nghĩ bạn có ý định viết một cái gì đó như thế này:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

Điều này tương đương với việc chạy nó 3 lần trên 3 dấu nhắc lệnh khác nhau. Hoặc này:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

Nhưng đừng bao giờ làm điều này cuối cùng. Nó thuộc về phần tiếp theo.

Những cách tối nghĩa để gọi sudo

Đây không phải là công việc tốt nhất của tôi nhưng là những cách khác mà bạn có thể thấy tôi thực hiện nhiều lệnh bằng cách sử dụng sudo. Tôi chỉ cho họ ở đây chỉ để dạy không để những người khác nhất thiết phải làm chúng!

Cách 1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

Làm thế nào nó hoạt động?

Chương trình echo bên trong dấu ngoặc kép đang chạy dưới dạng root, vì sudo, nhưng shell đang chuyển hướng đầu ra của echo sang tệp chỉ root vẫn chạy như bạn. Shell hiện tại của bạn thực hiện chuyển hướng trước khi sudobắt đầu.

Cách # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

Làm thế nào nó hoạt động?

Phương thức này chạy teechương trình dưới dạng root VÀ lấy đầu vào từ một chuỗi ở đây chạy trước khi sudogọi teelệnh.

Cách 3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

Làm thế nào nó hoạt động?

Chúng có thể trông khác nhau nhưng chúng thực sự đang làm điều tương tự. Khi sử dụng công -stắc, sudosẽ chạy một lệnh duy nhất. Tôi không bao giờ có thể tìm ra nếu có một cách để thoát khỏi nó. Không có gì như thế này sẽ làm việc.

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

Nhưng khi nhìn vào trang man, công -stắc nói rằng nó sẽ truyền một lệnh duy nhất đến trình bao được xác định trong mục nhập /etc/passwdtệp của người dùng . Vì vậy, chúng tôi sử dụng một mẹo ở dạng thứ hai, chủ yếu là chuyển shell, shell khác ( sh -c) trong đó chúng tôi "backdoor" chuỗi lệnh của chúng tôi để chạy.

Có nhiều hơn nhưng tôi sẽ dừng ở đây. Đây chỉ là để cho bạn thấy những gì bạn có thể làm nếu bạn hiểu mọi thứ, nhưng không nhất thiết chỉ nên xâu chuỗi lại với nhau bởi vì bạn có thể, bạn nên thử và giữ các mã pragma của mình ở mức logic hợp lý để những người khác có thể hiểu và hỗ trợ chúng trong tương lai.


6

Không, trong ví dụ của bạn chỉ foođược thực hiện bởi sudo. Nếu bạn muốn chạy tất cả các lệnh với các đặc quyền leo thang, bạn có thể sinh ra một trình bao:

sudo sh -c 'foo | foo2 | foo3'
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.