Bỏ qua sudo trong tập lệnh bash


9

Tôi có một tập lệnh bash nhỏ:

#!/bin/bash

touch dummy.txt

Nếu tôi thực thi đoạn script này sudothì nó sẽ tạo ra dummy.txtnó sẽ được bảo vệ root .

Điều tôi muốn làm là:

Cho dù kịch bản này được thực thi bằng sudohoặc một người dùng bình thường, các tập tin dummy.txtnên không được gốc được bảo vệ.


4
Bất cứ điều gì bạn có nghĩa là "bảo vệ gốc", bạn có thể sử dụng chownchmodtrong tập lệnh của mình để đặt quyền sở hữu và quyền như mong muốn.
fkraiem

1
Không rõ ý của bạn là "bảo vệ gốc". Bạn có nghĩa là chỉ người dùng root mới có thể đọc / ghi (ví dụ: quyền của tệp được đặt thành thứ gì đó như 700) hoặc người dùng root là chủ sở hữu tệp?

1
@DoritoStyle xin lỗi vì sự nhầm lẫn. Bởi root được bảo vệ , tôi có nghĩa là người dùng root là chủ sở hữu tập tin.
Ẩn danh

Câu trả lời:


22

Bạn có thể kiểm tra nếu tập lệnh đang được chạy thông qua sudoviệc sử dụng các biến EUIDSUDO_USERbiến, sau đó thực thi touchnhư SUDO_USERthể đúng - giống như

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
Lưu ý rằng ==được sử dụng để so sánh chuỗi. Vì $EUIDđược cho là trả về giá trị nguyên, tôi khuyên bạn nên sử dụng -edso sánh. Dấu cách được cho phép trong tên người dùng , vì vậy có thể trích dẫn $SUDO_USERbiến. Mặt khác, câu trả lời tốt - đây là thứ mà cá nhân tôi sẽ sử dụng.
Sergiy Kolodyazhnyy

@steeldo đây là những gì tôi đang tìm kiếm. cảm ơn!!
Ẩn danh

1
Bạn có thể có tập lệnh tự chạy lại sudo -unếu nó phát hiện ra rằng nó đang chạy như root. OP đã nói về việc có nhiều lệnh trong một tập lệnh. Nhưng hãy cẩn thận để tránh một vòng lặp vô hạn về lỗi.
Peter Cordes

1
Không có phân chia từ nào trong [[...]]nên không thực sự cần thiết để trích dẫn biến trong câu lệnh if @Serg và tôi gues -edlà một lỗi đánh máy cho-eq
Arronical

@Arronical vâng, đó là lỗi đánh máy -eq. Không biết [[không có chia từ. Cảm ơn. Cá nhân, tôi vẫn trích dẫn vì lợi ích của thói quen viết kịch bản tốt
Sergiy Kolodyazhnyy

9

Nếu tập lệnh của bạn không có nghĩa là được chạy như vậy root, cách an toàn nhất để giải quyết vấn đề là hủy bỏ việc thực thi tập lệnh ngay từ đầu:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

Theo tùy chọn, bạn có thể thực hiện lại tập lệnh của mình với tư cách là người dùng dự phòng (ví dụ sudo -u FALLBACK_USER "$0") thay vì chỉ đơn giản là hủy bỏ.

Cố gắng sửa các quirks của các lệnh riêng lẻ sẽ làm cho tập lệnh của bạn phức tạp không cần thiết và khó gỡ lỗi. Mỗi lần bạn sửa đổi nó, bạn sẽ phải thực hiện tất cả các thử nghiệm hai lần (như một người dùng thông thường, sau đó là root) và sửa tất cả các rootlỗi liên quan phát sinh. Đó không phải là một giải pháp trong tương lai, có thể nói như vậy.


6

Theo mặc định, các tệp được tạo bằng accound gốc có quyền như vậy:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Ở đây tập tin thuộc về người dùng root và nhóm gốc, và có thể đọc và ghi được bằng root, nhưng chỉ những người khác có thể đọc được.

Cách tiếp cận đơn giản nhất sẽ chỉ là chowntrả lại tệp cho người dùng ban đầu.

chown username:group_name dummy.txt

Bạn có thể sử dụng $SUDO_USERbiến chỉ có thể truy cập khi sudođược gọi, như vậy:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Nếu bạn đang chạy tập lệnh với tư cách là người dùng thông thường, thì chownphần đó hoàn toàn không cần thiết, vì vậy bạn có thể muốn xem xét sử dụng if-statement hoặc &&test để kiểm tra trường hợp khi tập lệnh được chạy dưới quyền root và thực hiện một số thứ theo các dòng này:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Trên đây là cách tiếp cận được đề nghị. Có những thứ khác, như sử dụng chmodđể thay đổi quyền đọc-ghi-thực thi cho người dùng và nhóm, nhưng điều đó không được khuyến khích.


Cảm ơn vì đã trả lời. Nhưng trong QI chỉ giải thích kịch bản đơn giản trong trường hợp thực kịch bản gốc sẽ tạo ra nhiều tệp. Trong linux chúng ta không thể đơn giản bỏ qua sudo?
Ẩn danh

1
@ Đồng nghĩa nếu bạn đang thực thi toàn bộ tập lệnh sudo, thì không - bạn không thể bỏ qua nó. Tùy chọn của bạn là chạy tập lệnh như người dùng thông thường (điều mà tôi không hiểu tại sao bạn không làm, vì bạn chỉ đơn giản là tạo một tệp cho người dùng của mình ở đây) hoặc thay đổi quyền sở hữu tệp như tôi thể hiện trong câu trả lời của mình.
Sergiy Kolodyazhnyy

Đây là giải pháp chính xác nhất và không khó để mở rộng quy mô.
gà con
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.