Предварительно санкционируйте sudo? (Так что это можно запустить позже)

Я часто устанавливаю, чтобы мой рабочий компьютер выполнял некоторые трудоемкие вычисления, прежде чем я вернусь домой вечером. После того, как все будет готово, я хочу, чтобы он закрылся. Однако, поскольку выключение требует привилегий root, оно должно выполняться с использованием sudo . Очевидно, что я не могу ввести свой пароль через 7 часов, так что до сих пор мне пришлось выполнить весь список команд (cmd1; cmd2; cmd3; … shutdown) как root – не идеально.

Есть ли способ, который я могу «предварительно авторизовать» sudo в конце списка команд? Как-то я могу полностью использовать свой пароль в начале выполнения, поэтому bash мне не нужен позже?

Благодаря!

Чтобы завершить первый ответ:

Настройте способ, которым ваши невыгодные трудоемкие вычисления могут инициировать выключение, ожидающее в привилегированной оболочке (запущенной sudo -s или sudo su ). Использование файла в качестве флага – хороший, простой способ сделать это. Итак, в вашей непривилегированной оболочке выполните

 cmd1; cmd2; cmd3; > ok_to_shutdown_now 

И в вашей привилегированной оболочке запустите скрипт, который говорит:

 while [ ! -f ok_to_shutdown_now ] do sleep 60 done shutdown 

У вас есть довольно много вариантов, чтобы достичь своей цели, в зависимости от того, что вы готовы рисковать. Не все из них связаны с кэшированием ваших учетных записей sudo.

Вы можете отключить необходимый пароль для своего пользователя или для вашего пользователя, выполняющего shutdown , добавив строку с тегом NOPASSWD в ваш файл sudoers.

Вы можете аутентифицироваться в sudo, запустив sudo -v . Ваш пароль будет кэширован в течение 15 минут, поэтому вам нужно будет запустить sudo -v все, скажем, 12 минут, чтобы обновить ваши учетные данные и убить эту задачу после завершения последнего пакетного процесса.

Если вы знаете, как долго проходят ваши пакетные процессы, вы можете просто отключить время, после которого он должен отключить систему.

Вы можете увеличить 15-минутный тайм-аут кеша паролей по умолчанию с параметром timestamp_timeout в файле sudoers. Либо произвольно, либо, если вы знаете, как долго обрабатываются партии, к тому времени. Или вы можете полностью отключить таймаут с отрицательным значением и использовать sudo -v для аутентификации и sudo -k «выйти из sudo», когда вы закончите. Между этими двумя вызовами вы можете запустить sudo не вводя пароль снова.

Если вы не в порядке, не требуя пароля для sudo, но вместо этого сохраните свой пароль в текстовом файле, который может быть прочитан только вашим пользователем, тогда вы можете создать небольшой пакетный скрипт, который выводит ваш пароль на стандартный вывод, и либо использовать это как пропустить Программу для sudo или просто использовать ее в трубе с sudo -S , которая считывает пароль из stdin . В сочетании с небольшим скриптом вы можете сохранить свой пароль в текстовом файле в начале, из которого он считывается скриптом, предоставляя его sudo и в конце удаляет этот файл снова.

Эхо-скрипт

 #!/bin/bash echo mypassword 

или

 #!/bin/bash cat /mysecretpwfile 

И затем ./echopw | sudo -S ./echopw | sudo -S или

 export ASKPASS=~/echopw sudo -A shutdown -h now 

Или, наконец, вы можете просто поместить команду shutdown в сценарий оболочки и установить сценарий оболочки suid, root root, вашу группу, 750.

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

Вы можете использовать

  sudo -s 

или

  sudo su 

(Читайте здесь разницу)

Это даст вам привилегии root и не позволит вам снова ввести свой пароль. Затем вы можете запускать команды sudo после этого, и они не будут запрашивать пароль.

ты мог

 sudo sh -c 'cmd1; cmd2; cmd3;... shutdown' 

Или предоставить привилегии для пользователя sudo shutdown без пароля. Для примера есть пример: выключение без корня

Самое простое решение – это, вероятно, сохранение пароля в переменной, а затем его передача из этой переменной в sudo -S .

 #!/bin/bash echo "Please enter your password:" read -s mypasswd #additional stuff echo $mypasswd | sudo -S shutdown -h now 
  • Открытие оболочки Explorer с правами администратора на XP (с установленным IE7)
  • Почему sudo -n на Mac OS X всегда возвращает 0?
  • Как работает трюк vim «write with sudo»?
  • Используйте пример JSch sudo и Channel.setPty для запуска команды sudo на удаленном хосте
  • Судо против корня; Любые фактические различия?
  • Ошибка: XDG_RUNTIME_DIR не установлен в среде. Gtk-WARNING **: невозможно открыть дисплей:
  • В чем разница между командами «su -s» и «sudo-s»?
  • Как использовать NSTask как root?
  • как запустить две команды в sudo?
  • Sudo - есть ли команда, чтобы проверить, есть ли у меня sudo и / или сколько осталось времени?
  • Как проверить, есть ли у меня доступ к Sudo?
  • Interesting Posts

    Как я могу программно создавать, читать, писать excel без установки офиса?

    Не удалось установить VIrtualbox, `" Определить KERN_DIR = <каталог> "` – установить Virtual Box в Debian?

    initializer_list и вывод типа шаблона

    Преобразование изображения в PDF в Android

    Что такое опция -fPIE для независимых по позиции исполняемых файлов в gcc и ld?

    @ViewScoped вызывает @PostConstruct при каждом запросе обратной передачи

    Получите mac tar, чтобы прекратить ставить ._ * имена файлов в архивах tar

    Как сделать удаленный вызов REST внутри Node.js? любой CURL?

    Почему нулевой литой?

    Java ServiceLoader с несколькими загрузчиками classов

    Туннелирование FTP-соединения из дома, где сервер принимает только локальные IP-адреса

    Как обернуть строки в Notepad ++ после N символов?

    Почему в Java не кэшируются целые элементы?

    Как немедленно закрыть консольное приложение C ++?

    Может ли «git pull -all» обновить все мои локальные ветви?

    Давайте будем гением компьютера.