Vraag Hoe sudo ik een opdracht in een script zonder dat ik om een ​​wachtwoord wordt gevraagd?


Ik wil mijn systeem elke dag automatisch inschakelen. Dus ik gebruik de onderstaande code in mijn Python-script, maar sudo vraagt ​​me telkens om een ​​wachtwoord:

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

Hoe kan ik dit script uitvoeren zonder sudo telkens om het wachtwoord vragen?


101
2018-06-25 13:30


oorsprong


Raadpleeg de handleiding of het BIOS van uw moederbord om te zien of dit dit gedrag ondersteunt. Ik weet dat het de vraag ontwijkt! =] Maar het kan een voldoende oplossing zijn. - Alex Hirzel


antwoorden:


Houd er rekening mee dat: Elke methode die inhoudt dat u uw inlogwachtwoord in platte tekst, in een opdracht of in een bestand plaatst, is onveilig en mag NIET worden gebruikt!

De juiste manier om het te doen bij het instellen sudo zoals dat enkel en alleen het enige specifieke commando dat je nodig hebt, d.w.z. echo date... > rtc..., kan worden uitgevoerd ZONDER het wachtwoord nodig te hebben.

Stap 1. Maak een shell-script met alleen die opdracht

  • Doe open gedit (of uw favoriete editor), en maak het script bijv. pydatertc.sh
  • Voeg alleen deze regel in en sla deze op in bijv. je homedirectory:
    echo datum \ '+% s \' -d \ '+ 24 uur \'> / sys / class / rtc / rtc0 / wakealarm
  • Sluit de editor en maak het script vanaf de terminal uitvoerbaar en verander zijn eigendom in wortel, anders kan een andere gebruiker met toegang tot uw systeem deze eventueel bewerken en de gewenste opdrachten uitvoeren wortel zonder dat je je wachtwoord nodig hebt:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Stap 2. Stel sudo in om toe te staan pydatertc.sh uitvoeren zonder een wachtwoord te vereisen

  • Type sudo visudo op de terminal om de sudo-machtigingen te openen (sudoers) het dossier
  • Rond regel 25 ziet u deze regel: %sudo ALL=(ALL:ALL) ALL
  • Onder die lijn, voeg de volgende regel in, waar username is uw gebruikersnaam:
    gebruikersnaam ALL = (ALL) NOPASSWD: /home/gebruikersnaam/pydatertc.sh
  • Verlaat de editor (Ctrl+X als nano)

Stap 3. Pas je python-script aan om te bellen pydatertc.sh

  • Verander de regel in:
    os.system ('sudo /home/username/pydatertc.sh')

Nu moet uw script worden uitgevoerd zonder een wachtwoord te vereisen EN zonder afbreuk te doen aan de veiligheid van uw account, uw gegevens of uw systeem!


Alternatief alleen voor wakealarm (niet voor algemeen gebruik!):

In alleen in dit specifieke geval, sinds de /sys/class/rtc/rtc0/wakealarm bestand bestuurt alleen het wekker-alarm voor het systeem en is verder onschadelijk, een ander alternatief om te voorkomen dat het wachtwoord ofwel eigendom is van dat bestand met chown (als u de enige gebruiker bent die het alarm instelt), of maak het wereldwijd beschrijfbaar chmod +666; verwijder in dat geval eenvoudig de sudo van je Python-gesprek, vertrekend sh -c "...." intact.


138
2018-06-25 14:53



Geweldig, dit is de juiste manier om het te doen. - roadmr
Zo'n goed gedetailleerd, nuttig antwoord en precies hoe het zou moeten gebeuren. - ArtOfCode
@RobertRosati, hartelijk dank voor uw voorgestelde bewerking - dat had ik in de eerste plaats niet mogen vergeten! - ish
@ m-ric Heb je het commando boven deze regels gelezen? "anders kan een andere gebruiker met toegang tot uw systeem deze mogelijk bewerken en de gewenste opdrachten als root uitvoeren zonder uw wachtwoord" - Tobias Kienzler
Ik realiseer me dat dit antwoord oud is - maar er is nog steeds een probleem: als het bestand zich in bevindt / Home / gebruikersnaam, dan het systeem kan worden aangetast als die map beschrijfbaar is door een kwaadwillende gebruiker (of een niet-rootaanmelding die is geschonden). Ze kunnen het bestand verwijderen of hernoemen, een ander script plaatsen en uitvoeren dat script via sudo - zonder een wachtwoord. Vandaar dat het is veel veiliger om het script naar een map te brengen die alleen root kan wijzigen, bijv .: / Usr / sbin of /wortel. Anders LGTM. - NVRAM


Waarschuwing!

Uw login-wachtwoord in platte tekst, in een commando of bestand plaatsen, is uiterst onveilig en kan uw privégegevens en uw systeem in gevaar brengen. Het is sterk aanbevolen doe dit nooit, zelfs als u denkt dat uw systeem "persoonlijk" is of op een "veilige locatie" is!

Als het script alleen voor persoonlijk gebruik is en u het op een veilige plaats hebt geplaatst en u niet bang bent dat uw account wordt gestolen en dergelijke, dan is hier een eenvoudige oplossing:

echo LOGINPASSWD | sudo -S COMMAND HERE

waarbij LOGINPASSWD uw inlogwachtwoord is (voorbeeld: iloveponies) en COMMAND HIER is je commando dat komt na sudo, zoals sh -c "echo da .. enz


29
2018-06-25 13:38



@Viswa, houd er rekening mee dat dit erg gevaarlijk is om een ​​wachtwoord in platte tekst te onthullen. Je wordt sterk geadviseerd, niet om dat te doen - Anwar
-1 Als dit een goed idee lijkt, zou je veel beter af zijn, gewoon een wachtwoord instellen op je rootaccount en de z7sg-oplossing gebruiken; dat is net zo gemakkelijk, en maakt dit zeer gevaarlijke beveiligingsprobleem niet. - Bryce
Hah! Ik had 6 upvotes en 4 downvotes op mijn antwoord :) Maar waarom jongens, was ik niet duidelijk 'Persoonlijk gebruik', 'veilige plek', enz.? Er is geen beveiligingsprobleem tenzij u dit bestand weggeeft en u een ssh-server draait! Waar zie je het beveiligingsprobleem op voorwaarde dat het script voor persoonlijk gebruik en op een veilige plaats is? - hytromo
Downvoted, dit is de weg naar de donkere kant, en niet nodig met de sudo-methode. - Floyd
Oké, vertel me gewoon, zelfs als de hacker zich als een eenvoudige gebruiker voor je account heeft aangemeld, hoe kan hij het script met je wachtwoord vinden onder / usr / share / help / lv / ubuntu-help ?? - hytromo


Als je het script op een bepaald tijdstip op het hele uur (of overdag) niet erg vindt, plaats het dan in de hoofdmap van de root (/root) en voer het script uit vanuit de systeemcrontab (/etc/crontab) als root. Dan hoeft u uw veiligheid niet in gevaar te brengen.

Zien https://help.ubuntu.com/community/CronHowto voor het toevoegen van het script aan de crontab.


21
2018-06-25 13:49



Je zou waarschijnlijk willen gebruiken anacron als dat een desktop / laptop is die niet 24x7 draait - balki
Dit is een handig antwoord, bijvoorbeeld als u het script schrijft om te controleren op updates, iets met die informatie doet en de beheerder e-mailt over de benodigde updates. Persoonlijk worden veel van mijn scripts gebruikt voor serverautomatisering, dus het gebruik van sudo crontab -e is wat ik zou doen. 1 - Rab


Een ander gerelateerd leuk kenmerk van sudo dat niet genoemd is in de uitstekende antwoorden hierboven is de 'timestamp_timeout'-variabele. Het is een sudo-variabele die u kunt verhogen om te besparen op interactief wachtwoordtypen.

Voorbeeld, in / etc / sudoers (of een van de bestanden die er deel van uitmaken) kunt u de standaard wijzigen:

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

Volledige beschrijving van 'man sudoers':

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.

Dit kan natuurlijk niet helpen in het specifieke geval van het uitvoeren van het commando van cron. Maar het is een goede zaak om je bewust te zijn van.


11
2018-06-29 21:10





export MY_SUDO_PASS="user_password_here"

Om te testen of het werkt:

echo $MY_SUDO_PASS
> user_password_here

Voer "sudo apt-get update" uit en accepteer het wachtwoord van omgevingsvariabelen wat we eerder hebben gemaakt:

echo $MY_SUDO_PASS | sudo -S apt-get update

Uitvoeren van python (bijvoorbeeld het wijzigen van het directory-eigendom recursief naar gebruikersnaam_here):

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 get's password -S switch vangen en het wachtwoord doorgeven aan sudo


1
2018-03-15 16:59



Ik weet niet zeker wat dit toevoegt aan de bestaande antwoorden die door de meeste huidige BIOS-ondersteuning bij alarm worden gewekt ... - Elder Geek