Поиск по сайту:

Объяснение клиента PowerShell SSH и удаленного управления


Вам нужно управлять удаленным сервером или сетевым устройством? Тогда, скорее всего, вы используете SSH для подключения и управления ими. Протокол SSH позволяет безопасно подключаться к удаленному устройству через незащищенную сеть (интернет). Чтобы использовать SSH, большинство людей используют инструмент SSH-клиент, такой как Putty. Но вы знали, что PowerShell имеет встроенный SSH-клиент?

Клиент SSH PowerShell включен по умолчанию в Windows 10 версии 1809 и выше. Это означает, что теперь вы можете легко подключаться к любому удаленному устройству из вашего любимого командного инструмента.

Мы также можем использовать SSH в PowerShell для удаленного управления другой машиной с Windows, но вам нужно будет использовать PowerShell 6 или более новую версию для запуска SSH-сервера.

Клиент SSH PowerShell

Наиболее распространенный способ использования SSH в PowerShell - это клиент SSH. Предполагая, что вы поддерживаете Windows в актуальном состоянии, у вас должен быть включен SSH по умолчанию. Вы можете просто проверить это, открыв PowerShell и набрав следующую команду:

type ssh and press enter
ssh

Result:
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

С открытым PowerShell вы можете подключиться к удаленному серверу или сетевому устройству с помощью одной команды:

ssh <username>@<host_ip_address>

For example:
ssh pi@192.168.1.210

Вы также можете использовать имя хоста вместо IP-адреса. Если вы не укажете имя пользователя, будет использована ваша локальная учетная запись.

Когда вы нажимаете Enter, вам нужно будет ввести пароль пользователя SSH. При первом подключении к устройству вам нужно будет принять ключ хоста. Просто нажмите Enter или введите yes.

Если у вас SSH работает на другом порту, отличном от стандартного порта 22, то вы можете изменить номер порта с помощью флага -P:

ssh <username>@<host_ip_address> -P <port_number>

For example
ssh pi@192.168.1.210 -P 1022

Генерация SSH ключей PowerShell

Некоторые удалённые серверы или службы разрешают доступ только по SSH с использованием SSH-ключа. Вам необходимо сгенерировать локальный SSH-ключ и загрузить ключ на сервер (или службы), чтобы он мог вас идентифицировать и создать защищённое соединение.

SSH-ключ состоит из закрытого и открытого ключа. Вы должны хранить закрытый ключ на своем локальном компьютере (и убедиться, что вы храните его в секрете), а открытый ключ загружается на сервер.

PowerShell имеет встроенный SSH keygen, который вы можете использовать для генерации нового ключа. Введите следующую команду, чтобы сгенерировать ключ:

ssh-keygen -t Ed25519

Result
Generating public/private Ed25519 key pair.
Enter file in which to save the key (C:\Users\a-d/.ssh/id_ed25519): <press enter>

It will ask for apassphrase, you can leave it empty - see below for more details
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Generated key
Your identification has been saved in C:\Users\a-d/.ssh/id_ed25519.
Your public key has been saved in C:\Users\a-d/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:1232131+ASdi123SscvBbwn9Qfxj0 a-d@lab01
The key's randomart image is:
+--[ED25519 256]--+
| .o .            |
|..o+ .           |
|o..o .   o       |
|+..# o .         |
|=.+ =...S.       |
|.+.C.+. + E      |
|. *o@OO O. .     |
| = O*o  .        |
|. +++.           |
+----[SHA256]-----+

Опция -t Ed25519 является новым алгоритмом, который используется для создания ключа. На устаревших системах это может не поддерживаться. Вы можете тогда использовать более старую систему шифрования RSA.

ssh-keygen -b 4096 -t RSA

Ключи хранятся в вашем профиле пользователя. Путь отображается в выводе, но, как правило, они сохраняются в следующем месте:

%userprofile%\.ssh

Парольная фраза SSH Keygen

Во время создания ключа ssh вам будет предложено ввести парольную фразу или оставить её пустой (по умолчанию). Парольная фраза используется для шифрования локального ключа. Таким образом, вы можете надежно хранить локальный ключ. Если кто-то получит доступ к ключу, то он не сможет использовать его без парольной фразы.

Но прежде чем использовать парольную фразу, вам нужно помнить об одной важной вещи. Вам потребуется вводить парольную фразу каждый раз, когда вы используете SSH-ключ. Чаще всего SSH-ключ используется в автоматизации, например, в службах GitHub. В таких случаях использование парольной фразы становится невозможным.

Удаленное соединение PowerShell через SSH

Мы также можем использовать SSH в PowerShell для установления удаленного подключения к другому компьютеру или серверу. Это может быть между компьютерами на Windows или Windows с Linux и наоборот.

Создание удаленной сессии PowerShell между двумя компьютерами на Windows уже было возможно с помощью WinRM. Но теперь вы также можете использовать SSH для создания соединения. Преимущество SSH заключается в том, что вы можете использовать его на Windows, Linux и macOS.

Для использования SSH для удаленных соединений между машинами Windows и Linux вам потребуется PowerShell 6 или более новая версия. В приведенных ниже примерах я использую PowerShell 7.

Установите сервер OpenSSH

Первый шаг - установить сервер OpenSSH на ваш компьютер с Windows. Как упоминалось, клиент SSH теперь установлен и включен по умолчанию. Однако сервер SSH не установлен.

Вы можете проверить, установлен ли сервер OpenSSH, с помощью следующей команды:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

Result:
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

Как вы можете видеть, сервер OpenSSH отсутствует. Мы можем установить/включить его с помощью PowerShell:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Следующий шаг - запустить сервер OpenSSH. Поскольку это сервис, который мы можем установить для автоматического запуска:

Start the sshd service
Start-Service sshd

Set the service to automatic start
Set-Service sshd -StartupType Automatic

Настройте SSH-сервер

Нам нужно отредактировать конфигурационный файл SSHD, чтобы мы могли аутентифицироваться с помощью пароля и использовать PowerShell на удаленной машине.

Если мы не настроим SSH-сервер, мы сможем использовать только базовые команды на удаленной машине (командная строка Windows).

Чтобы полностью использовать все команды PowerShell, нам нужно настроить SSH-сервер для добавления PowerShell в качестве подсистемы.

Файл конфигурации SSHD хранится в папке programdata. Поскольку у нас уже открыта PowerShell, мы используем её для открытия файла конфигурации:

Change the directory to the programdata folder> ssh
cd $env:ProgramData\ssh

Open the configuration file in notepad
PS C:\ProgramData\ssh> notepad .\sshd_config

В конфигурационном файле уберите # перед строкой PasswordAuthentication yes и добавьте следующую строку в конфигурационный файл. (расположение не столь важно, но я добавил ниже части “# переопределить значение по умолчанию для отсутствующих подсистем”)

Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile

Перезапустите службу SSHD, чтобы загрузить новый файл конфигурации:

Restart-service sshd

SSH удаленный доступ с PowerShell

С установленным SSH-сервером на нашем сервере мы теперь можем подключаться к нему с помощью PowerShell на нашем клиенте. Мы можем использовать тот же командлет, что и с WinRM удаленным доступом, разница заключается в имени хоста и имени компьютера.

  • Новая-PSSession
  • Введите-PSSession
  • Invoke-Command

Если вы используете New-PSSession -Computername, то будет использоваться протокол WinRM. Когда вы вместо этого используете параметр -hostname, будет использован SSH.

Вы можете начать новую сессию удаленного PowerShell следующим образом:

Directly open a remoting session
Enter-PSSession -HostName la-srv-lab01 -UserName admin

Create a new session
$session = New-PSSession -HostName la-srv-lab01 -UserName admin

Invoke a command on the remote machine
Invoke-Command -Session $session -ScriptBlock {Get-Process -Name "Explorer"}

Result:
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName   PSComputerName
 ------    -----      -----     ------      --  -- -----------   -------------
    517    49,78     122,99      24,83    3532   1 explorer      la-srv-lab01

Также обратите внимание, что мы используем параметр -Username вместо -Credentials, как в методе WinRM.

Мы можем выполнять удаленные команды PowerShell с помощью командлета Invoke-Command или открыть PowerShell на сервере с помощью Enter-PSSession.

Управление несколькими SSH-соединениями

Преимуществом таких инструментов, как Putty, является возможность управлять и сохранять ваши SSH-соединения. Это позволяет вам легко вновь подключаться к серверам или сетевым устройствам, которые вы используете часто.

С помощью Windows Terminal вы можете достичь того же результата. Новый Windows Terminal позволяет вам легко сохранять различные подключения и использовать разные интерфейсы командной строки.

Если вы хотите узнать больше о Windows Terminal, обязательно прочитайте эту статью, в которой я объясняю все детали этого мощного терминала.

Заключение

Использование SSH с PowerShell действительно удобно и исключает необходимость в дополнительном инструменте (SSH-клиент). Лично я много использую PowerShell, поэтому, когда мне нужно проверить или сделать что-то на сервере, очень легко быстро подключиться к нему из окна PowerShell.

Я надеюсь, что вы нашли эту статью полезной. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.