我需要從腳本編輯/ etc/sudoers來添加/刪除白名單中的東西。如何從腳本編輯/ etc/sudoers?
假設我有一個可以在普通文件上工作的命令,我該如何將它應用到.etc/sudoers?
我可以複製和修改它,然後visudo用修改後的副本替換原件嗎?通過在EDITOR中提供我自己的腳本?
或者我可以只使用相同的鎖和cp?
這個問題更多的是潛在的問題,而不僅僅是找到有用的東西。
我需要從腳本編輯/ etc/sudoers來添加/刪除白名單中的東西。如何從腳本編輯/ etc/sudoers?
假設我有一個可以在普通文件上工作的命令,我該如何將它應用到.etc/sudoers?
我可以複製和修改它,然後visudo用修改後的副本替換原件嗎?通過在EDITOR中提供我自己的腳本?
或者我可以只使用相同的鎖和cp?
這個問題更多的是潛在的問題,而不僅僅是找到有用的東西。
你應該讓你的編輯到一個臨時文件,然後使用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
visudo應該是編輯/etc/sudoers
的人機界面。您可以通過直接替換文件來達到相同的效果,但是您必須注意併發編輯和語法驗證。注意r--r-----
權限。
記住權限+1! – wchargin 2012-01-09 07:01:39
設置自定義編輯器。基本上它會是一個接受文件名的腳本(在本例中爲/etc/sudoers.tmp),並修改並保存。所以你可以寫出這個文件。完成後,退出腳本,visudo將負責爲您修改實際的sudoers文件。
sudo EDITOR=/path/to/my_dummy_editor.sh visudo
使用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
這個工作對我關根據別人張貼在這裏。當我使用其他人的腳本時,它會爲我打開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
我想補充另一種選擇上述答案,如果比賽條件不是主要問題,則可以使用下面的命令,以避免手動複製修改的文件到/etc/sudoers
sudo EDITOR="cp /tmp/sudoers.new" visudo
這將確保新的文件進行驗證,並與權限的更新正確安裝。
請注意,如果/tmp/sudoers.new
文件中有錯誤,則visudo
會提示用戶輸入,因此建議先用visudo -c -f /tmp/sudoers.new
進行檢查。
在Debian和它的衍生物,可以插入自定義腳本爲/etc/sudoers.d/
目錄,具有權利0440
–更多信息見/etc/sudoers.d/README。
它可能有幫助。
我想最直接的解決方案是:
創建一個腳本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
關心!
試着迴應它。不過,你必須在子shell中運行它。例如:
sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"
舊線,但怎麼樣:
echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
如果你的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擁有,不能被其他人寫入。
它看起來像你使用sudoers.tmp作爲鎖文件,不知道如何確認更改是有效的。我們是不是應該檢查visudo的退出狀態以確保沒有錯誤? – converter42 2008-11-27 15:58:55
/etc/sudoers.tmp是visudo在交互模式下檢查的鎖定文件。 visudo -c -f在出現錯誤時返回1,因此檢查返回代碼。 – 2008-11-27 16:02:54
我很擔心使用sudoers.tmp,因爲它看起來像使用visudo的內部接口,即黑客。它是標準的,這意味着它總是被sudoers.tmp用作鎖嗎?或者他們有沒有在未來改變這種自由的自由? – 2008-11-28 10:16:51