Câu trả lời:
Như một cách để thuyết phục bản thân rằng sudo
chỉ 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.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Sau đó, khi bạn sử dụng cat
các tệp đó, bạn sẽ thấy các tên người dùng sau:
$ cat file{1..3}
root
saml
saml
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 cat
cá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
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 foo1
sẽ được đưa đến sudo foo2
. Sử dụng các whoami
ví 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.
Đâ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!
$ 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 sudo
bắt đầu.
$ 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 tee
chươ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 sudo
gọi tee
lệnh.
# 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 -s
tắc, sudo
sẽ 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 -s
tắ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/passwd
tệ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.