一種windows遠程自動化解決方案
今天的主角是powershell。
windows有兩種命令行方式,一種是cmd,一種是powershell,cmd也就是我們常用的命令提示符,powershell有著和linux類似的操作命令,如ls、cat、wget等,也有它自己的包管理方式,對標linux,同時也兼容cmd的命令,方便windows、linux運維及開發(fā)人員。
windows10、windows11、windows server 2016及以上系統(tǒng)已標配powershell,其中windows11自帶windows終端(windows terminal), 可以通過此自動打開powershell;windows10可以小娜(win+q)搜索或通過運行程序執(zhí)行powershell運行powershell。
一般,windows之間的遠程都是通過mstsc(遠程桌面連接)操作,是一種界面話的操作,但是這并不能很好的完成一些自動化的操作,下面將基于powershell實現(xiàn)windows的遠程自動化操作。
環(huán)境配置
服務端
服務端是一臺windows10電腦。
以管理員身份打開powershell, 通常第一次運行ps腳本,windows禁止了運行腳本的權限,使用以下命令,授予權限,過程中可能會出現(xiàn)一些提示,按提示同意(輸入A)即可。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
依次輸入以下命令,如圖
winrm quickconfig
Get-Service WinRM
Enable-PSRemoting
[圖片上傳失敗...(image-e212b2-1650100048661)]
客戶端
客戶端是一臺windows11的電腦。
同理,如果第一次運行ps腳本,以管理員身份運行以下命令進行授權。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
服務端配置好之后,可以通過以下命令測試是否可以聯(lián)通遠程環(huán)境,出現(xiàn)以下類似環(huán)境則成功。
[圖片上傳失敗...(image-6c385c-1650100048662)]
依次運行以下命令,信任即將要遠程的主機,像是rdp、ssh遠程時的首次信任一樣,*是信任所有主機,也可以指定ip、域名。
Set-Item WSMan:\localhost\Client\TrustedHosts "*" -Force
# Set-Item WSMan:\localhost\Client\TrustedHosts "192.168.1.10" -Force
Get-ChildItem WSMan::localhost\client
[圖片上傳失敗...(image-15f8b5-1650100048662)]
1 powershell遠程登錄
在powershell里執(zhí)行命令
Enter-PSSession <pcName> -Credential (Get-Credential)
其中,<pcName>可以是主機名、ip地址、域名。
如:
Enter-PSSession 192.168.1.10 -Credential (Get-Credential)
執(zhí)行后,會提示如圖輸入賬號密碼,輸入遠程服務器的用戶名、密碼即可
[圖片上傳失敗...(image-fbf9c7-1650100048662)]
登錄成功后,會有如下界面
[圖片上傳失敗...(image-a192f0-1650100048662)]
執(zhí)行一個python腳本server_python_script1.py,如下圖,可以看到,成功執(zhí)行了一個遠程環(huán)境上的腳本。
from datetime import datetime
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('time:',now)
[圖片上傳失敗...(image-270442-1650100048662)]
但執(zhí)行python, node, cmd等交互式命令是不行的, 可能是因為不允許交互式環(huán)境。
2 自動化執(zhí)行腳本
以上的交互式方案,需要我們手動輸入賬號密碼登錄,并且需要手動輸入命令去執(zhí)行,可以像linux的ssh方案一樣,通過命令行去遠程操作windows,可以簡化操作流程。
當然,也有可以通過命令,自動完成登錄,并執(zhí)行命令的方式。
在某文件夾下,新建一個powershell腳本文件login_server.ps1,其中,<pcName>, <userName> <userPwd>是你需要遠程主機的相關信息。
$serverName="<pcName>"
$uerName="<userName>"
$userPwd=ConvertTo-SecureString "<userPwd>" -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($uerName,$userPwd);
Enter-PSSession -ComputerName $serverName -Credential $cred
然后,右鍵使用powershell運行該文件
[圖片上傳失敗...(image-25f79d-1650100048662)]
或者,在powershell里進入腳本所在當前文件夾下,運行該腳本
.\login_server.ps1
執(zhí)行后,自動進入到遠程環(huán)境,無需輸入賬號密碼。
[圖片上傳失敗...(image-2ff5ea-1650100048662)]
如何可以自動執(zhí)行一個腳本呢?
新建一個我們需要在遠程服務器上執(zhí)行的腳本command.ps1。
cd E:\pw_server
md onedir
tree > content.txt
ls
做了一個在服務端E:\pw_server文件夾新建一個文件夾、寫入一個文件的示例腳本。
新建一個登錄并執(zhí)行該命令的腳本文件execute_command.ps1。
$serverName="<pcName>"
$uerName="<userName>"
$userPwd=ConvertTo-SecureString "<userPwd>" -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($uerName,$userPwd);
#Enter-PSSession -ComputerName $serverName -Credential $cred
invoke-command -computername $serverName -Credential $cred -FilePath .\command.ps1
其中,invoke-command是將本地腳本上傳到遠程環(huán)境并執(zhí)行的關鍵。
執(zhí)行一下execute_command.ps1,可以看到,command.ps1命令在遠程環(huán)境中成功被執(zhí)行。
[圖片上傳失敗...(image-1e7f92-1650100048662)]
總結
windows powershell是一種不錯的能夠實現(xiàn)windows遠程自動化的一種方式。由于powershell命令方式上有一些linux的影子,也能夠兼容大部分cmd命令,所以靈活性很強,可以很好的解決windows遠程上的一些痛點。
參考文獻
[1] https://docs.microsoft.com/zh-cn/previous-versions/technet-magazine/gg981683(v=msdn.10)