На самом деле делалось не для совсем сервера, но тем не менее. Стоит, в общем, на одном заводике в одной из стран СНГ аппарат по переработке пластиковых отходов в пластиковые полезности, управляет им комп с 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 [Копия]
Pingback: Простой способ мониторинга состояния сервера. | Персональный блог Толика Панкова