Làm cách nào để chỉnh sửa / etc / sudoers từ một tập lệnh?


116

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

Giả sử tôi có một lệnh hoạt động trên một tệp bình thường, tôi có thể áp dụng lệnh đó như /etc/sudoersthế nào?

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

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

Câu hỏi chủ yếu là về các vấn đề tiềm ẩn hơn là chỉ tìm ra thứ gì đó hiệu quả.

Câu trả lời:


146

Chủ đề cũ, nhưng những gì về:

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

10
Đây là một câu trả lời tuyệt vời. Toàn bộ subshell nên được thực hiện như là người chủ, ví dụ echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon

3
Câu trả lời này hoạt động tuyệt vời! Tôi sử dụng nó cho các đoạn mã postinst trong các gói debian. cảm ơn! Vì đây luôn là root, nó được ngắn gọn và tiện dụng:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen

3
Tôi chỉ muốn chỉ ra một sắc thái chính cho câu trả lời của @ BorisDäppen: -acờ để EDITOR="tee": nó sẽ thêm dòng vào tệp, không chỉ ghi đè dòng đầu tiên. Lúc đầu, tôi không nắm 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 trong một thời gian bằng cách chỉ trực tiếp ;-)
Jean-Philippe Murray

3
ai đó có thể giải thích cho tôi cách làm việc này không, ý tôi là không bắt buộc phải có dấu chấm phẩy sau EDITOR = 'tee -a'. Tôi biết điều đó sẽ phá vỡ lệnh. EDITOR là một biến shell và visudo là một lệnh khác, vì vậy ở đây chúng ta đang chuyển EDITOR và visudo trong cùng một dòng lệnh. nó thực sự hoạt động như thế nào?
Sagar

1
Tôi đã thử điều này x = "cái gì đó" echo $ x. Điều này không hiệu quả với tôi.
Sagar

43

Sử dụng visudo cho việc 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 cuộc đua và các vấn đề "hack" 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 có chú thích giải thích cách hoạt động thực sự của điều này:

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

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

Nó hoạt động với 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 cách sử dụng nó đúng cách và nó thực sự hoạt động như thế nào? Cảm ơn
MountainX

Xin lưu ý rằng điều này dường như không hoạt động đối với 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 kết quả đầu ra sau: visudo: không thể chạy / tmp / edit_sudoers: Lỗi định dạng thực thi visudo: /etc/sudoers.tmp không thay đổi
Jose Diaz-Gonzalez

Điều này làm việc tuyệt vời đối với tôi, mặc dù tôi chỉ đăng nhập bằng quyền root và xóa sudo -Ekhỏi lệnh đầu tiên.
merlin2011

Tôi thực sự thích câu trả lời này, nhưng nó không hiệu quả với tôi. Tôi nghĩ rằng sudo của tôi không được biên dịch với cờ cần thiết.
Mnebuerquo

30

Bạn nên thực hiện các chỉnh sửa đối với một tệp tạm thời, sau đó sử dụng visudo -c -f sudoers.temp để xác nhận rằng các thay đổi là hợp lệ và sau đó sao chép nó lên trên / 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

Có vẻ 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 các thay đổi là hợp lệ. Chúng ta không nên kiểm tra trạng thái thoát của visudo để đảm bảo không có lỗi nào?
bộ chuyển đổi

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

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

2
cần phải sử dụng lockfile thay vì thử nghiệm / cảm ứng
n-alexander

2
Trang web cho biết nó sử dụng /tmp/sudoers.tmp nên hiện tại là tiêu chuẩn. Tất nhiên nó có thể thay đổi trong tương lai. Và có, bạn đúng là có một điều kiện chủng tộc.
Brian C. Lane

18

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

Nó sẽ giúp.


Nó không được bình luận ra ngoài mặc dù?

2
@TomDworzanski: IMHO không. Xem người đàn ông sudoers (5)bình luận khác .
pevik

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

3
Tôi cũng sử dụng thư mục đó trong centos 7
Alexander Bird

Tôi nghĩ đây là cách làm đúng đắn.
jansohn

11

visudo được coi 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 quan tâm đến việc chỉnh sửa đồng thời và xác thực cú pháp. Lưu ý đến các r--r-----quyền.


9

Nếu của bạn sudocho phép thêm mục vào /etc/sudoers.d, thì bạn có thể sử dụng câu trả lời này bằng @ 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 sao chép vào /etc/sudoers.d, vì vậy bạn có thể chắc chắn rằng mình không vi phạm sudocho bất kỳ ai.

visudo -c -q -f filename

Này kiểm tra và quay trở lại 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à các hoạt động kịch bản boolean khác. Khi bạn xác thực, chỉ cần sao chép nó vào /etc/sudoers.dvà nó sẽ hoạt động. Đảm bảo rằng nó thuộc sở hữu của người chủ và không thể ghi bởi người khác.


5

Thiết lập trình chỉnh sửa tùy chỉnh. Về cơ bản, nó sẽ là một tập lệnh chấp nhận tên tệp (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 đó. Khi bạn hoàn tất, hãy thoát 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

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 0Nó dường như làm việc cho tôi.
MountainX

4

Rất nhiều câu trả lời, đã làm việc với sudo cho yonks nhưng không có nhu cầu tự động hóa cấu hình thiết lập cho đến bây giờ. Tôi đã sử dụng kết hợp một số câu trả lời ở trên, viết dòng cấu hình của tôi vào vị trí /etc/sudoers.d include để tôi không phải sửa đổi tệp sudoers chính, sau đó kiểm tra cú pháp của tệp đó, ví dụ đơn giản bên dưới:

Viết dòng của bạn vào một tệp bao gồm sudoers:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

Kiểm tra xem tệp bao gồm sudoers của bạn đã vượt qua kiểm tra cú pháp visudo chưa:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file

Chỉ cần bỏ dấu hoa thị, điều đó không nên ở đó ^^
Sonata

nó và trả về thành công (0) - đã hiểu
Oleg

2

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

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

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

Lưu ý rằng nếu có lỗi trong /tmp/sudoers.newtệp thì visudosẽ nhắc người dùng nhập vào, vì vậy bạn nên kiểm tra nó visudo -c -f /tmp/sudoers.newtrước.


1

Tôi nghĩ giải pháp thẳng thắn nhất là:

Tạo một tập lệnh addudoers.sh

#!/bin/sh

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

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

root prompt> ./addsudoers.sh user1 user2

Để biết giải thích đầy đủ, hãy xem câu trả lời này: Thêm người dùng vào sudoers thông qua shell script

Trân trọng!


0

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

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


-2

Điều này làm việc cho tôi dựa trên những gì người khác đã đăng ở đây. Khi tôi sử dụng tập lệnh của những 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 thực hiện chỉnh sửa cần thiết để cho phép tất cả người dùng, bao gồm cả người dùng thông thường, 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 các bạn thành công: D

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.