Bagaimana cara mengedit / etc / sudoers dari skrip?


116

Saya perlu mengedit /etc/sudoersdari skrip untuk menambah / menghapus barang dari daftar putih.

Dengan asumsi saya memiliki perintah yang akan berfungsi pada file normal, bagaimana saya bisa menerapkannya /etc/sudoers?

Dapatkah saya menyalin dan memodifikasinya, kemudian visudomengganti yang asli dengan salinan yang dimodifikasi? Dengan menyediakan skrip saya sendiri di $EDITOR?

Atau bisakah saya menggunakan kunci yang sama dan cp?

Pertanyaannya lebih tentang masalah potensial daripada hanya menemukan sesuatu yang berhasil.

Jawaban:


146

Utas lama, tapi bagaimana dengan:

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

10
Ini jawaban yang bagus. Seluruh subkulit harus dijalankan sebagai root, misalnya echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon

3
Jawaban ini bagus sekali! Saya menggunakannya untuk skrip postinst dalam paket debian. Terima kasih! Karena ini selalu root, ini menjadi pendek dan praktis:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen

3
Saya hanya ingin menunjukkan nuansa utama pada jawaban @ BorisDäppen: -abendera ke EDITOR="tee": ini akan menambahkan baris ke file, tidak hanya menimpa baris pertama. Saya tidak mengerti perbedaannya pada awalnya dan saya tidak tahu cara untuk menambahkannya. Saya harap saya dapat menemukan beberapa orang suatu saat dengan menunjukkannya secara langsung ;-)
Jean-Philippe Murray

3
dapatkah seseorang menjelaskan kepada saya bagaimana ini bekerja maksud saya bukanlah titik koma yang diperlukan setelah EDITOR = 'tee -a'. Saya tahu itu akan melanggar perintah. EDITOR adalah variabel shell dan visudo adalah perintah lain jadi di sini kita meneruskan EDITOR dan visudo dalam baris perintah yang sama. bagaimana cara kerjanya?
Sagar

1
Saya mencoba ini x = "sesuatu" echo $ x. Ini tidak berhasil untukku.
Sagar

43

Gunakan visudo untuk ini dengan editor khusus. Ini menyelesaikan semua kondisi balapan dan masalah "hack" dengan solusi 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

Skrip ini akan menambahkan baris "# Dummy change to sudoers" di akhir sudoers. Tidak ada peretasan dan tidak ada kondisi balapan.

Versi beranotasi yang menjelaskan cara kerjanya:

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
Ini membutuhkan sudo telah dikompilasi dengan --enable-env-editor, jika tidak maka hanya akan menggunakan menghormati variabel editor jika itu adalah salah satu dari sekumpulan kecil nilai yang diketahui.
Caleb

Ini berfungsi untuk saya (Ubuntu 12.04), tetapi saya tidak mengerti cara kerjanya. Bisakah seseorang menjelaskan cara menggunakannya dengan benar dan cara kerjanya? Terima kasih
MountainX

Ingin mencatat bahwa ini tampaknya tidak berfungsi untuk saya tepat pada 12,04. Saya membuat skrip bash, menambahkan izin + x padanya, dan mengeksekusi file dengan output berikut: visudo: tidak dapat menjalankan / tmp / edit_sudoers: Kesalahan format eksekusi visudo: /etc/sudoers.tmp tidak berubah
Jose Diaz-Gonzalez

Ini bekerja dengan baik untuk saya, meskipun saya hanya masuk sebagai root dan menghapusnya sudo -Edari perintah pertama.
merlin2011

Saya sangat menyukai jawaban ini, tetapi tidak berhasil untuk saya. Saya pikir sudo saya tidak dikompilasi dengan bendera yang diperlukan.
Mnebuerquo

30

Anda harus mengedit file sementara, lalu gunakan visudo -c -f sudoers.temp untuk mengonfirmasi bahwa perubahan tersebut valid dan kemudian menyalinnya di atas / 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

Sepertinya Anda menggunakan sudoers.tmp sebagai file kunci, tidak yakin bagaimana mengonfirmasi bahwa perubahan itu valid. Bukankah kita harus memeriksa status keluar dari visudo untuk memastikan tidak ada kesalahan?
konverter42

/etc/sudoers.tmp adalah file kunci yang diperiksa oleh visudo dalam mode interaktif. visudo -c -f mengembalikan 1 jika ada kesalahan, karenanya periksa kode yang dikembalikan.
Brian C.Lane

Saya khawatir tentang penggunaan sudoers.tmp, karena sepertinya menggunakan antarmuka internal visudo, yaitu peretasan. Apakah standar, artinya dijamin selalu sudoers.tmp yang digunakan sebagai kunci? Atau apakah mereka memiliki kebebasan untuk mengubahnya di masa depan?
n-alexander

2
perlu menggunakan lockfile daripada test / touch
n-alexander

2
Halaman manual mengatakan itu menggunakan /tmp/sudoers.tmp sehingga saat ini standarnya. Tentu saja bisa berubah di masa depan. Dan ya, Anda benar ada kondisi balapan.
Brian C.Lane

18

Di Debian dan turunannya, Anda dapat memasukkan skrip kustom ke dalam /etc/sudoers.d/direktori, dengan hak 0440- untuk info lebih lanjut lihat /etc/sudoers.d/README .

Mungkin bisa membantu.


Bukankah itu dikomentari?

2
@TomDworzanski: IMHO no. Lihat man sudoers (5) dan komentar lainnya .
pevik

Kamu benar! Terima kasih untuk tautan dan jawaban yang bagus.

3
Saya menggunakan direktori itu di centos 7 juga
Alexander Bird

Saya pikir ini adalah cara yang tepat untuk melakukannya.
jansohn

11

visudo seharusnya menjadi antarmuka manusia untuk mengedit /etc/sudoers. Anda dapat mencapai hal yang sama dengan mengganti file secara langsung, tetapi Anda harus berhati-hati dengan pengeditan bersamaan dan validasi sintaks. Perhatikan r--r-----izinnya.


9

Jika Anda sudomengizinkan menambahkan entri dalam/etc/sudoers.d , maka Anda dapat menggunakan jawaban ini dengan @ dragon788:

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

Pada dasarnya Anda menggunakan visudountuk memverifikasi file sebelum Anda menyalinnya /etc/sudoers.d, sehingga Anda dapat yakin Anda tidak membobol sudosiapa pun.

visudo -c -q -f filename

Ini memeriksanya dan mengembalikan sukses (0) jika valid, sehingga Anda dapat menggunakannya dengan if, &&dan operasi boolean skrip lainnya. Setelah Anda memvalidasi, cukup salin ke /etc/sudoers.ddan itu akan berfungsi. Pastikan itu dimiliki oleh root dan tidak dapat ditulis oleh orang lain.


5

Siapkan editor khusus. Pada dasarnya ini akan menjadi skrip yang menerima nama file (dalam hal ini /etc/sudoers.tmp), dan memodifikasi serta menyimpannya di tempatnya. Jadi Anda bisa menulis ke file itu. Setelah selesai, keluar dari skrip, dan visudo akan mengurus modifikasi file sudoers yang sebenarnya untuk Anda.

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

Apakah saya benar bahwa semua kebutuhan dummy_editor.sh berisi sesuatu seperti ini? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Sepertinya berhasil untuk saya.
MountainX

4

Banyak jawaban, telah bekerja dengan sudo untuk yonks tetapi tidak perlu mengotomatiskan konfigurasi penyiapan sampai sekarang. Saya menggunakan campuran dari beberapa jawaban di atas, menulis baris konfigurasi saya ke /etc/sudoers.d include location jadi saya tidak perlu memodifikasi file sudoers utama, lalu memeriksa file itu untuk sintaks, contoh sederhana di bawah ini:

Tulis baris Anda ke sudoers include file:

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

Periksa apakah sudoers Anda termasuk file lulus pemeriksaan sintaksis visudo:

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

Abaikan saja tanda bintang, yang seharusnya tidak ada di sana ^^
Sonata

itu dan mengembalikan kesuksesan (0) - mengerti
Oleg

2

Hanya untuk menambahkan opsi lebih lanjut ke jawaban di atas, jika kondisi balapan bukan masalah utama, maka perintah berikut dapat digunakan untuk menghindari penyalinan file yang dimodifikasi secara manual ke /etc/sudoers

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

Ini akan memastikan bahwa file baru divalidasi dan diinstal dengan benar dengan pembaruan izin.

Perhatikan bahwa jika ada kesalahan pada /tmp/sudoers.newfile maka visudoakan meminta input pengguna sehingga disarankan untuk memeriksanya visudo -c -f /tmp/sudoers.newterlebih dahulu.


1

Menurut saya solusi paling mudah adalah:

Buat skrip addudoers.sh

#!/bin/sh

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

dan sebut dengan pengguna yang ingin Anda tambahkan sebagai:

root prompt> ./addsudoers.sh user1 user2

Untuk penjelasan lengkapnya lihat jawaban ini: Menambahkan pengguna ke sudoers melalui skrip shell

Salam!


0

Cobalah untuk mengulanginya. Anda harus menjalankannya di subkulit. Contoh:

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


-2

Ini berhasil untuk saya berdasarkan apa yang diposting orang lain di sini. Ketika saya menggunakan skrip orang lain, itu akan terbuka untuk saya tetapi tidak akan mengedit. Ini membuat pengeditan yang saya perlukan untuk mengizinkan semua pengguna, termasuk pengguna standar, menginstal java 7u17 untuk 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

Ini menambahkan% semua orang blah blah blah ke bagian bawah file sudoers. Saya harus menjalankan skrip seperti ini.

sudo sh sudoersedit.sh

Semoga berhasil: D

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.