2008-11-27 48 views
74

我需要從腳本編輯/ etc/sudoers來添加/刪除白名單中的東西。如何從腳本編輯/ etc/sudoers?

假設我有一個可以在普通文件上工作的命令,我該如何將它應用到.etc/sudoers?

我可以複製和修改它,然後visudo用修改後的副本替換原件嗎?通過在EDITOR中提供我自己的腳本?

或者我可以只使用相同的鎖和cp?

這個問題更多的是潛在的問題,而不僅僅是找到有用的東西。

回答

29

你應該讓你的編輯到一個臨時文件,然後使用visudo -c -f sudoers.temp以確認該變化是有效的,然後將其拷貝過來的/ 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

它看起來像你使用sudoers.tmp作爲鎖文件,不知道如何確認更改是有效的。我們是不是應該檢查visudo的退出狀態以確保沒有錯誤? – converter42 2008-11-27 15:58:55

+0

/etc/sudoers.tmp是visudo在交互模式下檢查的鎖定文件。 visudo -c -f在出現錯誤時返回1,因此檢查返回代碼。 – 2008-11-27 16:02:54

+0

我很擔心使用sudoers.tmp,因爲它看起來像使用visudo的內部接口,即黑客。它是標準的,這意味着它總是被sudoers.tmp用作鎖嗎?或者他們有沒有在未來改變這種自由的自由? – 2008-11-28 10:16:51

8

visudo應該是編輯/etc/sudoers的人機界面。您可以通過直接替換文件來達到相同的效果,但是您必須注意併發編輯和語法驗證。注意r--r-----權限。

+3

記住權限+1! – wchargin 2012-01-09 07:01:39

5

設置自定義編輯器。基本上它會是一個接受文件名的腳本(在本例中爲/etc/sudoers.tmp),並修改並保存。所以你可以寫出這個文件。完成後,退出腳本,visudo將負責爲您修改實際的sudoers文件。

sudo EDITOR=/path/to/my_dummy_editor.sh visudo 
42

使用visudo爲此與自定義編輯器。這解決了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 

該腳本將在sudoers的末尾添加一行「#dummy change to sudoers」。沒有黑客和沒有競爭條件。

註釋版本說明這個問題實際上是如何工作的:

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 
-1

這個工作對我關根據別人張貼在這裏。當我使用其他人的腳本時,它會爲我打開visudo,但不會進行編輯。這使得我需要的編輯允許包括標準用戶在內的所有用戶爲safari/firefox安裝java 7u17。

#!/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 

這增加了%每個人等等等等等等對sudoers文件的底部。 我不得不這樣運行腳本。

sudo sh sudoersedit.sh 

好運:d

2

我想補充另一種選擇上述答案,如果比賽條件不是主要問題,則可以使用下面的命令,以避免手動複製修改的文件到/etc/sudoers

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

這將確保新的文件進行驗證,並與權限的更新正確安裝。

請注意,如果/tmp/sudoers.new文件中有錯誤,則visudo會提示用戶輸入,因此建議先用visudo -c -f /tmp/sudoers.new進行檢查。

11

在Debian和它的衍生物,可以插入自定義腳本爲/etc/sudoers.d/目錄,具有權利0440 –更多信息見/etc/sudoers.d/README

它可能有幫助。

1

我想最直接的解決方案是:

創建一個腳本addsudoers.sh

#!/bin/bash 

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

,並要其添加爲用戶稱之爲:

root prompt> ./addsudoers.sh user1 user2 

對於充分的解釋看到這個答案:Adding users to sudoers through shell script

關心!

0

試着迴應它。不過,你必須在子shell中運行它。例如:

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

86

舊線,但怎麼樣:

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

如果你的sudo允許在/etc/sudoers.d添加條目,那麼你可以通過@ dragon788使用這樣的回答:

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

基本上你使用visudo驗證文件,然後將其複製到sudoers.d中,以便你可以確定你不會爲任何人破壞sudo。

visudo -c -q -f filename 

這將檢查並返回成功(0),如果它是有效的,所以你可以if&&和其它腳本布爾運算使用它。一旦你驗證,只需將其複製到/etc/sudoers.d,它應該工作。確保它由root擁有,不能被其他人寫入。