PowerShell SSH 客户端和远程处理说明
您需要管理远程服务器或网络设备吗?那么您可能正在使用 SSH 来连接和管理它们。 SSH 协议允许您通过不安全的网络(互联网)安全地连接到远程设备。要使用 SSH,大多数人都会使用 SSH 客户端工具,例如 Putty。但您是否知道PowerShell 有一个内置的 SSH 客户端?
Windows 10 1809 及更高版本中默认启用 PowerShell SSH 客户端。这意味着您现在可以轻松地从您最喜欢的命令行工具连接到任何远程设备。
我们还可以在 PowerShell 中使用 SSH 远程管理另一台 Windows 计算机,但您需要使用 PowerShell 6 或更高版本来运行 SSH 服务器。
PowerShell SSH 客户端
在 PowerShell 中使用 SSH 最常见的方法是作为 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 1022PowerShell SSH 注册机
某些远程服务器或服务仅允许使用 SSH 密钥进行 SSH 访问。您需要生成本地 SSH 密钥并将密钥上传到服务器(或服务),以便它可以验证您并创建安全连接。
SSH 密钥存在于私钥和公钥中。您需要将私钥保存在本地计算机上(并确保您自己保管),并将公钥上传到服务器。
PowerShell 有一个内置的 SSH 密钥生成器,您可以使用它来生成新密钥。键入以下命令来生成密钥:
ssh-keygen -t Ed25519
# Result
Generating public/private Ed25519 key pair.
Enter file in which to save the key (C:\Users\lazyadmin/.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\lazyadmin/.ssh/id_ed25519.
Your public key has been saved in C:\Users\lazyadmin/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:1232131+ASdi123SscvBbwn9Qfxj0 lazyadmin@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%\.sshSSH 注册机密码
在创建 ssh 密钥期间,系统会要求您输入密码或将其留空(默认)。密码用于加密本地密钥。这样您就可以安全地存储本地密钥。如果任何人获得了密钥,那么如果没有密码短语,他们就无法使用它。
但在使用密码之前,您需要记住一件重要的事情。每次使用 SSH 密钥时都需要输入密码。大多数时候 SSH 密钥用于自动化,例如 GitHub 服务。在这些用例中,不能选择使用密码。
使用 SSH 的 PowerShell 远程连接
我们还可以在PowerShell中使用SSH来建立与另一台计算机或服务器的远程连接。这可以在 Windows 计算机或 Windows-Linux 之间进行,反之亦然。
使用 WinRM 已经可以在两台 Windows 计算机之间创建 PowerShell 远程会话。但您现在还可以使用 SSH 创建连接。 SSH 的优点是您可以在 Windows、Linux 和 macOS 上使用它。
您将需要 PowerShell 6 或更高版本才能使用 SSH 在 Windows 和 Linux 计算机之间进行远程连接。我在下面的示例中使用 PowerShell 7。
安装 OpenSSH 服务器
第一步是在 Windows 计算机上安装 OpenSSH 服务器。如前所述,SSH 客户端现已默认安装并启用。但 SSH 服务器不是。
您可以使用以下 cmdlet 检查是否安装了 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 Shell 提示符)。
为了充分使用所有 PowerShell cmdlet,我们需要配置 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 行之前的 #,并在配置文件中添加以下行。 (位置并不重要,但我在“# override default of no Subsystems”部分下面添加了)
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile重新启动 SSHD 服务以加载新的配置文件:
Restart-service sshd使用 PowerShell 进行 SSH 远程处理
在服务器上安装 SSH 服务器后,我们现在可以在客户端上使用 PowerShell 连接到它。我们可以使用与 WinRM 远程处理相同的 cmdlet,区别在于主机名与计算机名称。
- 新 PS 会话
- 输入-PSSession
- 调用命令
如果您使用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 而不是 WinRM 方法中的 -Credentials。
我们可以使用 Invoke-Command cmdlet 运行远程 PowerShell 命令,或者使用 Enter-PSSession 在服务器上打开 PowerShell。
管理多个 SSH 连接
Putty 等工具的优点是您可以管理和保存 SSH 连接。这使您可以轻松地重新连接到您经常使用的服务器或网络设备。
使用 Windows Terminal,您可以实现同样的目标。新的 Windows 终端允许您轻松存储不同的连接并使用不同的命令行界面。
如果您想了解有关 Winows 终端的更多信息,请务必阅读这篇文章,我在其中解释了有关这个功能强大的终端的所有详细信息。
总结
将 SSH 与 PowerShell 结合使用确实非常方便,并且无需额外的工具(SSH 客户端)。就我个人而言,我经常使用 PowerShell,因此当我需要在服务器上检查或执行某些操作时,从 PowerShell 窗口快速连接到它非常容易。
我希望这篇文章对您有用,如果您有任何疑问,请在下面发表评论。




