最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Linux远程连接Windows执行Powershell

运维笔记admin2浏览0评论

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

发布评论

评论列表(0)

  1. 暂无评论