2008-11-27 49 views
74

Tôi cần chỉnh sửa/etc/sudoers từ tập lệnh để thêm/xóa nội dung khỏi danh sách trắng.Làm cách nào để chỉnh sửa/etc/sudoers từ tập lệnh?

Giả sử tôi có lệnh sẽ hoạt động trên một tệp thông thường, làm cách nào để áp dụng nó cho .etc/sudoers?

Tôi có thể sao chép và sửa đổi nó, sau đó có visudo thay thế bản gốc bằng bản sao đã sửa đổi không? Bằng cách cung cấp tập lệnh của riêng tôi trong EDITOR?

Hoặc tôi có thể sử dụng cùng một khóa và cp không?

Câu hỏi đặt ra nhiều hơn về các vấn đề tiềm ẩn hơn là chỉ tìm một thứ gì đó hoạt động.

Trả lời

29

Bạn nên thực hiện chỉnh sửa của bạn vào một tập tin tạm thời, sau đó sử dụng visudo -c -f sudoers.temp để xác nhận rằng những thay đổi có hiệu lực và sau đó sao chép nó trên đầu/etc/sudoers

#!/bin/sh 
if [ -f "/etc/sudoers.tmp" ]; then 
    exit 1 
fi 
touch /etc/sudoers.tmp 
edit_sudoers /tmp/sudoers.new 
visudo -c -f /tmp/sudoers.new 
if [ "$?" -eq "0" ]; then 
    cp /tmp/sudoers.new /etc/sudoers 
fi 
rm /etc/sudoers.tmp 
+0

Dường như bạn đang sử dụng sudoers.tmp làm tệp khóa, không chắc chắn cách xác nhận thay đổi hợp lệ. Chúng ta có nên kiểm tra trạng thái thoát của visudo để đảm bảo không có lỗi? – converter42

+0

/etc/sudoers.tmp là tệp khóa được kiểm tra bằng visudo ở chế độ tương tác. visudo -c -f trả về 1 nếu có lỗi, do đó kiểm tra mã trả về. –

+0

Tôi lo lắng về việc sử dụng sudoers.tmp, vì nó trông giống như sử dụng giao diện nội bộ của visudo, tức là một hack. Là nó tiêu chuẩn, có nghĩa là nó được đảm bảo để luôn luôn được sudoers.tmp được sử dụng như khóa? Hay họ có quyền tự do thay đổi điều đó trong tương lai? –

8

visudo được cho là giao diện người dùng để chỉnh sửa /etc/sudoers. Bạn có thể đạt được điều tương tự bằng cách thay thế tệp trực tiếp, nhưng bạn phải tự chăm sóc về việc chỉnh sửa đồng thời và xác thực cú pháp. Hãy chú ý đến các điều khoản r--r-----.

+3

+1 để ghi nhớ quyền! – wchargin

5

Thiết lập trình chỉnh sửa tùy chỉnh. Về cơ bản nó sẽ là một kịch bản chấp nhận tên tập tin (trong trường hợp này là /etc/sudoers.tmp), và sửa đổi và lưu nó tại chỗ. Vì vậy, bạn chỉ có thể ghi ra tập tin đó. Khi bạn hoàn thành, thoát khỏi tập lệnh và visudo sẽ xử lý việc sửa đổi tệp sudoers thực tế cho bạn.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo 
+0

Tôi có chính xác rằng tất cả các dummy_editor.sh cần chứa là một cái gì đó như thế này? '#!/bin/sh; echo "# my changes to sudoers" >> $ 1; exit 0' Nó có vẻ làm việc cho tôi. – MountainX

42

Sử dụng visudo cho điều này với trình chỉnh sửa tùy chỉnh. Điều này giải quyết tất cả các điều kiện chủng tộc và "hack" vấn đề với giải pháp của Brian.

#!/bin/sh 
if [ -z "$1" ]; then 
    echo "Starting up visudo with this script as first parameter" 
    export EDITOR=$0 && sudo -E visudo 
else 
    echo "Changing sudoers" 
    echo "# Dummy change to sudoers" >> $1 
fi 

Tập lệnh này sẽ thêm dòng "# Dummy change to sudoers" vào cuối sudoers. Không có hack và không có điều kiện chủng tộc.

phiên bản chú thích giải thích cách này thực sự hoạt động:

if [ -z "$1" ]; then 

    # When you run the script, you will run this block since $1 is empty. 

    echo "Starting up visudo with this script as first parameter" 

    # We first set this script as the EDITOR and then starts visudo. 
    # Visudo will now start and use THIS SCRIPT as its editor 
    export EDITOR=$0 && sudo -E visudo 
else 

    # When visudo starts this script, it will provide the name of the sudoers 
    # file as the first parameter and $1 will be non-empty. Because of that, 
    # visudo will run this block. 

    echo "Changing sudoers" 

    # We change the sudoers file and then exit 
    echo "# Dummy change to sudoers" >> $1 
fi 
+4

Điều này yêu cầu sudo đã được biên dịch bằng '--enable-env-editor', nếu không nó sẽ chỉ sử dụng sự tôn trọng biến biên tập nếu nó là một trong một tập nhỏ các giá trị đã biết. – Caleb

+0

Nó hoạt động cho tôi (Ubuntu 12.04), nhưng tôi không hiểu nó hoạt động như thế nào. Ai đó có thể giải thích làm thế nào để sử dụng nó đúng cách và nó thực sự hoạt động như thế nào? Cảm ơn – MountainX

+0

Xin lưu ý rằng điều này dường như không hoạt động cho tôi vào ngày 12.04 chính xác. Tôi đã tạo một tập lệnh bash, thêm quyền + x vào nó và thực thi tệp với đầu ra sau: visudo: không thể chạy/tmp/edit_sudoers: Lỗi định dạng Exec visudo: /etc/sudoers.tmp không thay đổi –

-1

này làm việc cho tôi dựa trên những gì người khác được đăng ở đây. Khi tôi sử dụng kịch bản người khác nó sẽ mở visudo cho tôi nhưng sẽ không thực hiện chỉnh sửa. Điều này làm cho chỉnh sửa tôi cần thiết để cho phép tất cả người dùng, bao gồm cả người dùng chuẩn, để cài đặt java 7u17 cho safari/firefox.

#!/usr/bin/env bash 
rm /etc/sudoers.new 
cp /etc/sudoers /etc/sudoers.new 
echo "%everyone ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new 
cp /etc/sudoers.new /etc/sudoers 

Điều này đã thêm% mọi người blah blah blah vào cuối tệp sudoers. Tôi phải chạy kịch bản như thế này.

sudo sh sudoersedit.sh 

Chúc may mắn: D

2

Chỉ cần thêm một tùy chọn thêm cho câu trả lời ở trên, nếu các điều kiện chủng tộc không phải là một mối quan tâm lớn, sau đó các lệnh sau đây có thể được sử dụng để tránh tự sao chép một tập tin sửa đổi đến /etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo 

Điều này sẽ đảm bảo tệp mới được xác thực và cài đặt đúng với cập nhật quyền.

Lưu ý rằng nếu có lỗi trong tệp /tmp/sudoers.new thì visudo sẽ nhắc nhập dữ liệu của người dùng, vì vậy bạn nên kiểm tra trước bằng visudo -c -f /tmp/sudoers.new.

+0

hack tốt đẹp, sử dụng mà – Aki

11

Trên Debian và nó dẫn xuất, bạn có thể chèn tập lệnh tùy chỉnh vào thư mục /etc/sudoers.d/, với quyền 0440 – để biết thêm thông tin, xem /etc/sudoers.d/README.

Nó có thể hữu ích.

+0

Không phải là nó nhận xét ra mặc dù? –

+1

@TomDworzanski: IMHO no. Xem [man sudoers (5)] (http://www.sudo.ws/man/1.8.15/sudoers.man.html#x4f74686572207370656369616c206368617261637465727320616e6420726573657276656420776f726473) và [bình luận khác] (http://unix.stackexchange.com/questions/244064/tại sao-bao gồm-và-bao gồm-chỉ thị-trong-sudo-tiền tố-với-the-pound). – pevik

+0

Bạn nói đúng! Cảm ơn các liên kết và câu trả lời tuyệt vời. –

1

Tôi nghĩ rằng giải pháp thẳng nhất về phía trước là:

Tạo một kịch bản addsudoers.sh

#!/bin/bash 

while [[ -n $1 ]]; do 
    echo "$1 ALL=(ALL:ALL) ALL" >> /etc/sudoers; 
    shift # shift all parameters; 
done 

và gọi nó với người dùng mà bạn muốn thêm nó như là:

root prompt> ./addsudoers.sh user1 user2 

Để xem giải thích đầy đủ, hãy xem câu trả lời này: Adding users to sudoers through shell script

Trân trọng!

0

Cố gắng lặp lại. Tuy nhiên, bạn phải chạy nó trong một subshell. Ví dụ:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"

86

Cũ chủ đề, nhưng những gì về:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo 
+6

Đây là một câu trả lời tuyệt vời. Toàn bộ bán vỏ phải được thực thi dưới dạng gốc, ví dụ: 'echo" $ USER ALL = NOPASSWD:/usr/bin/rsync "| (sudo su -c 'EDITOR = "tee" visudo -f /etc/sudoers.d/rsync') '. – simon

+1

Câu trả lời này hoạt động rất tốt! Tôi sử dụng nó cho các tập lệnh postinst trong các gói debian. cảm ơn! Vì đây luôn là root, nó ngắn gọn và tiện dụng: 'echo" $ CONFIGLINE "| (EDITOR = "tee -a" visudo) ' –

+1

Tôi chỉ muốn chỉ ra một sắc thái lớn cho câu trả lời của @ BorisDäppen: cờ' -a' tới 'EDITOR =" tee "': nó sẽ nối thêm dòng vào tệp, chứ không phải chỉ ghi đè dòng đầu tiên. Lúc đầu tôi không bắt được sự khác biệt và tôi không thể tìm ra cách để nối thêm. Tôi hy vọng tôi có thể tìm thấy một số người một số thời gian bằng cách chỉ trực tiếp ;-) –

3

Nếu sudo của bạn cho phép thêm các mục trong /etc/sudoers.d, sau đó bạn có thể sử dụng câu trả lời này bởi @ dragon788:

https://superuser.com/a/1027257/26022

Về cơ bản bạn sử dụng visudo để xác minh tệp trước khi bạn sao chép tệp đó vào sudoers.d, vì vậy bạn có thể chắc chắn bạn không phá vỡ sudo cho bất cứ ai.

visudo -c -q -f filename 

này sẽ kiểm tra nó và trả về thành công (0) nếu nó có giá trị, vì vậy bạn có thể sử dụng nó với if, && và kịch bản hoạt động boolean khác. Khi bạn xác thực, chỉ cần sao chép nó vào /etc/sudoers.d và nó sẽ hoạt động. Hãy chắc chắn rằng nó thuộc sở hữu của người chủ và không thể ghi bởi người khác.

Các vấn đề liên quan