Безопасная передача пароля root в скрипте оболочки

Безопасная передача пароля root в скрипте оболочки

Я всегда загружаю свой ноутбук 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)

Связанный контент