Як я подаю команду в сценарії, не вимагаючи пароля?


107

Я хочу щодня включати свою систему автоматично. Тому я використовую наведений нижче код у своєму скрипті Python, але sudoзапитує мене пароль щоразу:

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

Як я можу запустити цей скрипт, не sudoзапитуючи пароль щоразу?


4
Ви повинні подивитися в посібнику з материнської плати або BIOS, щоб перевірити, чи підтримує він таку поведінку. Я знаю, що це ухиляється від питання! =] Але це може бути достатнім рішенням.
Алекс Гірзель

Відповіді:


149

Зверніть увагу: будь-який метод, який передбачає введення пароля для входу в звичайний текст, команду чи файл, є незахищеним і його НЕ слід використовувати!

Правильний спосіб зробити це sudoтак, щоб тільки одна конкретна команда, яка вам потрібна, тобто echo date... > rtc...дозволяла виконувати БЕЗ необхідності пароля.

Крок 1. Створіть скрипт оболонки саме за допомогою цієї команди

  • Відкрийте gedit(або ваш улюблений редактор) та створіть сценарій, наприкладpydatertc.sh
  • Вставте лише цей рядок і збережіть його, наприклад, у домашній каталог:
    ехо-дата \ '+% s \' -d \ '+ 24 години \'> / sys / class / rtc / rtc0 / wakealarm
  • Закрийте редактор і з терміналу зробіть скрипт виконуваним і змініть його право власності на root , інакше інший користувач, що має доступ до вашої системи, може, можливо, редагувати його та виконувати всі команди, які вони хочуть як root, не потребуючи вашого пароля:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Крок 2. Налаштуйте sudo, щоб дозволити pydatertc.shйого виконувати, не вимагаючи пароля

  • Введіть sudo visudoу терміналі, щоб відкрити sudoersфайл дозволів sudo ( )
  • Приблизно в рядку 25 ви побачите цей рядок: %sudo ALL=(ALL:ALL) ALL
  • Під цим рядком вставте наступний рядок, де usernameваше ім’я користувача:
    ім'я користувача ALL = (ВСЕ) NOPASSWD: /home/username/pydatertc.sh
  • Вийдіть із редактора ( Ctrl+ Xякщо нано )

Крок 3. Змініть сценарій python для виклику pydatertc.sh

  • Змініть рядок на:
    os.system ('sudo /home/username/pydatertc.sh')

Тепер ваш сценарій повинен працювати без необхідності пароля ТА без шкоди для безпеки вашого акаунта, ваших даних або вашої системи!


Альтернатива лише wakealarm(не для загального використання!):

Тільки в цьому конкретному випадку , оскільки /sys/class/rtc/rtc0/wakealarmфайл лише керує сигналом пробудження для системи і в іншому випадку є нешкідливим, інша альтернатива уникнути пароля - або взяти право власності на цей файл chown(якщо ви єдиний користувач, який встановлює сигнал тривоги) або зробити його всесвітнім для запису chmod +666; у такому випадку просто видаліть sudoз виклику Python, залишивши sh -c "...."недоторканим.


1
Дивовижно, це правильний спосіб зробити це.
roadmr

1
Така добре детальна, корисна відповідь і як саме це слід робити.
ArtOfCode

@RobertRosati, велике спасибі за запропоновану редакцію - я не повинен був забувати це в першу чергу!
Останній

1
@ m-ric Ви читали команду над цими рядками? "в іншому випадку інший користувач, що має доступ до вашої системи, може, можливо, редагувати його і виконувати всі команди, які вони хочуть як root, не потребуючи вашого пароля"
Tobias Kienzler

2
Я усвідомлюю, що ця відповідь стара - але тут все ще виникає проблема: якщо файл знаходиться в / home / username , то система може бути порушена, якщо цей каталог записується зловмисним користувачем (або не-кореневим входом, тобто компрометований) . Вони могли видалити або перейменувати файл, поставити на його місце інший скрипт і запустити цей сценарій через sudo- без пароля. Отже, набагато безпечніше розміщувати скрипт у каталозі, який може змінювати лише root, наприклад: / usr / sbin або / root . В іншому випадку це LGTM.
NVRAM

30

Увага!

Введення пароля для входу у звичайний текст, у команді чи файлі є надзвичайно небезпечним та може поставити під загрозу ваші приватні дані та вашу систему. Він настійно рекомендується не робити цього , навіть якщо ви вважаєте , що ваша система «особистий» або в «безпечному місці»!

Якщо сценарій призначений лише для особистого користування, і ви розмістили його в безпечному місці, і ви не боїтеся, що ваш рахунок буде вкрадений і таке, то ось просте рішення:

echo LOGINPASSWD | sudo -S COMMAND HERE

де LOGINPASSWD - ваш пароль для входу (приклад: iloveponies), а КОМАНДА ТУТ - ваша команда, що надходить після sudo, наприклад, sh -c "echo da .. тощо


13
@Viswa, Зверніть увагу, що виявити пароль у простому тексті дуже небезпечно. Вам дуже рекомендують цього не робити
Анвар

3
-1 Якщо це здається гарною ідеєю, вам буде набагато краще просто встановити пароль у вашому кореневому обліковому записі та використовувати рішення z7sg; це так само просто і не створює цієї дуже небезпечної проблеми безпеки.
Брайс

4
Га! На мою відповідь було 6 обновлених і 4 анкети :) Але чому хлопці, я не зрозумів «Особисте користування», «Безпечне місце» тощо? Проблеми із безпекою не виникають, якщо ви не видаєте цей файл і не запущено ssh-сервер! Де ви бачите проблему безпеки, якщо сценарій призначений для особистого використання та в безпечному місці?
hytromo

5
Це неприхильний спосіб - це Дорога в темну сторону, і не потрібна методом судо.
Флойд

4
Гаразд, просто скажіть мені, навіть якщо хакер увійшов до вашого облікового запису як простий користувач, то, як чорт, він знайде сценарій із вашим паролем під / usr / share / help / lv / ubuntu-help ??
hytromo

21

Якщо ви не заперечуєте, щоб сценарій працював у певний час години (або протягом дня), покладіть його в домашній каталог root ( /root) і запустіть сценарій із системи crontab ( /etc/crontab) як root. Тоді вам не доведеться порушувати свою безпеку.

Див. Https://help.ubuntu.com/community/CronHowto про те, як додати скрипт до crontab.


4
Можливо, ви, можливо, захочете користуватися, anacronякщо це настільний / ноутбук, який не працює 24x7
balki

Це корисна відповідь, наприклад, якщо ви пишете сценарій, щоб перевірити наявність оновлень, зробіть щось із цією інформацією та надішліть електронний лист адміністратору про необхідні оновлення. Особисто багато моїх сценаріїв використовуються для автоматизації сервера, тому я просто прагну використовувати судо crontab -e. +1
Раб

11

Ще одна пов'язана приємна особливість sudo, про яку не згадувалося в чудових відповідях вище, є змінна 'timetamp_timeout'. Це змінна версія sudo, яку ви можете збільшити, щоб заощадити під час інтерактивного введення пароля.

Наприклад, у / etc / sudoers (або один із файлів, що входять до нього) ви можете змінити типовий:

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

Повний опис від 'man sudoers':

timetamp_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.

Звичайно, це не може допомогти в конкретному випадку запуску команди з cron. Але добре це знати.


0
export MY_SUDO_PASS="user_password_here"

Щоб перевірити, чи працює він:

echo $MY_SUDO_PASS
> user_password_here

Запустити "sudo apt-get update" та прийняти пароль із змінних оточення, що ми створили раніше:

echo $MY_SUDO_PASS | sudo -S apt-get update

Запустити з python (наприклад, зміна права власності на каталог рекурсивно на ім'я_користувача):

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 отримати пароль -S перемикач його лову і передача пароля в sudo


Я не впевнений, що це додає до існуючих відповідей на найактуальнішу підтримку BIOS, прокидаючись на тривогу ...
Старійшина Geek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.