В данной статье рассмотрим возможности использования SSH между Windows и Linux компьютерами, а также использовании PowerShell через SSH в кроссплатформенной среде.
Устанавливаем OpenSSH на Windows
Начиная с Windows 10 1709 все очень просто. Нужно просто открыть приложение настроек. Далее выбираем приложения-> управление дополнительными компонентами-> сервер openssh и устанавливаем его. Или выполнить команду powershell
1 |
Get-WindowsCapability -Online | ? name -like *ssh* | Add-WindowsCapability -Online |
Эта же команда подойдет для Windows Server 1709.
Для Windows Server 2016, Windows 8.1 и предыдущих версии нам понадобится OpenSSH дистрибутив, который можно скачать с https://github.com/PowerShell/Win32-OpenSSH/releases в самом простом случае, нужно будет скаченный архив извлечь в C:\Program Files\OpenSSH, и запустить скрипт install-ssh.ps1. Если что-то пошло не так воспользуйтесь следующей статьей https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH
Далее запускаем службу OpenSSH
Настраиваем SSH
В общем-то теперь можно пользоваться ssh.
С компьютера на ubuntu или windows запускаем
1 |
ssh -l UserName IP |
Где username имя пользователя, а ip – IP адрес компьютера которым вы желаете управлять. Далее необходимо ввести пароль пользователя, обратите внимание если вы используете учетную запись Microsoft необходимо указать имя пользователя локального, а пароль уже от учетной записи Microsoft. У меня возникли сложности с вводом паролей с русскими символами.
Если не хочется использовать парольную идентификацию при подключении к Windows компьютеру можно использовать идентификацию по ключу, для этого на ubuntu запускаем
1 |
ssh-keygen |
После чего необходимо скопировать содержимое файла ~/.ssh/id_rsa.pub с ubuntu в файл c:\users\пользователь\.ssh\authorized_keys на windows. Придется это сделать вручную, т.к. ssh-copy-id не отрабатывает корректно для windows машины. В результате мы можем запускать
1 |
ssh -l UserName IP |
и система не будет требовать пароль.
Кстати, если надо подключаться к Linux машине без пароля, то тогда запускаем ssh-keygen на Windows машине и копируем содержимое c:\users\пользователь\.ssh\id_rsa.pub в ~/.ssh/authorized_keys .
Настраиваем подключение не к cmd, а к powershell
По умолчанию OpenSSH будет подключать нас к cmd, безусловно мы можем запустить команду
1 |
powershell |
Однако это не всегда удобно и не то, к чему мы стремимся.
Для того чтобы при подключении по SSH мы автоматически попадали в PowerShell можно изменить значение ключа реестра Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShell на путь к исполняемому файлу PowerShell. Это будет выглядеть примерно так:
1 |
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force |
Если кто-то знает как это же сделать для Linux, напишите в комментариях.
Взаимодействие PowerShell и SSH
Обычный Windows PowerShell основанный на .Net Framework не может использовать openssh, зато PowerShell Core, основанный на кроссплатформенной .Net Core может. При использовании PowerShell Core вы должны дополнительно тестировать ваши скрипты.
Устанавливаем PowerShell Сore на Windows с этого репозитория https://github.com/PowerShell/PowerShell/releases. Установка проходит без проблем.
А вот с установкой PowerShell Core на Ubuntu мне пришлось помучится, т.к. на момент написания статьи не было релиза для Ubuntu 18.04 мне пришлось ставить Preview версию из пакета deb, который опять-таки можно скачать с сайта https://github.com/PowerShell/PowerShell/releases. После скачивания на ubuntu я выполнил две команды, обращу внимание первая завершается с ошибкой зависимостей, вторая устраняет эту ошибку.
1 2 3 |
sudo dpkg -i powershell-preview_6.1.0-preview.3-1.ubuntu.18.04_amd64.deb sudo apt-get install -f |
Инструкцию по установке на ваш дистрибутив или из репозиториев можно поглядеть тут https://docs.microsoft.com/en-us/powershell/scripting/setup/installing-powershell-core-on-linux?view=powershell-6
Для удаленного подключения PowerShell через ssh к Windows добавляем в файл C:\ProgramData\ssh\sshd_config строчку:
1 |
Subsystem powershell C:\Program Files\PowerShell\6.0.0\pwsh.exe -sshs -NoLogo -NoProfile |
Для удаленного подключения PowerShell через ssh к Linux добавляем в файл /etc/ssh/sshd_config строчку:
1 |
Subsystem powershell /usr/ bin/pwsh -sshs -NoLogo -NoProfile |
В моем случае для Preview версии PowerShell Core
1 |
Subsystem powershell /usr/ bin/pwsh-preview -sshs -NoLogo -NoProfile |
Рекомендую проверить, где находится PowerShell в вашем дистрибутиве командой
1 |
which pwsh |
Как использовать PowerShell по ssh
В PowerShell Core у знакомых команд Invoke-PSCommand, Enter-PSSession, New-PSSession появляется параметр -sshtransport.
Поэтому чтобы подключиться к удаленному компьютеру выполните команду
1 |
Enter-PSSession -SSHTransport -HostName Удаленный_IP -UserName ИмяПользователя |
Чтобы выполнить одну команду на удаленном компьютере выполните
1 |
Invoke-Command -SSHTransport -HostName Удаленный_IP -UserName ИмяПользователя -ScriptBlock {ВашаКоманда} |
Зачем это?
Конечно, мы можем спокойно использовать стандартные инструменты удаленного управления PowerShell, однако кроссплатформенное взаимодействие и работа через публичные сети — это идеальный пример того где может пригодится связка PowerShell и SSH.
для linux принято просто менять оболочку по умолчанию для учётной записи, например, для пользователя vasya будет так
# usermod —shell /usr/bin/pwsh vasya
теоретически есть возможность и в настройка ssh запускать другую команду по подключению, но обычно этого не требуется