Дружим PowerShell и SSH на Windows и Linux

В данной статье рассмотрим возможности использования SSH между Windows и Linux компьютерами, а также использовании PowerShell через SSH в кроссплатформенной среде.

Выполенине удаленных команд PowerShell и SSH

Устанавливаем OpenSSH на Windows

Начиная с Windows 10 1709 все очень просто. Нужно просто открыть приложение настроек. Далее выбираем приложения-> управление дополнительными компонентами-> сервер openssh и устанавливаем его. Или выполнить команду powershell

Эта же команда подойдет для 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 запускаем

Где username имя пользователя, а ip – IP адрес компьютера которым вы желаете управлять. Далее необходимо ввести пароль пользователя, обратите внимание если вы используете учетную запись Microsoft необходимо указать имя пользователя локального, а пароль уже от учетной записи Microsoft. У меня возникли сложности с вводом паролей с русскими символами.

Если не хочется использовать парольную идентификацию при подключении к Windows компьютеру можно использовать идентификацию по ключу, для этого на ubuntu запускаем

После чего необходимо скопировать содержимое файла ~/.ssh/id_rsa.pub с ubuntu в файл c:\users\пользователь\.ssh\authorized_keys на windows. Придется это сделать вручную, т.к. ssh-copy-id не отрабатывает корректно для windows машины. В результате мы можем запускать

и система не будет требовать пароль.

Кстати, если надо подключаться к Linux машине без пароля, то тогда запускаем ssh-keygen на Windows машине и копируем содержимое c:\users\пользователь\.ssh\id_rsa.pub в ~/.ssh/authorized_keys .

Настраиваем подключение не к cmd, а к powershell

По умолчанию OpenSSH будет подключать нас к cmd, безусловно мы можем запустить команду

Однако это не всегда удобно и не то, к чему мы стремимся.

Для того чтобы при подключении по SSH мы автоматически попадали в PowerShell можно изменить значение ключа реестра Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShell на путь к исполняемому файлу PowerShell. Это будет выглядеть примерно так:

Если кто-то знает как это же сделать для 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 я выполнил две команды, обращу внимание первая завершается с ошибкой зависимостей, вторая устраняет эту ошибку.

Инструкцию по установке на ваш дистрибутив или из репозиториев можно поглядеть тут 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 строчку:

Для удаленного подключения PowerShell через ssh к Linux добавляем в файл /etc/ssh/sshd_config строчку:

В моем случае для Preview версии PowerShell Core

Рекомендую проверить, где находится PowerShell в вашем дистрибутиве командой

Как использовать PowerShell по ssh

В PowerShell Core у знакомых команд Invoke-PSCommand, Enter-PSSession, New-PSSession появляется параметр -sshtransport.

Поэтому чтобы подключиться к удаленному компьютеру выполните команду

Чтобы выполнить одну команду на удаленном компьютере выполните

Зачем это?

Конечно, мы можем спокойно использовать стандартные инструменты удаленного управления PowerShell, однако кроссплатформенное взаимодействие и работа через публичные сети — это идеальный пример того где может пригодится связка PowerShell и SSH.

1 Комментарий

  1. для linux принято просто менять оболочку по умолчанию для учётной записи, например, для пользователя vasya будет так

    # usermod —shell /usr/bin/pwsh vasya

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

CAPTCHA ImageChange Image