スクリプトから/ etc / sudoersを編集するにはどうすればよいですか?


116

/etc/sudoersホワイトリストに項目を追加/削除するには、スクリプトから編集する必要があります。

通常のファイルで機能するコマンドがあるとしたら、どのように適用できます/etc/sudoersか?

コピーして変更してからvisudo、元のファイルを変更したコピーで置き換えることはできますか?で独自のスクリプトを提供することによって$EDITOR

それとも同じロックを使用できcpますか?

問題は、機能するものを見つけるだけではなく、潜在的な問題についてです。

回答:


146

古いスレッドですが、どうですか:

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

10
これは素晴らしい答えです。サブシェル全体をrootとして実行する必要がありますecho "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync')
サイモン、2015

3
この答えは素晴らしいです!私は、debianパッケージのpostinst skriptsに使用します。ありがとう!これは常にルートであるので、それは短いと便利取得しますecho "$CONFIGLINE" | (EDITOR="tee -a" visudo)
ボリスDäppen

3
@BorisDäppenの答えに対する主要なニュアンスを指摘したいだけです。-aフラグEDITOR="tee"::最初の行を上書きするだけでなく、ファイルに行を追加します。最初は違いを理解できず、追加する方法を理解できませんでした。私はそれを直接指すことでいつか誰かを見つけることができることを願っています;-)
Jean-Philippe Murray

3
誰かが私がこの作業が意味することは、EDITOR = 'tee -a'の後に必要なセミコロンではないことを私に説明できますか?私はそれがコマンドを壊すことを知っています。EDITORはシェル変数であり、visudoはさらに別のコマンドであるため、ここでは同じコマンドラインでEDITORとvisudoを渡しています。それは実際にはどのように機能しますか?
Sagar

1
私はこのx = "something"エコー$ xを試しました。これではうまくいきませんでした。
Sagar

43

カスタムエディターでこれを行うには、visudoを使用します。これにより、ブライアンのソリューションですべての競合状態と「ハッキング」問題が解決されます。

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

5
これには、sudoがでコンパイルされている必要があります--enable-env-editor。そうでない場合は、既知の値の小さなセットの1つである場合にのみ、エディター変数が考慮されます。
カレブ2012

それは私(Ubuntu 12.04)のために動作しますが、それがどのように動作するのか理解していません。誰かがそれを適切に使用する方法と実際にどのように機能するかを説明できますか?ありがとう
MountainX

これは12.04で正確に機能しないようです。bashスクリプトを作成し、+ x権限を追加して、次の出力でファイルを実行しました。visudo:/ tmp / edit_sudoersを実行できません:Exec形式エラーvisudo:/etc/sudoers.tmp変更なし
Jose Diaz-Gonzalez

ルートとしてログインしsudo -E、最初のコマンドからを削除しただけですが、これは私にとってはうまくいきました。
merlin2011 2014

私はこの答えが本当に好きですが、うまくいきませんでした。私のsudoは必要なフラグでコンパイルされていなかったと思います。
Mnebuerquo

30

一時ファイルを編集してから、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

sudoers.tmpをロックファイルとして使用しているようですが、変更が有効であることを確認する方法がわかりません。visudoの終了ステータスをチェックして、エラーがないことを確認するべきではないでしょうか?
コンバータ

/etc/sudoers.tmpは、対話モードでvisudoによってチェックされるロックファイルです。エラーがあった場合、visudo -c -fは1を返します。したがって、戻りコードのチェックが行われます。
ブライアンC.レーン

visudoの内部インターフェース、つまりハックを使用しているように見えるので、私はsudoers.tmpの使用について心配しています。それは標準ですか、つまり、常にロックとして使用されるsudoers.tmpであることが保証されていますか?それとも、将来的にそれを変更する自由がありますか?
n-alexander

2
テスト/タッチの代わりにロックファイルを使用する必要がある
n-alexander '28年

2
マンページには/tmp/sudoers.tmpを使用することが記載されているため、現在はこれが標準です。もちろん、将来的には変更される可能性があります。そしてはい、あなたは正しいです。
ブライアンC.レーン

18

Debianおよびその派生物では、カスタムスクリプト/etc/sudoers.d/を権限付きでディレクトリに挿入できます。0440詳細については、/etc/sudoers.d/READMEを参照してください。

役立つかもしれません。


コメントアウトされていませんか?

2
@TomDworzanski:私見なし。man sudoers(5)およびその他のコメントを参照してください。
pevik 2015年

あなたが正しい!リンクと素晴らしい答えをありがとう。

3
Centos 7でもこのディレクトリを使用しています
Alexander Bird

これは正しいやり方だと思います。
jansohn

11

visudoは、編集用のヒューマンインターフェイスであると想定されています/etc/sudoers。ファイルを直接置き換えることで同じことを達成できますが、同時編集と構文検証に注意する必要があります。r--r-----権限に注意してください。


9

sudoエントリを追加できる場合は/etc/sudoers.d、@ dragon788でこの回答を使用できます。

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

基本的にはvisudo、にコピーする前にファイルを確認するために使用する/etc/sudoers.dのでsudo、誰にとっても壊れていないことが確認できます。

visudo -c -q -f filename

これはそれをチェックし、それが有効な場合は成功(0)を返すのでif&&やその他のスクリプトのブール演算で使用できます。検証したら、それをにコピーするだけ/etc/sudoers.dで動作します。ルートが所有し、他のユーザーが書き込みできないことを確認してください。


5

カスタムエディタを設定します。基本的には、ファイル名(この場合は/etc/sudoers.tmp)を受け入れ、それを変更して適切な場所に保存するスクリプトです。したがって、そのファイルに書き出すことができます。完了したら、スクリプトを終了すると、visudoが実際のsudoersファイルの変更を処理します。

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

必要なすべてのdummy_editor.shが次のようなものであることを修正しますか?#!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0それは私のために働くようです。
MountainX

4

たくさんの回答があり、sudoを使って作業していますが、今までセットアップ構成を自動化する必要はありませんでした。上記の回答のいくつかを組み合わせて使用​​し、/ etc / sudoers.dインクルードの場所に構成行を書き込んで、メインのsudoersファイルを変更する必要がないようにし、そのファイルの構文をチェックしました。以下に簡単な例を示します。

行をsudoersインクルードファイルに書き込みます。

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

sudoersインクルードファイルがvisudo構文チェックに合格したことを確認します。

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

アスタリスクを省略するだけで、そこに表示されるべきではありません^^
ソナタ

それを返し、成功(0)を返します
わかり

2

上記の回答にオプションを追加するだけで、競合状態が大きな問題ではない場合は、次のコマンドを使用して、変更されたファイルを手動でコピーすることを回避できます。 /etc/sudoers

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

これにより、新しいファイルが検証され、権限の更新で正しくインストールされます。

/tmp/sudoers.newファイルにエラーがある場合は、visudoユーザー入力を求めるプロンプトが表示されるので、visudo -c -f /tmp/sudoers.new最初に確認することをお勧めします。


1

最も簡単な解決策は次のとおりです。

スクリプトaddudoers.shを作成します

#!/bin/sh

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

追加したいユーザーに次のように呼び出します:

root prompt> ./addsudoers.sh user1 user2

詳細な説明については、この回答を参照してください:シェルスクリプトを使用してユーザーをsudoersに追加する

よろしく!


0

それをエコーし​​てみてください。ただし、サブシェルで実行する必要があります。例:

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


-2

これは、他の人がここに投稿したものに基づいて私にとってうまくいきました。他の人のスクリプトを使用すると、visudoが開きますが、編集はできません。これにより、標準ユーザーを含むすべてのユーザーがJava 7u17を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

これにより、%everyone blah blah blah blahがsudoersファイルの最後に追加されました。このようにスクリプトを実行する必要がありました。

sudo sh sudoersedit.sh

がんばって:D

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.