Я всегда загружаю свой ноутбук GNU/Linux в консольном режиме. Но иногда мне нужно вызвать режим GUI. Он всегда требует ввода пароля root. Поэтому я написал следующий скрипт "gogui.sh" и вставил его в /usr/bin
:
#!/bin/bash
echo "mypassword" | sudo service lightdm start
Это действительно глупая идея, ведь если кто-то прочитает файл, то он легко сможет увидеть мой пароль.
Есть ли альтернатива этому?
решение1
Передача пароля sudo в скрипте совершенно бессмысленна. Вместо этого добавьте правило sudoдобавление конкретной команды, которую вы хотите запустить с NOPASSWD
тегом. Обратите внимание, что NOPASSWD
правило, относящееся к конкретной команде, должно следовать за любым общим правилом.
saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start
Но это, вероятно, бесполезно в любом случае. lightdm start
запускает приглашение на вход, но вам это нужно только если вы хотите, чтобы другие пользователи входили в систему графически. Вам это не нужно, если все, что вам нужно, это начать сеанс GUI. Вместо этого вызовитеstartx
для запуска сеанса GUI из сеанса текстового режима. Для этого не требуется никаких дополнительных привилегий.
Возможно, вам придется явно указать свой оконный менеджер или среду рабочего стола, поскольку они startx
могут не выбрать тот же тип сеанса по умолчанию, который использует lightdm.
startx -- gnome-session
решение2
Есть несколько вариантов, и один из них — добавить определенную команду с использованием visudo
флага NOPASSWD:
%wheel ALL=(ALL) NOPASSWD: /path/to/myscript
cat /path/to/myscript
#!/bin/bash
service lightdm start
решение3
РЕДАКТИРОВАТЬ
Только что заметил в своих комментариях, что вы упомянули Unity, так что, похоже, вы используете Ubuntu. Мой первоначальный ответ был направлен наSysVinitсистемы, но команды типаtelinit
все еще существует для совместимости и будет работать на дистрибутивах, использующихСистемныйилиВыскочка.
SysV способ
telinit 5
В современных системах Systemdtelinit
перенаправлен наsystemctl
.
Системный способ
systemctl isolate runlevel5.target
или
systemctl isolate graphical.target
Оригинальный ответ:
В старых дистрибутивах, не поддерживающих Systemd (например, RHEL/CentOS 6 и старше), самый простой способ переключиться из консольного режима в графический интерфейс — это использоватьtelinit
команда. Например, в дистрибутивах RHEL/Centos многопользовательский текстовый режим имеет уровень запуска 3, а многопользовательский режим GUI — уровень запуска 5. Переключение из консольного в графический режим будет выполняться следующим образом: По умолчанию telinit
требуются привилегии root. Чтобы запустить это как обычный пользователь без пароля, вам понадобится запись sudoers
или установить флаг setuid для исполняемого файла telinit. Этот sudo
метод является предпочтительным подходом, поскольку его можно ограничить только вашей учетной записью.
решение4
Поскольку вы конкретно имеете в виду sudo
, придерживайтесьответ Жиля. Однако, поскольку заголовок вашего вопроса был всего лишь о получении пароля к программе, stdin
и у меня недавно была похожая ситуация:
echo $(read -sp "Password: " password; echo $password) | yourcommand
Наверное, меня за это будут ругать, но это сработало.
Говоря о bash
, там вы, вероятно, также можете использовать
yourcommand <$(read -sp "Password: " password; echo $password)