На самом деле делалось не для совсем сервера, но тем не менее. Стоит, в общем, на одном заводике в одной из стран СНГ аппарат по переработке пластиковых отходов в пластиковые полезности, управляет им комп с Linux на борту, а компом из будочки рядом управляет оператор с рабочего места с обыкновенной виндой. Комп с Линуксом надо иногда перезагружать, отключать, а в штатном ПО аппарата эту возможность почему-то не встроили. Раньше оператором был довольно умный парень, которому и root-пароль можно было доверить, и ssh, но он уволился, напоследок создав два батника примерно такого содержания:plink -ssh -P 22 -l root -pw rutoviiparol 192.168.0.40 reboot
plink -ssh -P 22 -l root -pw rutoviiparol 192.168.0.40 poweroff
Бардак сущий, под root ходить для перезагрузки никуда не годится, да еще и хранить рутовый пароль в открытом виде. Можно, конечно, было бы подправить батник, сделав вход под юзерской учеткой, но sudo
было криво настроено и все равно оператору бы пришлось для перезагрузки вводить пароль.
Завести на сервере отдельных пользователей "для отключения" и "для перезагрузки" и настроить все так, чтобы при входе этих пользователей по ssh автоматически выполнялось выключение или перезагрузка, при этом не требовался ввод пароля, создать соответствующие bat-файлы на операторском рабочем месте.
Первым делом понадобится группа для этих пользователей. Самая простая операция. Назовем группу, например
powermanager
и создадим ее (естественно, здесь и далее все команды, требующие root-доступа делаются из-под учетки root или через sudo
).groupadd powermanager
В файле
/etc/sudoers
как раз и описывается, какие пользователи и группы имеют возможность пользоваться утилитой sudo
, временно повышая свои права до root, и какие команды им разрешено выполнять без пароля.Этот файл руками лучше не редактировать, а всегда делать это с помощью команды
visudo
:Файл настроек /etc/sudoers всегда следует редактировать с помощью команды visudo. visudo блокирует файл sudoers, сохраняет изменения во временный файл и проверяет, что файл грамматически корректен, перед тем как скопировать его в /etc/sudoers.
Важно:
Крайне важно, чтобы файл sudoers был без синтаксических ошибок! Любая ошибка делает sudo неработоспособным. Всегда редактируйте его только с помощью visudo для предотвращения ошибок. [1]
Но есть небольшая проблема,
visudo,
в качестве вызываемого ей редактора, использует неудобный vi
, который без стакана и длительной практики может только "пищать и портить". Слава Ктулху, на компьютере стоял mc
, и, соответственно, mcedit
, поэтому:1. Переопределение редактора для
visudo
при однократном запуске:EDITOR=mcedit visudo
Уфф,
/etc/sudoers
открылся в человеческом mcedit
.2. Постоянная замена редактора для
visudo
Для этого добавляем в
sudoers
следующие строки:Defaults env_reset
Defaults editor=/usr/bin/mcedit, !env_editor
где
editor=/usr/bin/mcedit
указание, какой редактор использовать!env_editor
- запрет использования редактора, установленного переменными окружения (подробности смотрите по ссылке на детальное описание файла sudoers
в конце заметки).Для разрешения пользоваться командой
shutdown
без ввода пароля для пользователей группы powermanager
, в sudoers
следует добавить следующую конструкцию:%powermanager ALL=NOPASSWD: /sbin/shutdown
Внимание! Для более полного понимания
sudoers
настоятельно рекомендую ознакомиться со статьей по ссылке в конце заметки!Внимание! Все пути в файле
sudoers
должны быть полнымиПример файла
sudoers
можно посмотреть здесь.Создание пользователя для удаленной перезагрузки.
1. Создаем пользователя:
useradd -g powermanager -d /home/rebootusr -s /home/rebootusr/reboot.sh rebootusr
где:
-g powermanager
группа пользователя (ранее созданная powermanager
)-d /home/rebootusr
домашний каталог пользователя-s /home/rebootusr/reboot.sh
- оболочка для пользователя. Обычно здесь прописывается /bin/sh, /bin/bash
для интерактивных пользователей, или /bin/false
для неинтерактивных, например пользователя FTP, но можно задать и собственный скрипт, команды которого будут выполнены при входе пользователя в систему.2. Задаем пользователю пароль (иначе не сможем залогиниться по ssh):
passwd rebootusr
3. Создаем домашний каталог:
mkdir /home/rebootusr
4. Меняем владельца каталога на пользователя
rebootusr
chown rebootusr:powermanager /home/rebootusr
5. Меняем права доступа на каталог:
chmod 500 /home/rebootusr
6. Создаем в домашнем каталоге скрипт
reboot.sh
со следующим содержимым:#!/bin/sh
echo "Rebooting..."
sudo /sbin/shutdown -r now
где
-r
- указание программе shutdown
выполнить перезагрузкуnow
- указание временного интервала - немедленно (можно еще выставить число в минутах, тогда перезагрузка произойдет через указанное время)7. Меняем владельца и права доступа для скрипта
reboot.sh
chown rebootusr:powermanager /home/rebootusr/reboot.sh
chmod 500 /home/rebootusr/reboot.sh
Аналогично создаем пользователя для выключения, меняя только имя, пароль, домашний каталог, название скрипта и команды в скрипте.
Содержимое скрипта для отключения питания
poweroff.sh
:#!/bin/sh
echo "Power off"
sudo /sbin/shutdown -hP now
Для Windows понадобится утилита
plink
, обычно она идет вместе с ssh-клиентом PuTTY. В каталоге с ней создаем два bat-файла следующего содержания.rebootsrv.bat:
plink -ssh -P 22 -l rebootusr -pw rebootpass 192.168.0.40
pwroffsrv.bat:
plink -ssh -P 22 -l pwroffusr -pw pwroffpass 192.168.0.40
где вместо
rebootusr
и pwroffusr
надо подставить имена пользователей для удаленной перезагрузки и отключения питания соответственно, вместо rebootpass
и pwroffpass
- заданные пароли, а вместо 192.168.0.40
настоящий адрес удаленного компьютера.1.
sudo
[Копия]2. Как перезагрузить компьютер без прав root [Копия]
Заметка в PDF
Это репост заметки из моего блога на сайте http://tolik-punkoff.com
Оригинал заметки находится здесь: http://tolik-punkoff.com/2017/01/11/udal