Bir komut dosyasından / etc / sudoers'ı nasıl düzenlerim?


116

/etc/sudoersBeyaz listelerden bir şeyler eklemek / çıkarmak için bir komut dosyasından düzenlemem gerekiyor .

Normal bir dosyada çalışacak bir komutum olduğunu varsayarsak, onu nasıl uygulayabilirim /etc/sudoers?

Kopyalayıp değiştirebilir miyim, sonra visudoorijinali değiştirilmiş kopya ile değiştirebilir miyim? Kendi komut dizimi girerek $EDITORmi?

Ya da sadece aynı kilitleri kullanabilir miyim cp?

Soru, işe yarayan bir şey bulmaktan çok potansiyel sorunlarla ilgili.

Yanıtlar:


146

Eski ileti dizisi, peki ya:

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

10
Bu harika bir cevap. Tüm alt kabuk, örneğin kök olarak çalıştırılmalıdır echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon

3
Bu cevap harika çalışıyor! Debian paketlerinde postinst skripts için kullanıyorum. Teşekkürler! Bu her zaman kök olduğundan, kısa ve kullanışlı hale gelir:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen

3
@ BorisDäppen'in cevabına büyük bir nüansa -aişaret etmek istiyorum EDITOR="tee": bayrak : dosyaya satır ekleyecek, sadece ilk satırın üzerine yazmayacak. İlk başta farklı olanı yakalayamadım ve ekleme yolunu bulamadım. Umarım bunu doğrudan işaret ederek biraz zaman bulabilirim ;-)
Jean-Philippe Murray

3
birisi bana bu işin nasıl olduğunu açıklayabilir mi demek istediğim, EDITOR = 'tee -a' sonrasında gerekli olan noktalı virgül değil. Bunun emri bozacağını biliyorum. EDITOR bir kabuk değişkenidir ve visudo da başka bir komuttur, bu yüzden burada EDITOR ve visudo'yu aynı komut satırından geçiyoruz. bu gerçekten nasıl çalışıyor?
Sagar

1
Bu x = "bir şey" denedim echo $ x. Bu benim için işe yaramadı.
Sagar

43

Bunun için özel bir düzenleyiciyle visudo kullanın. Bu, Brian'ın çözümüyle tüm yarış koşullarını ve sorunları çözer.

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

Bu komut dosyası, sudoers'ın sonuna "# Dummy change to sudoers" satırını ekleyecektir. Hack yok ve yarış koşulları yok.

Bunun gerçekte nasıl çalıştığını açıklayan açıklamalı sürüm:

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
Bu, sudo'nun derlenmiş olmasını gerektirir --enable-env-editor, aksi takdirde, yalnızca küçük bir bilinen değerler kümesinden biriyse, editör değişkenini kullanır.
Caleb

Benim için çalışıyor (Ubuntu 12.04), ancak nasıl çalıştığını anlamıyorum. Birisi onu nasıl doğru kullanacağını ve gerçekte nasıl çalıştığını açıklayabilir mi? Teşekkürler
MountainX

Bunun benim için 12.04'te kesin olarak çalışmadığını belirtmek isterim. Bir bash betiği oluşturdum, + x izinlerini ekledim ve aşağıdaki çıktıyla dosyayı çalıştırdım: visudo: çalıştırılamıyor / tmp / edit_sudoers: Yürütme biçim hatası visudo: /etc/sudoers.tmp değişmedi
Jose Diaz-Gonzalez

Bu benim için harika çalıştı, ancak sadece root olarak giriş yaptım sudo -Eve ilk komuttan kaldırdım .
merlin2011

Bu cevabı gerçekten beğendim, ama bende işe yaramadı. Sanırım sudom gerekli bayrakla derlenmedi.
Mnebuerquo

30

Düzenlemelerinizi geçici bir dosyada yapmalı, ardından değişikliklerin geçerli olduğunu onaylamak için visudo -c -f sudoers.temp kullanmalı ve sonra bunu / etc / sudoers'ın üstüne kopyalamalısınız.

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

Görünüşe göre sudoers.tmp'yi kilit dosyası olarak kullanıyorsunuz, değişikliklerin nasıl doğrulandığından emin değilsiniz. Hata olmadığından emin olmak için visudo'nun çıkış durumunu kontrol etmemiz gerekmez mi?
dönüştürücü

/etc/sudoers.tmp, etkileşimli modda visudo tarafından kontrol edilen kilit dosyasıdır. visudo -c -f bir hata varsa bir 1 döndürür, dolayısıyla dönüş kodu kontrol edilir.
Brian C. Lane

Sudoers.tmp kullanmaktan endişeleniyorum çünkü visudo'nun dahili arayüzünü, yani bir hack'i kullanıyormuş gibi görünüyor. Standart mı, yani her zaman kilit olarak kullanılan sudoers.tmp olması garantili mi? Yoksa gelecekte bunu değiştirme özgürlüğüne sahipler mi?
n-alexander

2
test / touch yerine kilit dosyası kullanmanız gerekiyor
n-alexander

2
Manpage, /tmp/sudoers.tmp kullandığını söylüyor, bu yüzden şu anda standart bu. Elbette gelecekte değişebilir. Ve evet, haklısın, bir yarış durumu var.
Brian C. Lane


11

visudo'nun düzenleme için insan arayüzü olması gerekiyordu /etc/sudoers. Doğrudan dosyayı değiştirerek de aynısını elde edebilirsiniz, ancak eşzamanlı düzenleme ve sözdizimi doğrulamasına dikkat etmeniz gerekir. İzinlere dikkat edin r--r-----.


9

Giriş sudoeklemeye izin /etc/sudoers.dverirseniz, bu yanıtı @ dragon788 ile kullanabilirsiniz:

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

Temelde visudodosyayı kopyalamadan önce doğrulamak için kullanırsınız /etc/sudoers.d, böylece sudokimseye zarar vermediğinizden emin olabilirsiniz .

visudo -c -q -f filename

Bu kontroller ve iadeler başarı (0) Birlikte kullanabilirsiniz yüzden, geçerli ise if, &&ve diğer komut boolean operasyonları. Doğruladıktan sonra, sadece içine kopyalayın /etc/sudoers.dve çalışmalıdır. Köke ait olduğundan ve başkaları tarafından yazılamadığından emin olun.


5

Özel bir düzenleyici kurun. Temel olarak, dosya adını (bu durumda /etc/sudoers.tmp) kabul eden ve bunu değiştirip yerinde kaydeden bir komut dosyası olacaktır. Böylece o dosyaya yazabilirsin. İşiniz bittiğinde, komut dosyasından çıkın ve visudo sizin için gerçek sudoers dosyasını değiştirmeye özen gösterecektir.

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

Tüm dummy_editor.sh dosyalarının buna benzer bir şey içermesi konusunda haklı mıyım? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Benim için çalışıyor gibi görünüyor.
MountainX

4

Pek çok cevap, yonks için sudo ile çalışıyordu, ancak şimdiye kadar kurulum yapılandırmasını otomatikleştirmeye gerek yoktu. Yukarıdaki cevaplardan bazılarının bir karışımını kullandım, yapılandırma satırımı /etc/sudoers.d içerisine yazdım, böylece ana sudoers dosyasını değiştirmek zorunda kalmayacağım, sonra bu dosyayı sözdizimi için kontrol ettim, aşağıdaki basit örnek:

Satırınızı bir sudoers include dosyasına yazın:

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

Sudoer'larınızın dosyanın visudo sözdizimi kontrollerini geçtiğini kontrol edin:

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

Yıldız işaretini atlayın, orada olmamalı ^^
Sonata

(0) - anladım
Oleg

2

Sadece yukarıdaki cevaplara başka bir seçenek eklemek için, yarış durumu önemli bir sorun değilse, aşağıdaki komut, değiştirilmiş bir dosyanın manuel olarak kopyalanmasını önlemek için kullanılabilir. /etc/sudoers

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

Bu, yeni dosyanın onaylanmasını ve izin güncellemesiyle doğru şekilde kurulmasını sağlayacaktır.

/tmp/sudoers.newDosyada bir hata varsa, visudokullanıcı girişini isteyeceğinden, visudo -c -f /tmp/sudoers.newönce onu kontrol etmeniz önerilir .



0

Yinelemeye çalışın. Yine de onu bir alt kabukta çalıştırmanız gerekir. Misal:

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


-2

Bu, başkalarının burada yazdıklarına dayanarak benim için çalıştı. Diğer insanların komut dosyasını kullandığımda benim için visudo'yu açacaktı ama düzenlemeyi yapmayacaktı. Bu, standart kullanıcılar da dahil olmak üzere tüm kullanıcıların safari / firefox için java 7u17 yüklemesine izin vermek için ihtiyacım olan düzenlemeyi yaptı.

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

Bu, sudoers dosyasının altına% Everyone blah blah blah'ı ekledi. Senaryoyu böyle çalıştırmak zorunda kaldım.

sudo sh sudoersedit.sh

İyi şanslar: D

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.