SSH подключение по ключу к тонким клиентам Thinstation

Решило как-то начальство, что на выходные и праздники, а так же на ночь, все компьютеры, кроме критичных, должны быть выключены. Как обычно - кто то забудет это сделать.  Для тонких клиентов есть два решения - поднять TSmon или подключится по ssh и дать команду на отключение. 

По большому счёту сам процесс не сложный - добавляем в сборку пакет sshd, задаём пароль для root в файле build.conf параметром param rootpasswd, билдим, загружаем, когда надо логинимся по ssh на клиенте и выключаем, но интереснее разослать всем нужным клиентам сигнал на выключение одной командой, без лишних телодвижений.
Почему не telnet - потому что по ssh проще сделать автологин, без костылей типа perl и expect.
Далее описан способ реализации.

Создаём ключи для авторизации (возможно они у вас уже есть в папке ~/.ssh и используются для других целей, тогда генерировать новый не нужно, просто
cat id_rsa.pub > authorized_keys) командой:

ssh-keygen -t rsa; ssh-add; cd ~/.ssh; cat id_rsa.pub > authorized_keys

Прога спросит путь для ключей, задать и подтвердить пароль на приватный ключ, нам оно не надо, жмем просто Enter.
После выполнения в папке ~/.ssh у нас появятся три файла: id_rsa - приватный ключ, id_rsa.pub - публичный ключ и ключ authorized_keys. Просто переносим authorized_keys в папку конструктора packages/sshd/etc/skel/.ssh, установите права 0700 на папку .ssh и 0600 на файл authorized_keys, собираем образ и после загрузки клиента можем логиниться на клиенте без пароля.

Если нужно логиниться на клиенте с разных машин или под из под разных пользователей, то генерируем под каждого пользователя ключи, добавляем их в ssh агента командой ssh-add и копируем содержимое получившихся id_rsa.pub в один authorized_keys.

Теперь у нас есть возможность выключать, посылать сообщения и даже управлять клиентами с помощью скриптов по ssh.

Чуть не забыл, при первом подключении к клиенту ssh спрашивает "Are you sure you want to continue connecting (yes/no)?", заставим молчать, добавив опцию -oStrictHostKeyChecking=no, в команду ssh или создаём в папке ~/.ssh файл config и пишем в него: StrictHostKeyChecking=no.

Ну и для примера - выключить клиента по сети:
ssh Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. shutdown -h now

послать сообщение, поверх всех окон, в любой вариант сессии (нужно добавить в build.conf пакет notification-daemon):
ssh Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. DISPLAY=:0 notify-send --expire-time=0 -u critical 'Внимание!!!' '"Проверка связи\nПроверка связи\nПроверка связи\nПроверка связи"'

Получить IP компьютеров с открытым ssh портом можно например вот таким хитрым способом, отправив выхлоп nmap через конвеер, скорее всего вам придётся править под себя, (не читать строки содержащие слова MAC,STATE,Nmap | удалить переносы строк | заменить "Interesting ports on " на перенос строки | вывести строки содержащие слово "open" | вывести первый столбец, разделитель ":" | не выводить не нужные IP) в файл IP.txt:
( HTML ломает некоторые знаки. Для точного копирования команд справа от листинга есть кнопка <>)

nmap 192.168.111.0/24 -P0 -p22 -n  --version-intensity 0 | grep -v '\(MAC\|STATE\|Nmap\)' | tr -d '\r\n' | sed "s/Interesting ports on /\n/g" | grep "open" | cut -f 1 -d : -s | grep -v '\(192.168.111.254\|192.168.111.111\|192.168.111.100\)' > IP.txt

Под Windows используем для аналогичного применения Putty, с помощью утилиты PuTTYgen из приватного ключа id_rsa генерируем пару ключей в "путтином" формате и используем по назначению.
Получить список машин можно в командной строке, ввести net view > IP.txtnmap тоже существует, но вот как получить только IP я не знаю.

Обсудить на форуме (комментариев 2).