web-dev-qa-db-ja.com

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

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

通常のファイルで動作するコマンドがあると仮定して、どのようにして/etc/sudoersに適用できますか?

コピーして変更し、visudoで元のコピーを変更されたコピーに置き換えますか? $EDITORで独自のスクリプトを提供することにより?

または、同じロックとcpを使用できますか?

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

100
n-alexander

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

echo 'foobar ALL=(ALL:ALL) ALL' | Sudo EDITOR='tee -a' visudo
123
beckerr

これには、カスタムエディターで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

このスクリプトは、「#Dummy change to sudoers」という行を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
42
sstendal

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

Debianおよびその派生製品では、カスタムスクリプトをinto/etc/sudoers.d/directory、権利付き0440–詳細は / etc/sudoers.d/README をご覧ください。

役立つかもしれません。

13
pevik

visudoは、編集用のヒューマンインターフェイスであると考えられます/etc/sudoers。ファイルを直接置き換えることで同じことを実現できますが、同時編集と構文検証に注意する必要があります。 r--r-----パーミッション。

9
ngn

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にコピーするだけで機能します。ルートが所有し、他者が書き込み可能でないことを確認してください。

6
Mnebuerquo

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

Sudo EDITOR=/path/to/my_dummy_editor.sh visudo
5
Ali Afshar

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

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

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

Visudo構文チェックに合格したファイルがsudoersに含まれていることを確認します。

Sudo visudo -cf /etc/sudoers.d/99_Sudo_include_file
4

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

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

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

/tmp/sudoers.newファイルにエラーがある場合、visudoはユーザー入力を要求するため、最初にvisudo -c -f /tmp/sudoers.newでチェックすることをお勧めします。

2
zelanix

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

スクリプトを作成するaddsudoers.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に追加する

よろしく!

1
Albert Vonpupp

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

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

0
Apollo