Các lệnh trong một kịch bản thực thi từng cái một, độc lập. Bản thân Script là cha mẹ của tất cả các lệnh trong tập lệnh, là một quy trình độc lập khác và lệnh su không và không thể thay đổi nó thành root: lệnh su tạo ra một quy trình mới với quyền root.
Sau khi lệnh su hoàn thành, tiến trình cha, vẫn chạy như cùng một người dùng, sẽ thực thi phần còn lại của tập lệnh.
Những gì bạn muốn làm là viết một kịch bản bao bọc. Các lệnh đặc quyền đi vào tập lệnh chính, ví dụ~/main.sh
#!/bin/sh
ls /root
Tập lệnh bao bọc gọi tập lệnh chính có quyền root, như thế này
#!/bin/sh
su -c ~/main.sh root
Để khởi chạy quá trình này, bạn chạy trình bao bọc, lần lượt khởi chạy tập lệnh chính sau khi chuyển người dùng sang người dùng root.
Kỹ thuật trình bao bọc này có thể được sử dụng để biến tập lệnh thành trình bao bọc xung quanh chính nó. Về cơ bản kiểm tra xem nó có chạy bằng root hay không, nếu không, hãy sử dụng "su" để tự khởi chạy lại.
$ 0 là một cách tiện dụng để tạo tập lệnh tham chiếu đến chính nó và lệnh whoami có thể cho chúng ta biết chúng ta là ai (chúng ta có phải là root không?)
Vì vậy, tập lệnh chính với trình bao bọc tích hợp trở thành
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Lưu ý việc sử dụng exec. Nó có nghĩa là "thay thế chương trình này bằng", kết thúc việc thực hiện nó một cách hiệu quả và bắt đầu chương trình mới, được khởi chạy bởi su, bằng root, để chạy từ đầu. Ví dụ thay thế là "root" để nó không thực thi phía bên phải của | |
sudo su
làm mắt tôi đau