Как включить запуск программы на линукс без запроса пароля
Я хочу, чтобы моя система автоматически включалась каждый день. Поэтому я использую приведенный ниже код в своем скрипте Python, но sudo каждый раз запрашиваю пароль:
Как я могу запустить этот скрипт, не sudo спрашивая пароль каждый раз?
Вы должны заглянуть в руководство по материнской плате или BIOS, чтобы увидеть, поддерживает ли оно такое поведение. Я знаю, что это уклоняется от вопроса! =] Но это может быть достаточным решением.
Обратите внимание: любой метод, который включает в себя ввод пароля для входа в виде простого текста, в команде или в файле, небезопасен и не должен использоваться!
Правильный способ сделать это для настройки так sudo , чтобы только одна конкретная команда, которая вам нужна, т.е. echo date. > rtc. разрешена для запуска БЕЗ пароля.
Шаг 1. Создайте сценарий оболочки только с этой командой
- Откройте gedit (или ваш любимый редактор) и создайте скрипт, например pydatertc.sh
- Вставьте только эту строку и сохраните ее, например, в свой домашний каталог:
- Выйдите из редактора и из терминала сделайте сценарий исполняемым и измените его владельца на root , в противном случае другой пользователь, имеющий доступ к вашей системе, может отредактировать его и выполнить любые команды, которые он хочет получить с правами root, без ввода пароля:
Шаг 2. Установите sudo, чтобы разрешить pydatertc.sh выполнение без пароля
- Введите sudo visudo в терминале, чтобы открыть sudoers файл sudo permissions ( )
- Вокруг строки 25 вы увидите эту строку: %sudo ALL=(ALL:ALL) ALL
- Ниже этой строки вставьте следующую строку, где username находится ваше имя пользователя:
- Выход из редактора ( Ctrl +, X если nano )
Шаг 3. Измените ваш скрипт на Python для вызова pydatertc.sh
Теперь ваш скрипт должен работать без пароля и без ущерба для безопасности вашей учетной записи, ваших данных или вашей системы!
Альтернатива только для wakealarm (не для общего использования!):
В этом конкретном случае только , поскольку /sys/class/rtc/rtc0/wakealarm файл управляет только будильником для системы и в противном случае безвредны, другой альтернативы , чтобы избежать пароля либо взять на себя ответственность этого файла с chown (если вы только настройки будильника пользователя) или сделайте его доступным для записи chmod +666 ; в этом случае просто удалите sudo из вашего вызова Python, оставив sh -c ". " без изменений.
Если вы новый пользователь Linux, то, наверное, уже заметили, что здесь почти для всех серьёзных настроек или операций с системой нужны права суперпользователя. Пользователям Windows такой подход тоже должен быть знаком, когда вы устанавливаете программы или меняете системные настройки, операционная система просит подтвердить выполнение программы от имени администратора.
В Linux такой возможности нет, но зато есть команда sudo, которая позволяет вам запускать программы от имени других пользователей, а также от имени суперпользователя. На сайте уже есть несколько материалов про работу с ней, но нет подробной статьи про опции самой команды и её синтаксис. Эта тема и будет раскрыта сейчас. Дальше мы рассмотрим, что представляет из себя команда sudo Linux, но начнем с её синтаксиса.
Синтаксис sudo
Синтаксис команды очень прост:
$ sudo опции программа параметры
Так вы можете выполнить абсолютно любую команду Linux. Достаточно написать перед ней команду sudo. По умолчанию sudo запускает переданную ей команду от имени суперпользователя. Если вы хотите добавить какие-либо настройки или использовать другого пользователя, нужно указывать опции.
Опции sudo
- -A или --askpass - по умолчанию sudo спрашивает пароль пользователя в терминале. Если задана эта опция, утилита попробует использовать графическую утилиту для запроса пароля.
- -b или --background - запускает переданную программу в фоновом режиме;
- -C или --close-from - опции нужно передать число больше трёх. Она позволяет закрыть для программы все файловые дескрипторы, кроме стандартного ввода и вывода;
- -E или --preserve-env - позволяет передать переменные окружения текущего пользователя выполняемой программе. Также можно передать этой опции список переменных, которые нужно разрешить;
- -e или --edit - позволяет редактировать файл вместо запуска команды. Файл копируется во временный каталог, редактируется с помощью редактора, установленного в системе по умолчанию, и если были изменения, записывается обратно с теми самыми правами;
- -g - запустить команду с указанной группой вместо группы пользователя, от имени которого запускается программа;
- -h - выполнить команду от имени другого хоста;
- -H или --set-home - установить домашний каталог;
- -i или --login - позволяет авторизоваться в консоли от имени другого пользователя. Будет выбран его домашний каталог, а также загружены все переменные окружения;
- -k - по умолчанию, sudo сохраняет пароль и некоторое время после выполнения команды, вы можете выполнить ещё раз, без ввода пароля. Эта опция отключает такую возможность;
- -l или --list - позволяет вывести список доступных команд для удалённых пользователей;
- -n или --non-interactive - не интерактивный режим, если будет необходимо ввести пароль, программа выдаст ошибку;
- -p или --prompt - использовать своё приглашение для ввода пароля;
- -r или --role - выполнить программу с контекстом SELinux, у которого есть указанная роль;
- -S - использовать стандартный поток ошибок для запроса пароля;
- -s или --shell - позволяет запустить указанный командный интерпретатор;
- -U или --User - вместе с опцией -l позволяет посмотреть привилегии для пользователя;
- -T или --timeout - позволяет установить время выполнения команды, если время истечёт раньше, чем завершится команда, то она будет завершена принудительно;
- -u - позволяет указать, от имени какого пользователя нужно выполнять программу;
- -V - выводит версию утилиты;
- -- - означает, что следующие опции обрабатывать не нужно.
Это основные опции, которые вы можете использовать. А теперь давайте перейдём к примерам использования команды.
Примеры использования sudo
1. Запуск программы
Самый частый пример использования sudo - выполнение программы от имени суперпользователя. Для этого достаточно написать sudo перед именем программы:
Если вы хотите выполнить программу не от имени root, а от имени другого пользователя, то можно использовать опцию -u, например:
sudo -u sergiy whoami
2. Переменные окружения
По умолчанию, команда sudo не передаёт запускаемой утилите переменные окружения текущего пользователя. А когда вы запускаете графическое приложение, то ему нужна переменная DISPLAY для доступа к графическому серверу. В последних версиях Ubuntu всё немного по другому, но все же эта возможность sudo актуальна. Чтобы передать переменные просто используйте опцию -E:
Без опции -E программа получает только 18 стандартных переменных, а с опцией - все доступные.
Также вы можете указать список переменных, которые нужно передать:
3. Авторизация от имени другого пользователя
С помощью sudo вы также можете авторизоваться от имени другого пользователя. Для этого используйте опцию -i:
По умолчанию вы будете авторизованы как суперпользователь. Ещё здесь можно указать пользователя, от имени которого вы хотите авторизоваться:
sudo -i -u sergiy
4. Командный интерпретатор
Если у вас в системе установлено несколько командных интерпретаторов, например, не только bash, но и zsh, то вы можете авторизоваться от имени другого пользователя и указать, какую именно оболочку вы хотите использовать. Для этого укажите опция -s:
5. Редактирование файлов
Когда вам необходимо отредактировать системный файл, вы пишите sudo vim или sudo nano. Вместо этого можно использовать опцию -e или команду sudoedit. Она открывает файл для редактирования, редактором, установленным в системе по умолчанию. Например, у меня это vim. Чтобы отредактировать /etc/group с правами суперпользователя достаточно выполнить:
sudo -e /etc/group
Утилита узнает, каким редактором нужно пользоваться из переменной окружения EDITOR.
6. Запуск в фоне
Чтобы запустить программу в фоне с помощью sudo можно использовать опцию -b. Например, запускаем OpenVPN в фоновом режиме:
sudo -b openvpn -с /путь/к/конфигурационному.файлу
7. Просмотр полномочий
Вам необязательно редактировать конфигурационный файл, чтобы понять, какие настройки для sudo разрешены, а какие нет. Для этого можно выполнить команду с опцией -l. Утилита выведет список разрешённых команд или ALL в случае, если разрешено всё:
Выводы
Теперь вы знаете, что из себя представляет команда sudo Linux. Здесь мы рассмотрели только общие примеры её использования. Если вы хотите прочитать более подробно про её настройку, смотрите статью настройка sudo в Linux.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.
Оцените статью:
Об авторе
8 комментариев
======================================================================================
-A или --askpass - по умолчанию sudo спрашивает пароль пользователя в терминале. Если задана эта опция, утилита попробует использовать графическую утилиту для запроса пароля
------------------------------------------------------------------------------------------------------------------------
~/Загрузки $ sudo -A ls
sudo: не указана программа askpass, попробуйте задать значение в SUDO_ASKPASS
Установите утилиту:
sudo apt install ssh-askpass-gnome
Добавьте переменную окружения:
echo "export SUDO_ASKPASS=/usr/bin/ssh-askpass" | tee -a ~/.bashrc
Затем перезапустите терминал.
Да это я и сам знаю. Вот только возникает вопрос, почему этих строк не в этой распрекрасной статье.
По сути операционная система состоит из ядра и огромного набора программ, которые предназначены для выполнения различных задач, обслуживания системы и удовлетворения потребностей пользователя. Почти все взаимодействие пользователя и операционной системы выполняется с помощью программ. Поэтому новичкам важно понять как запустить программу на Linux, что происходит во время запуска и какие есть способы запуска.
Дальше мы рассмотрим виды программ, их запуск программ на Linux различными способами и другие полезные для новичков вещи, опытным пользователям это все и так уже известно.
Виды программ в Linux
Перед тем, как мы перейдем к запуску программ, нужно сначала понять что представляет из себя программа. В Linux программы отличаются от других файлов только тем, что для них установлен флаг исполняемости. Я уже подробно писал об этом в статье что такое исполняемость поэтому не буду повторяться.
Все программы можно поделить на несколько типов:
- Бинарные программы - содержат инструкции процессору уже готовые к выполнению, большинство программ находятся в таком формате, они быстрые и выполняются сразу же системой;
- Программы на байт-коде - это уже не процессорные инструкции, а инструкции определенной виртуальной машины, которая может их выполнять, без виртуальной машины такие команды не могут быть выполнены. Такие программы потребляют больше ресурсов, но тоже достаточно быстрые, их преимущество в том, что они могут выполняться без изменения везде где может работать виртуальная машина. К таким программам можно отнести программы на Java.
- Скриптовые программы - эти программы состоят из набора команд в виде обычного текста, которые выполняет специальный интерпретатор. Такие программы более медленные, но зато они проще в разработке и их код можно легко и быстро изменить.
А теперь перейдем к запуску программ.
Запуск программ в терминале
Изначально в операционных системах Unix и Linux не было графического интерфейса, поэтому программы запускались командами из терминала. Сейчас это тоже возможно и достаточно активно используется опытными пользователями. Синтаксис запуска программы выглядит таким образом:
/путь/к/файлу/программы параметры
Параметры указываются только, когда они нужны, но всегда оболочка должна знать полный путь к программе. Все что после имени программы и пробела - это параметры. Вы, наверное, уже заметили, что обычно мы не указываем полный путь при выполнении программ. Это было бы очень долго и неудобно.
Разработчики придумали обходной путь. Была создана переменная PATH, в которой хранятся все пути к папкам где обычно находятся программы - /bin, /sbin, /usr/bin, /usr/sbin и так далее. Вы можете посмотреть ее содержимое командой:
И можно передать параметры после пробела:
Когда программа находится не в этих каталогах, нужно указать к ней полный путь:
Если же вы хотите запустить программу через терминал ubuntu, которая находится в текущей папке, то ситуация будет немного другой. Система выполняет только поиск по папкам из переменной PATH, в текущей директории она не ищет. Поэтому, если вы наберете имя исполняемого файла, то получите ошибку. Нужно указывать полный путь, как вы помните путь к текущей папке будет ./:
Иногда возникает необходимость передать программе, какие-либо особые переменные окружения. Например, переменная EDITOR указывает какой текстовый редактор нужно использовать по умолчанию. Вы можете указать имя переменной и ее значение перед именем команды используя синтаксис:
имя_переменной = значение команда
По умолчанию эта команда открывает настройки утилиты sudo в редакторе Vim, но с этой переменной окружения настройки откроются в редакторе nano.
Запуск программ от имени другого пользователя
Вы уже знаете как запустить программу в терминале linux, а что насчет других пользователей? В Windows достаточно часто используется запуск программ от имени администратора чтобы программа могла получить больше прав доступа в системе. В Linux для этого используется утилита sudo. Ее имя можно расшифровать как switchuserdo - изменить пользователя и выполнить. По умолчанию утилита выполняет команду от имени суперпользователя root:
sudo команда
sudo whoami
sudo -u имя_пользователя команда
sudo -u postgres whoami
Команда whoami (кто я) выводит имя текущего пользователя.
Как запустить программу в фоне
Иногда возникает необходимость запустить долго выполняющуюся программу в терминале так, чтобы она не мешала дальше работать. Для этого можно использовать запуск программы в фоновом режиме linux:
dd if=/dev/zero of=~/file count=100000 &
Система выведет PID, уникальный идентификатор программы, который вы потом можете использовать чтобы закрыть ее командой kill:
Как запустить скрипт в Linux
Мы уже говорили, что программы делятся на бинарные и интерпретируемые. Раньше мы говорили только про бинарные программы. Для запуска интерпретируемых нужен непосредственно интерпретатор, к таким программам относятся написанные на таких языках, как Java, Python, Perl, Ruby, PHP, NodeJS и многих других. Синтаксис запуска такой программы отличается:
интерпретатор /путь/к/файлу/программы параметры
Разные интерпретаторы ведут себя по разному, поэтому лучше сразу указывать полный путь к программе. Python обычно подхватывает скрипты из текущей папки без указания полного пути:
А Java программы нужно запускать так:
java -jar program.jar
Для файлов интерпретируемых программ флаг исполняемости необязательный, поскольку они передаются в виде параметра основной программе. Только Bash скрипты составляют исключение. Вы можете запустить скрипт интерпретатором:
Или же просто набрать путь к скрипту:
Оболочка сама определяет свои скрипты по флагу исполняемости и выполняет их. Если флаг исполняемости не установлен, то его стоит добавить:
sudo chmod u+x ./script.sh
Поэтому то и для большинства интерпретируемых программ созданы простые sh скрипты которыми их можно быстро запустить.
Запуск программ Linux в графическом интерфейсе
Намного удобнее запускать программы через графический интерфейс. Если консольные программы так запускать невозможно, то для всех графических утилит существуют ярлыки, которые вы можете найти в главном меню системы:
Кроме того, вы можете запустить программу из файлового менеджера, двойным кликом мышью, но тогда для нее обязательно должен быть установлен флаг исполняемости.
Точно так же работает запуск скриптов в графическом интерфейсе. Вы можете найти все ярлыки из меню в каталоге /usr/share/applications/. Любую программу можно запустить двойным щелчком отсюда. Но давайте посмотрим что находится внутри ярлыка, для этого откройте его в текстовом редакторе:
Кроме всего прочего, в строке Exec указана команда, которая выполняет запуск программы linux, когда вы делаете двойной клик на ярлыке. Вы можете взять один из существующих ярлыков и сделать на его основе свой. Здесь указано просто имя программы. Но важно заметить, что лучше указывать полный путь в таких местах, как ярлыки, скрипты, cron и так далее это уменьшит количество ошибок, поскольку вы не можете знать проверяет ли система в этом случае PATH или ищет программу только в текущем каталоге. Теперь вы знаете все о том как запустить программу на linux.
Выводы
В этой статье мы рассмотрели как запустить программу через терминал ubuntu или в других дистрибутивах Linux. Несмотря на то, что это кажется очень простой темой, тут есть свои интересные моменты, которые могут быть полезны. Но вы о них уже знаете. Если у вас остались вопросы, спрашивайте в комментариях!
Необходимо, чтобы одна программа, требующая прав рута загружалась в автозагрузке\авторизации обычным пользователем без ввода рутового пароля. Как сделать?
Спасибо за наводку, но там огромная документация, и на английском.
Вычитал пока что надо юзать visudo, но синтаксис этой штуки мягко говоря вообще не понятен
Такого файла нет
visudo - просто редактирование файла /etc/sudoers
если vim сложен,
вроде как тут редактить, но всё-равно запуск через sudo, просто не будет требовать пароля, если не так поправьте (:
можно еще chmod +s сделать из-под рута, и скрипт в будущем с рутовыми правами будет запускаться.
Причем, любым пользователем :) Не надо setuid ставить без острой на то необходимости.
Само собой, в этом-то и фишка. Насчет острой необходимости спорный вопрос. Если ты заапрувил скрипт, подумал, то чего боятся. А если его подредактировать кому угодно, то s бит сбрасывается и рутовых прав не видать. Заново апрувить, думать, а можно ли такое из-под рута исполнять.
ReckouNT> Такого файла нет
Поддерфиваю rc.local. Не надо изобретать велосипедов, когда для такой цели есть специально придуманные средства.
Все можно настроить через файл /etc/sudoers . Вот способ как можно перезапускать все службы ( sudo service . ) от пользователя userlogin .
1. Создаем специальную группу для запуска, которой дадим необходимые права:
2. Добавляем пользователя userlogin в эту группу:
3. Редактируем файл /etc/sudoers с помощью visudo :
Необходимо ставить в конце следующее:
/usr/sbin/service - путь к программе необходимо указывать абсолютный. В вашем случае это будет путь к вашему скрипту. Я использую служебную команду service
4. Проверяем
Заходим под пользователем userlogin и выполняем
Сервис перезапустится без ввода пароля.
Я согласен с ответом Total Pusher, но сам обычно использую более простой и универсальный способ:
Запускаю sudo visudo
Добавляю в конец username ALL=(ALL) NOPASSWD: ALL (укажите свой username)
Разница в том, что никаких особых групп и пользователей я не создаю и в результате можно запускать любые скрипты и команды без пароля (мне достаточно того, что юзер вводит пароль при запуске сессии).
UPD: Как метко подметил andreymal, этот способ создаёт дыру в безопасности системы и использовать его на постоянной основе не рекомендуется.
Пользователь скачивает сторонний скрипт, запускает без sudo, но внутри у него прописан sudo, который без пароля уничтожает систему.
Пользователь пользуется уязвимой версией ghostscript и скачивает картинку с котиками, которая с помощью беспарольного sudo опять же уничтожает систему автоматически сразу после скачивания файла (даже открывать его необязательно).
@andreymal а я все мечтаю о "виндовом" который спросит "virt-manager хочет права. Дать? да-нет". а так приходиться свой "оченьдлинныйисложныйпароль" вводить по несколько раз в час
Настраиваем доступ по ssh. Сначала генерируем ключ :
без пароля ключа.
Оставляем секретный ключ юзера себе. ( ~/.ssh/id_rsa )
Регистрируем публичный ключ root-у.
Рисуем нужный скрипт ( root-пользователем ) и удалённо запускаем :
Если скрипт только написали, тогда копируйте сначала :
Если только на локальном компе это надо сделать, то вместо адреса рисуйте localhost. Если вы не меняли стандартный ssh порт 22 на 12345 , то опцию задания порта можно опустить.
Читайте также: