Linux远程连接Windows执行Powershell
- 环境
- Windows设置可远程访问
- 1、开启WinRM服务
- 2、添加trusthosts
- Linux建立远程连接
- 1、Linux安装Powershell
- 2、建立连接
- 运行部署在远程服务器端的脚本
- 进阶-运行本地脚本控制远程端
- 1、准备工作
- test.ps1脚本(用于要在windows上执行的脚本,放在本地服务器上)
- test20240611.ps1脚本(用于远程控制windows端,执行本地脚本)
- Java脚本
- 2、执行脚本
- 参考
环境
windows:win10
Linux:VMWare CentOS7
Windows设置可远程访问
1、开启WinRM服务
输入命令
Enable-PSRemoting -Force
把连接的网络设置成专网即可
2、添加trusthosts
在本机(CentOS)上找到自己的ip
ifconfig
回到windows(远程服务器)的powershell,添加到trusthosts
# 方式一(添加CentOS的ip):
Set-Item WSMan:\localhost\Client\TrustedHosts -Force -Concatenate -Value 192.168.73.128
# 方式二(运行所有ip):
Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force
查看是否已被添加进去
get-item wsman:\localhost\client\trustedhosts
重启WinRM
Restart-Service WinRM
设置可执行任意脚本
set-executionpolicy remotesigned
查看是否已更改完成
Get-ExecutionPolicy
附参数可选项:
-ExecutionPolicy 为 shell 指定新的执行策略。参数名(“Name”)为可选项。
有效值包括:
– Restricted:不加载配置文件或运行脚本。默认值为“Restricted”。
– AllSigned:要求所有脚本和配置文件由可信发布者签名,包括在本地计算机编写的脚本。
– RemoteSigned:要求从 Internet 下载的所有脚本和配置文件均由可信发布者签名。
– Unrestricted:加载所有配置文件并运行所有脚本。如果运行从 Internet 下载的未签名脚本,则系统将提示您需要相关权限才能运行该脚本。
– Bypass:不阻止任何执行项,不显示警告和提示。
– Undefined:从当前作用域删除当前分配的执行策略。此参数将不会删除在组策略作用域中设置的执行策略。
Linux建立远程连接
1、Linux安装Powershell
sudo yum install -y https://github/PowerShell/PowerShell/releases/download/v7.1.4/powershell-7.1.4-1.rhel.8.x86_64.rpm
如遇链接失效无法下载的情况,请参考CentOS7,Linux,rpm和yum,安装PowerShell
安装完成后输入以下命令,验证是否安装成功
pwsh
2、建立连接
Enter-PSSession -ComputerName xxx.xxx.xxx.xxx(ip) -Credentail xxx(远程主机的用户名)
#示例:(此实例可能会引起报错,如出现报错,可先使用示例二尝试连接)
Enter-PSSession -ComputerName 192.168.50.222 -Credential ssikme
#示例二:
Enter-PSSession -ComputerName "192.168.50.222" -Authentication Negotiate -Credential ssikme
此处报错:Enter-PSSession: MI_RESULT_ACCESS_DENIED
解决方案参考:Remote PowerShell from Fedora to Windows
下载安装gssntlmssp
依赖
sudo dnf install gssntlmssp
此处由于我没有dnf,故执行命令时报错,需要先下载dnf
(*这里踩了个坑,开始以为用别的方案下gssntlmssp就可以了,但是网上使用的大部分安装方案是是用apt-get,由于是新的虚拟机,也没有安装apt,故又去找如何安装apt,最终apt-get安装后也无法install gssntlmssp,因为在centOS内,不允许使用apt,应该用yum安装
)
安装dnf
# 可以先预先更新yum
yum -y update
sudo yum install -y dnf
安装gssntlmssp 依赖
sudo dnf install gssntlmssp
重新连接远程服务器,出现以下信息则远程连接成功
运行部署在远程服务器端的脚本
脚本位置:F:\test.ps1
脚本内容:
# 设置文件名
$fileName = "F:\example.txt"
# 创建文本文件
New-Item -Path $fileName -ItemType file -Force
# 写入内容到文件
"Hello, World!" | Set-Content -Path $fileName -Force
在centOS上,连接上远程的Windows服务器后,输入此命令运行,即可远程控制脚本运行
Invoke-Command -ComputerName "192.168.50.222" -ScriptBlock {F:\test.ps1}
执行脚本,将要运行的脚本块,放到{}中
Invoke-Command -ComputerName "xxx.xxx.xxx.xxx" -ScriptBlock {代码块}
Invoke-Command -ComputerName "192.168.50.222" -ScriptBlock {New-Item -Path "F:\example.txt" -ItemType file -Force}
进阶-运行本地脚本控制远程端
1、准备工作
注意每个脚本不要出现中文,否则易出现以下错误
Failed to convert string with iconv, 7 linux
test.ps1脚本(用于要在windows上执行的脚本,放在本地服务器上)
位置:/home/yzr/test.ps1
$fileName = "F:\example.txt"
New-Item -Path $fileName -ItemType file -Force
"Hello, World!" | Set-Content -Path $fileName -Force
test20240611.ps1脚本(用于远程控制windows端,执行本地脚本)
#username
$account = "ssikme"
#password
$password = "yzr19980330"
#encryption
$secpwd = convertto-securestring $password -asplaintext -force
$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd
#Multiple servers
#[string[]]$computername="192.168.21.1","192.168.21.4","192.168.21.7"
#$session_many = new-pssession -computername $computername -Credential $cre
#Invoke-Command -Session $session_many -ThrottleLimit 1 -ScriptBlock {dir c:\}
#192.168.50.222 is your remote server ip,filePath is Script location
Invoke-Command -ComputerName "192.168.50.222" -Authentication Negotiate -Credential $cred -FilePath /home/yzr/test.ps1
Java脚本
//package com.yzr; //由于执行时,是在此文件下执行,不需要此package头,去掉即可运行成功
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ExecuteCommand {
public static void main(String[] args) {
try {
String scriptPath = "/home/yzr/test20240611.ps1";// 脚本位置
ProcessBuilder pb = new ProcessBuilder("pwsh", scriptPath);
Process process = pb.start();
print(process.getInputStream());
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
return;
}
}
public static void print(InputStream inputStream){
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}catch (Exception e){
e.printStackTrace();
System.out.println("出现异常..");
}
}
}
2、执行脚本
#如果没有预装javac,请先预装javac
sudo yum install java-1.8.0-openjdk-devel
#用javac -version 查看是否已安装
javac -version
#编译java文件(执行完成会产生xxx.class文件)
javac ExecuteCommand.java
#运行java文件
java ExecuteCommand
出现以下结果,且F盘下有文件生成,文件内写入“Hello, World”则为成功
参考
Invoke-Command 执行报错:解决方法
解决MI_RESULT_ACCESS_DENIED错误
PowerShell:因为在此系统上禁止运行脚本,解决方法
W5 SOAR操作手册-WinRM部分
PS命令之操作系统远程管理及进程服务操
从Linux到Windows的PowerShell远程处理
Windows远程管理WinRM,Enter-PSSession