PowerShell 远程执行命令
https://www.cnblogs.com/wanghao4023030/p/11151099.html
最近在做一些自动化的测试工作,在代码实现的过程中需要远程启动/关闭一些服务或者测试机。
我首先想到的是建立一个website,通过网站对一些服务进行操作,但是这样感觉比较重,而且重启一些例如IIS或者计算机的时候不是很安全。还有一种方式就是执行ssh命令或者bat命令。由于服务器是windows的,我就考虑是否可以使用PowerShell来实现。
工具
微软提供了一个一个叫WS-Management的协议,可以实现设备远程交换数据的方法。本身自带了一个叫 (Windows Remote Management service,简称 WinRM) 的服务。我们可以通过PowerShell来实现远程控制。
Host:
在host机器上我们首先检查下WinRM服务是否安装成功:
Get-Service WinRM
该服务默认情况下是开启的,如果没有开启可以到services列表里面进行开启,或者在powershell里面开启:
Enable-PSRemoting –Force
这个时候如果你的客户端和服务端的计算机都在工作域中,那么这时候的配置基本上是可以使用了。 如果不在域里面,则还需要做以下额外的操作:
Client:
在Client端执行以下命令, 将服务器机器添加到信任列表里:
Set-Item wsman:\localhost\client\trustedhosts * Restart-Service WinRM
测试以下,服务通讯是否成功:
Test-WsMan xxx.xxx.xxx.xxx
看到类似上面的信息,就表示两个计算机之间的通讯是通畅的。
如果出现以下错误:
根据提示去server端运行 winrm quickconfig,然后一路默认即可:
然后我们就可以尝试使用命令远程连接计算机了:
Enter-PSSession -ComputerName 10.112.20.84 -Credential administrator
在弹出的登录框中输入host的密码就可以登录远程计算机了:
但是这种方式需要手工输入密码,不是很方便,我们只需要将这些用户名密码参数化就可以实验脚本化登录了:
$Username = '*********' $PWD = '********' $pass = ConvertTo-SecureString -AsPlainText $PWD -Force $Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass Invoke-Command -ComputerName 10.112.20.84 -ScriptBlock { iisreset } -credential $Cred
PowerShell连接远程主机运行远程命令
https://www.cnblogs.com/makesense/p/12820404.html
PowerShell主要采用Web Services for Mangement(WS-MAN)进行远程处理,WS-MAN完全基于Http(默认5985)或者Https(默认5986)进行工作,这样保证在需要的情况下,能够轻易透过防火墙进行作业(因为每种协议都使用唯一的端口进行通信)。微软对WS-MAN的实现是Windows Remote mangement(WinRM)。WinRM是一个基于SOAP的后台服务。
PowerShell连接常规远程主机
1. 在远程机器上以Administrator角色打开PowerShell执行以下命令,启动允许远程连接
Enable-PsRemoting
2. 在客户机器 (本地) 执行以下命令,将远程机器IP地址加入可信主机列表
Set-Item wsman:\localhost\Client\TrustedHosts -value <Remote Host IP Address>
3. 在客户机器 (本地) 输入以下命令, 在弹出对话框输入密码,以交互的方式连接远程主机
Enter-PSSession -ComputerName <Remote Host IP Address> -Credential <UserName>
4. PowerShell远程命令的基本使用见官方文档: Running Remote Commands
- Start an Interactive Session (Enter-PSSession and Exit-PSSession)
- Run a Remote Command / Script (Invoke-Command)
- Establish a Persistent Connection (New-PSSession)
使用PowerShell以Http方式连接Azure虚拟机
1. 同以上常规连接远程主机设置
1. 若虚拟机安全受网络完全组(Network Security Group)管控,设置允许5985入栈
2. 若虚拟机绑定了负载均衡器(load balancer),为5985端口设置入站NAT规则(Inbound NAT Rules), 或者为了隐藏实际端口,为5985端口运行状况探测(probes)和负载均衡规则(load Balancing Rules)
使用PowerShell以Https方式连接Azure虚拟机
1. 同以上常规连接远程主机设置
2. 打开Azure远程虚拟机(Windows)防火墙设置,设置允许5986入栈
3. 若虚拟机安全受网络完全组(Network Security Group)管控,设置允许5986入栈
4. 若虚拟机绑定了负载均衡器(load balancer),为5986端口设置入站NAT规则(Inbound NAT Rules),或者为了隐藏实际端口,为5986端口运行状况探测(probes)和负载均衡规则(load Balancing Rules)
5. 需使用以下命令连接远程主机, 详细参数设置见: Enter-PSSession
# 设置会话,忽略远程机器的SSL证书验证 $SessionOption = New-PsSessionOption SkipCACheck -SkipCNCheck Enter-PSSession -ConnectionUri https://<Remote Host IP Address>:5986 -Credential <User Name> -SessionOption $SessionOption # 另一种参数形式 Enter-PSSession -ComputerName <Remote Host IP Address> -Port 5986 -UseSSL -Credential <User Name> -SessionOption $SessionOption
从PowerShell 6开始,除了WS-MAN之外,远程处理技术还可以基于SSH协议。在最新的Windows 10和Windows Server 2019中,可以使用OpenSSH连接远程机器,详细文档参见:PowerShell remoting over SSH and OpenSSH in Windows, 另外,OpenSSH客户端在最新的Windows 10和Windows Server 2019中已默认安装,在 设置\应用\可选功能 列表下可以找到(见下图), 可以通过上方的添加功能按钮安装OpenSSH服务器。
更多参考:
1. Enable PowerShell remoting on Azure RM virtual machines
2. Copy files to Azure VM using PowerShell Remoting
3. Secrets of PowerShell Remoting
3. 远程管理WinRM,Enter-PSSession (Enable-PSRemoting = Set-WSManQuickConfig = winrm quickconfig)
标签: PowerShell