Вопрос Как я могу использовать команду в скрипте без запроса пароля?


Я хочу автоматически менять свою систему каждый день. Поэтому я использую приведенный ниже код в своем сценарии Python, но sudo каждый раз спрашивает пароль:

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

Как запустить этот скрипт без sudo спрашивая пароль каждый раз?


101
2018-06-25 13:30


происхождения


Вы должны посмотреть в руководстве вашей материнской платы или в BIOS, чтобы узнать, поддерживает ли оно это поведение. Я знаю, что это уклоняется от вопроса! =] Но это может быть достаточным решением. - Alex Hirzel


ответы:


Пожалуйста, обратите внимание: Любой метод, который включает в себя ввод пароля входа в обычный текст, в команде или в файле, небезопасен и НЕ должен использоваться!

Правильный способ сделать это, чтобы настроить sudo такой, что только вам нужна одна конкретная команда, т. е. echo date... > rtc..., разрешено работать БЕЗ пароля.

Шаг 1. Создайте сценарий оболочки только с этой командой

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

Шаг 2. Настройте sudo, чтобы разрешить pydatertc.sh выполнять, не требуя пароля

  • Тип sudo visudo на терминале, чтобы открыть права sudo (sudoers) файл
  • Вокруг строки 25 вы увидите эту строку: %sudo ALL=(ALL:ALL) ALL
  • Ниже этой строки, вставьте следующую строку, где username Ваше имя пользователя:
    имя пользователя ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Выйдите из редактора (Ctrl+Икс если нано)

Шаг 3. Измените скрипт python для вызова pydatertc.sh

  • Измените строку так:
    os.system ('sudo /home/username/pydatertc.sh')

Теперь ваш скрипт должен работать без запроса пароля А ТАКЖЕ без ущерба для безопасности вашей учетной записи, ваших данных или вашей системы!


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

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


138
2018-06-25 14:53



Удивительно, это правильный способ сделать это. - roadmr
Такой подробный, полезный ответ и точно, как это должно быть сделано. - ArtOfCode
@RobertRosati, большое спасибо за ваше предложенное редактирование - я не должен был забывать об этом в первую очередь! - ish
@ m-ric Вы прочитали команду над этими строками? «в противном случае другой пользователь, имеющий доступ к вашей системе, мог бы отредактировать его и выполнить любые команды, которые они хотят, как root, не требуя вашего пароля» - Tobias Kienzler
Я понимаю, что этот ответ старый - но проблема все еще здесь: если файл находится в / Главная / имя пользователя, тогда система может быть скомпрометирована, если этот каталог доступен для записи злоумышленником (или взломанным без корневого входа), Они могут удалить или переименовать файл, поставить другой скрипт на свое место и запустить что скрипт через sudo - без пароля. Следовательно, это гораздо безопаснее поставить скрипт в каталог, который может изменять только корень, например: / USR / SBIN или / корень, В противном случае это LGTM. - NVRAM


Предупреждение!

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

Если сценарий предназначен только для личного использования, и вы поместили его в безопасное место, и вы не боитесь, что украденная вами учетная запись и т. Д., То вот простое решение:

echo LOGINPASSWD | sudo -S COMMAND HERE

где LOGINPASSWD - ваш пароль для входа (пример: ilovepies) и COMMAND ЗДЕСЬ - это ваша команда, которая появляется после sudo, например sh -c "echo da .. и т. д.


29
2018-06-25 13:38



@Viswa, Пожалуйста, обратите внимание, что очень просто открыть пароль в текстовом виде. Вам настоятельно рекомендуется не делать этого - Anwar
-1 Если это кажется хорошей идеей, вам будет лучше, просто установите пароль в своей учетной записи root и используйте решение z7sg; это так же просто и не создает этой очень опасной проблемы безопасности. - Bryce
Хах! У меня было 6 upvotes и 4 downvotes на мой ответ :) Но почему ребята, я не понял, что «личное использование», «безопасное место» и т. Д.? Нет проблемы с безопасностью, если вы не предоставите этот файл, и у вас запущен сервер ssh! Где вы видите проблему безопасности при условии, что сценарий предназначен для личного использования и в безопасном месте? - hytromo
Вниз, это дорога на темную сторону и не нужна с помощью метода sudo. - Floyd
Хорошо, просто скажите мне, даже если хакер зарегистрировался как простой пользователь вашей учетной записи, как он найдет скрипт с вашим паролем в / usr / share / help / lv / ubuntu-help? - hytromo


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

Видеть https://help.ubuntu.com/community/CronHowto как добавить скрипт в crontab.


21
2018-06-25 13:49



Возможно, вы захотите использовать anacron если это настольный компьютер / ноутбук, который не работает 24x7 - balki
Это полезный ответ, например, если вы пишете скрипт для проверки обновлений, сделайте что-нибудь с этой информацией и напишите администратору о необходимых обновлениях. Лично многие из моих сценариев используются для автоматизации сервера, поэтому просто использование sudo crontab -e - это то, что я хотел бы сделать. +1 - Rab


Другая связанная с этим хорошая функция sudo, о которой не упоминалось в превосходных ответах выше, - это переменная timestamp_timeout. Это переменная sudo, которую вы можете увеличить для сохранения при интерактивном вводе пароля.

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

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

Полное описание от '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.

Конечно, это не может помочь в конкретном случае запуска команды из cron. Но это хорошо, что нужно знать.


11
2018-06-29 21:10





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 (например, рекурсивное изменение права собственности каталога на username_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, перехватывающий его и передающий пароль sudo


1
2018-03-15 16:59



Я не уверен, что это добавляет к существующим ответам на самую последнюю поддержку поддержки BIOS при тревоге ... - Elder Geek