MSYS2 Minimal SYStem Пришло время разобраться с ещё одним способом развернуть на Шindows машине linux окружение, а именно реализовать ssh сервер для консольного доступа. Хотя по сути получается почти полноценное окружение linux без графического интерфейса, можно ставить и использовать почти любой консольный софт.
MSYS2 или CygWin?
* как установить cygwin я подробно описывал ранее в записи от 2019-04-11-1102
MSYS2 - это форк Cygwin, поэтому, если не испугает ручная установка ssh, то вопрос вообще не стоит.
Сравнительная таблица:
| Cygwin
| MSYS2
| установка ПО
| Нужно отдельно запускать графический инсталятор cygwin
| Ввести в консоли: pacman -S progname
| Настройка ssh
| Просто запустить скрипт ssh-host-config и следовать инструкциям
| скрипт есть на github, но из-за ошибки мне пришлось всё делать вручную.
| Плюсы
| Проще настроить демона ssh.
| Основан на Arch Linux, консольный пакетный менеджер в базе, доступ к AUR репозиториям - есть почти всё!
| Минусы
| Нет консольного пакетного менеджера, ограниченный выбор софта в графическом и неудобность его использования.
| Сложность ручной настройки sshd
|
Теперь, если вы решились, скачиваем дистрибутив и приступаем к установке. Она элементарна - далее-далее, готово!
Ещё проще, чем Cygwin. Теперь следует обновить софт стандартным консольным пакетным менеджером Arch Linux:
pacman -Syu
Выйти из терминала, запустить его снова, и завершить обновление: pacman -Su
Всё, теперь можно установить необходимый софт, например. pacman -S vim mc git python3 Установка пакетов ssh, и утилиты editrights.exe для редактирования прав доступа:
pacman -S cygrunsrv openssh mingw-w64-$(uname -m)-editrights
Установка ssh описана разработчиками в двух инструкциях, краткой вручную: https://gitlab.haskell.org/ghc/ghc/wikis/building/windows/sshd и подробно описанным bash скриптом: https://gist.github.com/samhocevar/00eec26d9e9988d080ac#file-gistfile1-sh.
Загрузить его в консоль и сделать исполнимым: git clone https://gist.github.com/00eec26d9e9988d080ac.git chmod +x ./gistfile1.sh Нет, мы пойдём не таким путём. Не таким путём надо идти. /В.И. Ленин/
Только хардкор, только ручная установка с контролем над процессом!
В то время как в CygWin настройка sshd осуществляется с помощью
предоставленного сценария оболочки ssh-host-config который создает
необходимые учетные записи пользователей и устанавливает sshd в качестве
системной службы в Windows, в MSYS2 эти шаги необходимо выполнить
вручную.
Итак сделаем всё вручную в консоли
MSYS2, запущенной от имени Администратора. Чтобы зоопарк кодировок
Windows отображался нормально, сразу настроим терминал: ПКМ - option,
тема Dracula, прозрачность low, курсор block, и самое главное Locale: RU_ru CP866 (или 1251 в зависимости от исполняемой команды, я же говорю, зоопарк) Генерация ключей обоих типов в /etc/ssh.
ssh-keygen -t rsa -b 2048 Назначение переменных для создания привелигерованного Windows пользователя cyg_server.
Указываем HOME для win пользователя cyg_server:
dos_var_empty=$(/usr/bin/cygpath -w /var/empty)
Создание пароля (нужен только для cygrunsrv), назначение имён пользователей, и имени группы администраторов:
_password=topsecret username=cyg_server unpriv_user=sshd admin_user=$(whoami) admingroup=$(/usr/bin/mkgroup -l | /usr/bin/awk -F: '{if ( $2 == "S-1-5-32-544" ) print $1;}')
По ряду причин отклик вызова net идёт в неверной кодировке, если не указывать её явно в свойствах терминала.
Команда выполняется без уведомления "выполнена успешно", и вываливает справку. Не пугайтесь, всё ок, это венда.
net user "${username}" "${_password}" /add /fullname:"Privileged server" /homedir:${dos_var_empty} /yes
net localgroup "${admingroup}" "${username}" /add
net user "${unpriv_user}" /add /fullname:"${unpriv_user} privsep" "/homedir:${dos_var_empty}" /active:no
Запретить истечение срока действия пароля:
Экспорт путей:
export PATH=/mingw64/bin/:/mingw32/bin:$PATH Правка прав win пользователю cyg_server:
editrights -a SeAssignPrimaryTokenPrivilege -u ${username} && \ editrights -a SeCreateTokenPrivilege -u ${username} && \ editrights -a SeTcbPrivilege -u ${username} && \ editrights -a SeDenyRemoteInteractiveLogonRight -u ${username} && \ editrights -a SeServiceLogonRight -u ${username}
Если вдруг захочется посмотреть пользователя, есть ли он вообще:
Назначение паролей: pwd_entry="$(/usr/bin/mkpasswd -l -u "${username}" | /usr/bin/sed -n -e '/^'${username}'/s?\(^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\).*?\1'/var'/empty:/bin/false?p')"
echo "${pwd_entry}" >> "/etc/passwd"
pwd_entry="$(/usr/bin/mkpasswd -l -u "${unpriv_user}" | /usr/bin/sed -n -e '/^'${unpriv_user}'/s?\(^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\).*?\1'/var'/empty:/bin/false?p')" echo "${pwd_entry}" >> "/etc/passwd" pwd_entry="$(/usr/bin/mkpasswd -l -u "${admin_user}")" echo "${pwd_entry}" >> "/etc/passwd"
И наконец, регистрация сервиса с cygrunsrv. Внимание, вывод этой команды не в CP866, а в CP1251, поэтому чтобы видеть русские буквы отклика, нужно сменить кодировку в свойствах, а затем вернуть обратно.) /usr/bin/cygrunsrv -I sshd -d "CYGWIN sshd" -p /usr/bin/sshd -a "-D" -y tcpip -u cyg_server -w "${_password}" Не пугайтесь., если вышла ошибка " Error installing a service: OpenService Win32 error 1073" Указанная служба уже существует, следует её просто удалить, и затем попробовать снова: sc.exe delete sshd Конфиг /etc/ssh/sshd_config можно не трогать, но я вручную прописал туда параметры:
Port 22 PasswordAuthentication no
Теперь можно или перезагрузиться, или вручную в этом сеансе запустить демана sshd. Вот команды для его запуска и на всякий случай, останова: net start sshd net stop sshd
Если нет доступа к серверу извне, но локально (ssh localhost) он работает, нужно открыть порт 22 в брандмауэре, как это сделать я описывал в записи 2019-04-13-1103, можно не вникать, а просто добавить это правило: netsh advfirewall firewall add rule name="sshd" dir=in protocol=TCP localport=22 action=allow
Если после успешной авторизации на сервере появляется ошибка:
lastlog_openseek: Couldn't stat /var/log/lastlog: No such file or directory lastlog_openseek: Couldn't stat /var/log/lastlog: No such file or directory
То просто сделайте touch на эти файлы.
Памятка - для конвертирования вывода некоторых windows утилит в нормальную кодировку придётся использовать конструкцию с пайпом в конце команды, например: Note: Иногда вместо 866 используется кодировка 1251
Почему-то в корне не выводятся диски windows по ls. Получить доступ к дискам файловых систем Windows можно так: /c/ - для диска "С",
/d/ - для диска "D", и аналогично...
|