Sudo gerektiren scriptler yoksa veya başarısız olursa sudo ve istemi kullanıyor mu?


26

Bana arka ışık parlaklığım üzerinde hassas kontrol sağlayan ve sudoçalışması gereken bir senaryo var . Aslında bu:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

ve yaşıyor ~/bin/backlight-adjust. Komutun sudoayrıcalıklara ihtiyacı var , çünkü tee $backlightayrıcalıklı bir yere yazıyor. Bu yüzden çalıştırılmazsa başarısız olur sudo.

Sadece koşamam, çünkü bu yaklaşım, bir sorunu var sudo backlight-adjust, çünkü ~/bindeğil $PATHde sudosadece benim ortamında, çevre. Bu yüzden koşmam sudo env "PATH=$PATH" backlight-adjustya da benzer bir şey yapmam gerekiyor .

Alternatif olarak, şöyle yazabilirdim:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

ve bana şifre sor.

İkinci yaklaşım benim için daha iyi sonuç veriyor çünkü sudo yazmayı hatırlamama gerek yok; beni soracak. Ve $PATHbozulmadan devam edebilirim . Bu genel olarak daha uygun hissettiriyor, ancak ikinci yoldan yapmamam için herhangi bir neden var mı?

(Xubuntu 14.04 kullanıyorum ve kabuğum GNU bash 4.2.45, eğer bu bir fark yaratıyorsa).


Düzeltme için teşekkürler. Ben değiştirilmiş Debianı (LMDE) çalıştırıyorum ve benim sudoaslında benim tutar $PATHBen bu sorunu zorunda kalmamak varsayılan olarak.
terdon

Yanıtlar:


27

Şahsen farklı bir yaklaşım kullanırdım. Komut dosyanız için bir takma ad oluşturun. Bu satırı ekle ~/.bashrc(veya diğer mermilerdeki eşdeğeri)

alias backlight-adjust='sudo ~/bin/backlight-adjust'

Bu şekilde, onu çalıştırmayı hatırlama konusunda endişelenmenize gerek sudoyoktur sudove senaryoyu eklemeniz gerekmez . Size tamamen şeffaf olacak ve denemeye çalıştığınızda sadece şifrenizi isteyin backlight-adjust.


Bu çok mantıklı bir yaklaşım gibi görünüyor ve sistemin geri kalanı üzerinde minimum etkiye sahip. +1.
John Feminella

@JohnFeminella Öte yandan, bu betiği başka biriyle paylaşmak istiyorsanız, diğer adlara da ihtiyaçları olacaktır. Şahsen, sudogerçek betiğe yazmamak için herhangi bir sebep görmüyorum , özellikle betiğin hangi öğelerinin kök izinleri gerektirdiğini kolayca görmenize izin veriyor.
Kyle Strand

@KyleStrand hayır onlar olmaz. Komut dosyası tarafından çağrılan komut, erişime sahip olmadığından şikayetçi olacaktır.
terdon

@terdon Biraz daha net olabileceğimi biliyorum, ama muhtemelen ne demek istediğimi anlıyorsunuz: senaryo alıcısı, senaryo yazarı tarafından başlangıçta karşılaşılan aynı sorunla karşı karşıya kalacak ve yazarın bilinçli bir senaryo paylaşıcısı olarak ayrıca kişisel çözümlerini bu özel kullanım ikilemi ile paylaşırlar.
Kyle Strand

@KyleStrand evet, ama sorun yoktu, OP'nin tek sorunu, bunun dışında "sudo yazmayı hatırlamak zorunda kalmak" istemesiydi, senaryo tamamen taşınabilir olacaktı. Demek istediğim, takma adın tamamen isteğe bağlı olduğu ve hiçbir şeyi çözmediği, sadece kullanımını kolaylaştırdığı.
terdon

7

Neden yanlış olduğunu anlayamıyorum --- normalde bu komutların bana bir şey sormamasını tercih etsem de komut dosyası yazılsın. Bunun şifre olmadan çalışmasını /etc/sudoerssağlamak için ince ayar yapabilirsiniz sudo.

Ama ... neden ekleme

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

senin içinde /etc/rc.localve unutmak sudo?

(Ubuntu'da eğer kullanabiliyorsan, sudoseni sudo grubun içindesin , öyleyse kullan chgrp sudo /sys...ve onlarla mutlu olabilirsin.)


3

Alternatif olarak, ekleyebilirsiniz

Defaults        env_keep +="PATH"

sizin için /etc/sudoersdosyanın.


2

Sen devlet ~ / bin sudo ortamında $ PATH içinde olmadığı için sudo, arka ışık ayarlama

Peki neden buna bağlı? Bence bu çizgiyi değiştirmelisin /home/user/bin/backlight-adjust, işe yarayacak.

Ancak Terdon'un takma ad kullanma çözümünü gerçekten çok isterdim. Veya betiğinizi yerleştirebilir /usr/bin/ve her kullanıcı için hazır olacaktır (root dahil)


Evet, ama bunu yapmak can sıkıcı. Aksi takdirde, ilk olarak $ PATH'ime koymanın amacı neydi? Ayrıca, ~/biniçeriye girmekten hoşlanıyorum çünkü evimin dotfiles deposunun altında, bu yüzden sürüm kontrolünde kalıyor.
John Feminella

Bu arada @JohnFeminella, yolu değiştirmek için hiçbir neden yoktur, sadece -Eçevreyi korumak için bayrak kullanın:sudo -E command
terdon

@ terdon Debian'da işe yaramıyor; güvenlik nedeniyle geçersiz kılınır. Sorumu ( sudo env "PATH=$PATH" ...) da belirttiğim gibi çevre değişkenlerini açıkça iletmek zorundasınız .
John Feminella

1

Genel bir kural veremem ... eğer senaryo / program yeniden yapılandırma yapmak için tasarlandıysa (örneğin bir yazıcı) ve normal kullanıcılar tarafından aranıyorsa, bunu yapmak zorundadır. Aksi takdirde, yeterince rahat bırakabilirim: Düzenli bir kullanıcı çalıştırırsa, sadece başarısız (açık bir kontrol sonucu veya sadece bir şeyler yapmasına izin verilmediğinden).

Yüksek ayrıcalıklar, eğer mümkünse az miktarda dağıtılmalıdır. Daha yüksek ayrıcalıklara geçmek zordur, uzmanlara bırakması daha iyidir (yani sudo(1)).


0

Kişisel olarak ${SUDO}komut dosyalarımdaki gibi bir şey kullanıyorum , böylece arayan kişi gerektiğinde ayarlayabilir veya ${SUDO:-sudo}varsayılan olarak kullanabilir.

Sizin özel durumunuz olsa da, kabul edilmiş bir cevabım var.


-1

Komut dosyasını (olmadan sudo) kullanıcı çapında uygun bir yere koyun /binve sonra şunu yapın:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

Bu setuid bayrağını ayarlayarak çalışır, yani her zaman dosya sahibi olarak çalıştırılır. Detaylar için lütfen http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/ adresini okuyun . Bunun nasıl çalıştığı hakkında pek bir şey bilmiyorum, sadece birkaç yıl önce okuduğumu düşündüğüm bir şeye dayanarak googling buldum.


1
Shell scriptleri artık ayarlanamaz, şükürler olsun… Bu tamamen kötülük bir cevap. Özellikle güvenlik açısından.
mirabilos

@mirabilos Yalnızca grup veya genel yazma bayrakları açıksa tehlikelidir. Setuid riski, dosya için yazma izni olan herkesin, kullanıcımış gibi istediği her şeyi çalıştırabilmesi ve bu nedenle de korunması gereken yazma izinleri olmasıdır. 4755her zaman sahibi olarak çalıştırılan, sahibi okuyabilir, yazabilir ve çalıştırabilir, grup okuyabilir ve çalıştırabilir ve kullanıcılar okuyabilir ve çalıştırabilir; bu, herhangi bir kullanıcının kök izinleriyle yapmasına izin verilmesi gereken şeyler için standart izin düzeyidir.
AJMansfield

@mirabilos Ve setuid içeren kabuk betiklerinin setuid içeren ikili dosyalardan daha fazla güvenlik açığı oluşturduğu fikri saçma; İkili gruplar da ptrace istismarına karşı bağışık değildir, ki bu setuid'den yararlanan temel istismardır.
AJMansfield

2
Mevcut tüm Unix benzeri işletim sistemleri setuid komut dizilerini yasaklar. Bu sadece bir gerçek. Bana inanmıyorsan, nedenlerini kendin sor. OpenBSD ile başlayın.
mirabilos
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.