Bir komut dosyasında bir şifre sorulmadan nasıl bir komut gönderirim?


107

Sistemimi her gün otomatik olarak açmak istiyorum. Bu yüzden Python betiğimde aşağıdaki kodu kullanıyorum, ancak sudoher seferinde bir şifre sormamı istiyor:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

sudoHer seferinde şifre sormadan bu betiği nasıl çalıştırabilirim ?


4
Bu davranışı destekleyip desteklemediğini görmek için anakart kılavuzunuza veya BIOS'a bakmalısınız. Soruyu çözdüğünü biliyorum! =] Fakat bu yeterli bir çözüm olabilir.
Alex Hirzel

Yanıtlar:


149

Lütfen aklınızda bulundurun: Giriş şifrenizi düz metin, komut veya dosya içine yerleştirmeyi içeren herhangi bir yöntem güvensizdir ve kullanılmamalıdır!

Bunu yapmanız için doğru yolusudo , yalnızca ihtiyacınız olan tek bir komutun, yani echo date... > rtc...parolaya ihtiyaç duymadan WITH koşmasına izin verin.

Adım 1. Sadece bu komutla bir kabuk betiği oluşturun

  • gedit(veya en sevdiğin editörün)pydatertc.sh
  • Yalnızca bu satırı ekleyin ve örneğin ana dizininize kaydedin:
    yankı tarihi \ '+% s \' -d \ '+ 24 saat \'> / sys / class / rtc / rtc0 / wakealarm
  • Editörden çıkın ve terminalden komut dosyasını çalıştırılabilir hale getirin ve sahipliğini root olarak değiştirin , aksi halde sisteminize erişimi olan başka bir kullanıcı şifrenizi gerekmeksizin root olarak istediği komutları çalıştırabilir :
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh

2. Adım. pydatertc.shParola gerektirmeden çalıştırılmasına izin verecek sudo ayarını yapın

  • Tip sudo visudo(sudo izinlerini açmak için terminalde sudoers) dosyası
  • Satır 25 civarında, şu satırı göreceksiniz: %sudo ALL=(ALL:ALL) ALL
  • Bu satırın altına , aşağıdaki satırı girin, usernamekullanıcı adınız nerede :
    kullanıcı adı ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Editörden çık ( Ctrl+ Xeğer nano )

Adım 3. Python betiğinizi aramak için değiştirin pydatertc.sh

  • Satırı şu şekilde değiştirin:
    os.system ('sudo /home/username/pydatertc.sh')

Şimdi betiğiniz şifre gerektirmeden VE hesabınızın, verilerinizin veya sisteminizin güvenliğinden ödün vermeden çalışmalıdır!


Sadece alternatif wakealarm(genel kullanım için değil!):

Sadece bu özel durumda , /sys/class/rtc/rtc0/wakealarmdosya sadece sistem için uyandırma alarmını kontrol ettiğinden ve aksi takdirde zararsız olduğu için, şifreyi önlemenin bir başka alternatifi de o dosyanın sahipliğini almaktır chown(alarmı ayarlayan tek kullanıcı sizseniz). , veya dünya ile yazılabilir yapmak chmod +666; Bu durumda, sudoPython aramanızdan sh -c "...."bozulmadan bırakmanız yeterlidir .


1
Müthiş, bunu yapmanın doğru yolu bu.
roadmr

1
Böyle iyi ayrıntılı, faydalı bir cevap ve tam olarak nasıl yapılması gerektiği.
ArtOfCode

@RobertRosati, önerdiğiniz düzenleme için çok teşekkürler - Bunu en başta unutmamalıydım!
ish

1
@ m-ric Bu satırların üstündeki komutu okudunuz mu? "Aksi takdirde, sisteminize erişimi olan başka bir kullanıcı muhtemelen düzenleyebilir ve şifreniz gerekmeden root olarak ne
isterse uygulayabilir

2
Dosya bulunuyorsa: ama bir sorun hala var burada - Bu cevap eskidir gerçekleştirmek / home / kullanıcı adı , daha sonra sistem bu dizin kötü niyetli bir kullanıcı (ya da kök olmayan giriş tarafından yazılabilir ise tehlikeye girebilir uzlaşılmış) . Dosyayı kaldırabilir veya yeniden adlandırabilir, yerine başka bir komut dosyasını koyabilir ve bu komut dosyasını sudobir parola olmadan çalıştırabilir . Bu nedenle, komut dosyasını yalnızca kökün değiştirebileceği bir dizine koymak daha güvenlidir , örneğin: / usr / sbin veya / root . Aksi takdirde, LGTM.
NVRAM

30

Uyarı!

Giriş şifrenizi bir düz yazıya, bir komut veya dosyaya koymak son derece güvensizdir ve özel verilerinizi ve sisteminizi tehlikeye atabilir. Edilir şiddetle tavsiye Eğer sistem "kişisel" veya "güvenli bir yerde" olduğunu düşünseniz bile bunu asla!

Senaryo sadece kişisel kullanım içindir ve güvenli bir yere koymuşsanız ve hesabınızın çalınmasından ve bu türden bir şeyden korkmuyorsanız, işte size basit bir çözüm:

echo LOGINPASSWD | sudo -S COMMAND HERE

LOGINPASSWD giriş şifreniz (örneğin: iloveponies) ve COMMAND HERE, sudo'dan sonra gelen komutunuzdur, sh -c "echo da .. etc


13
@Viswa, Lütfen unutmayınız ki, şifreyi düz metin halinde göstermek çok tehlikelidir. Yapmamanız tavsiye edilir
Anwar

3
-1 Bu iyi bir fikir gibi görünüyorsa, kök hesabınıza bir şifre koyup z7sg'in çözümünü kullanmanız çok daha iyi olurdu; bu kadar kolay ve bu çok tehlikeli güvenlik sorununu yaratmaz.
Bryce

4
Hah! Cevabımda 6 oy ve 4 oy aldım :) Ama neden çocuklar, 'Kişisel kullanım', 'güvenli yer' vb. Bu dosyayı dışarı vermediğiniz ve çalışan bir ssh sunucunuz olmadığı sürece bir güvenlik sorunu yoktur! Senaryonun kişisel kullanım için ve güvenli bir yerde olması koşuluyla, güvenlik sorununu nerede görüyorsunuz?
hytromo

5
Aşağı oy, bu karanlık tarafa giden yol ve sudo yöntemiyle gerekli değil.
Floyd

4
Tamam, söyle bana, bilgisayar korsanı hesabınıza basit bir kullanıcı olarak giriş yapmış olsa bile, betiği / usr / share / help / lv / ubuntu-help altında şifrenizle nasıl bulabilir?
hytromo

21

Komut dosyasının saatin belirli bir saatinde (veya gün boyunca) çalışmasına aldırış etmiyorsanız, root'un home dizinine ( /root) yerleştirin ve script'i /etc/crontabroot olarak crontab ( ) komutundan çalıştırın . O zaman güvenliğinden ödün vermene gerek kalmaz.

Komut dosyasını crontab'a nasıl ekleyeceğinizi öğrenmek için https://help.ubuntu.com/community/CronHowto adresine bakın .


4
Muhtemelen anacron, 24x7 çalışmayan bir masaüstü / dizüstü bilgisayar ise, kullanmak isteyebilirsiniz
balki

Bu yararlı bir cevaptır, örneğin güncellemeleri kontrol etmek için komut dosyası yazıyorsanız, bu bilgilerle bir şeyler yapın ve gereken güncellemeler hakkında yöneticiye e-posta gönderin. Şahsen, komut dosyalarımın çoğu sunucu otomasyonu için kullanılıyor, bu yüzden sadece sudo crontab -e kullanarak yapmak istediğim şeydi. +1
Rab

11

Yukarıdaki mükemmel cevaplarda bahsedilmeyen sudo'nun bir başka güzel özelliği de 'timestamp_timeout' değişkenidir. Etkileşimli parola yazarken tasarruf etmek için artabileceğiniz bir sudo değişkenidir.

Örneğin, / etc / sudoers (veya içindeki dosyalardan biri) içinde varsayılanı değiştirebilirsiniz:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

'Adam sudo'larından' tam açıklaması:

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Elbette, bu komutun cron'dan çalıştırılması durumunda belirli bir durumda olamaz. Ama farkında olmak iyi bir şey.


0
export MY_SUDO_PASS="user_password_here"

Çalışıp çalışmadığını test etmek için:

echo $MY_SUDO_PASS
> user_password_here

"Sudo apt-get update" komutunu çalıştırmak ve daha önce yarattığımız çevre değişkenlerinden şifreyi kabul etmek için:

echo $MY_SUDO_PASS | sudo -S apt-get update

Python'dan çalıştırın (örneğin, dizin sahipliğini tekrar tekrar username_here olarak değiştirin):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS'ın şifresi -S anahtarı onu yakalayıp şifreyi sudo'ya geçiriyor


Bunun mevcut BIOS cevaplarına ne eklediğinden emin değilim en güncel BIOS desteği alarmdan sonra ...
Elder Geek
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.