菜鸟科技网

批处理远程命令

核心概念

在批处理中执行远程命令,主要有以下几种方式,各有其优缺点和适用场景:

批处理远程命令-图1
(图片来源网络,侵删)
  1. psexec (Sysinternals Suite):功能最强大、最常用的第三方工具,可以像在本地一样,在远程计算机上执行交互式命令、脚本,甚至启动图形界面程序。
  2. wmic (Windows Management Instrumentation):Windows内置工具,功能强大,特别适合执行命令并捕获其输出结果,对于非交互式命令,它是首选。
  3. plink (PuTTY Link):PuTTY套件的一部分,主要用于通过SSH协议在远程Linux/Unix或Windows(开启SSH服务)计算机上执行命令。
  4. PowerShell Remoting (WinRM):现代Windows系统(Win7+、Server 2008 R2+)的推荐方式,功能与psexec类似,但基于更现代的PowerShell,安全性更高,更适合脚本化。

使用 psexec (最常用)

psexec 是微软官方发布的 Sysinternals 工具包中的一员,你需要先下载它。

准备工作

  • 下载 psexec:访问 Microsoft Sysinternals 页面 下载 PsTools 压缩包,并将 psexec.exe 放在一个方便的位置(C:\Windows\System32,这样就可以在任何地方直接调用)。
  • 确保网络连通:本地计算机能 ping 通远程计算机。
  • 账户权限:你需要拥有远程计算机上的管理员账户凭据,为了安全,强烈建议使用域账户或有权限的本地管理员账户,而不是直接使用 Administrator

基本语法

psexec [\\computer_name] [options] command
  • \\computer_name:远程计算机的名称或IP地址。\\WIN-10-PC-01\\192.168.1.100
  • [options]:可选参数,-u 用户名,-p 密码,-d (不等待程序结束) 等。
  • command:要在远程计算机上执行的命令。ipconfignotepad.exe

实践示例

示例 1:输入密码执行命令(不安全,仅用于演示)

@echo off
echo 正在执行远程命令...
psexec \\WIN-10-PC-01 -u administrator -p YourPassword123 ipconfig /all
pause

说明

  • -u administrator:指定用户名。
  • -p YourPassword123:指定密码。注意:这样写会将密码明文保存在批处理文件和命令历史中,非常不安全!

示例 2:安全地输入密码(推荐)

批处理远程命令-图2
(图片来源网络,侵删)
@echo off
set /p "remote_pc=请输入远程计算机名或IP: "
set /p "user=请输入用户名: "
set /p "pass=请输入密码: "
echo 正在执行远程命令...
psexec \\%remote_pc% -u %user% -p %pass% "hostname"
echo.
echo 命令执行完毕。
pause

说明

  • set /p 命令会在运行时提示用户输入,密码不会保存在文件中。
  • 命令 hostname 被双引号 括起来,可以防止命令中包含特殊字符(如空格)时出错。

示例 3:在远程计算机上执行批处理脚本

假设你有一个远程脚本 C:\scripts\cleanup.bat,你想在远程计算机上运行它。

@echo off
psexec \\192.168.1.100 -u administrator -p YourPassword123 c:\scripts\cleanup.bat
pause

示例 4:复制文件并执行(-c 参数)

批处理远程命令-图3
(图片来源网络,侵删)

-c 参数会自动将本地文件复制到远程计算机的 Admin$ 共享目录下,然后执行。

@echo off
rem 将本地的 myapp.exe 复制到远程C盘并运行
psexec \\192-10-PC-01 -c myapp.exe
pause

使用 wmic (Windows内置)

wmic 是通过 WMI (Windows Management Instrumentation) 服务工作的,通常用于执行命令并捕获其输出,而不是进行交互式操作。

基本语法

wmic /node:"computer_name" /user:"username" /password:"password" process call create "command"
  • /node:"computer_name":指定远程计算机。
  • /user/password:指定凭据。
  • process call create "command":这是调用wmic执行命令的固定格式。

实践示例

示例 1:执行 ipconfig 并显示输出

@echo off
set "remote_pc=WIN-10-PC-01"
set "user=administrator"
set "pass=YourPassword123"
echo 正在使用WMIC执行远程命令...
wmic /node:"%remote_pc%" /user:"%user%" /password:"%pass%" process call create "cmd.exe /c ipconfig /all"
echo.
echo 命令已发送,注意:WMIC通常不显示命令的标准输出。
pause

重要提示wmicprocess call create 主要是“调用”命令,默认不会将命令的标准输出返回到你的控制台,它的优势在于可以获取命令的执行状态、PID等信息。

如何捕获输出? 可以通过将输出重定向到远程计算机的一个文件,然后再将文件拉取回来。

@echo off
set "remote_pc=WIN-10-PC-01"
set "user=administrator"
set "pass=YourPassword123"
set "remote_file=C:\temp\ipconfig.txt"
echo 正在生成远程报告...
wmic /node:"%remote_pc%" /user:"%user%" /password:"%pass%" process call create "cmd.exe /c ipconfig /all > %remote_file%"
echo 报告已生成在远程计算机的 %remote_file%
pause

然后你需要用其他方法(如 copypsexec -c)将 %remote_file% 拉回本地。


使用 plink (通过SSH)

如果你的远程服务器是 Linux/Unix 或开启了SSH服务的Windows(如OpenSSH),plink 是绝佳选择。

准备工作

  • 下载 plink:从 PuTTY 官方下载页 下载 plink.exe
  • 确保SSH服务已开启:在远程计算机上运行SSH服务。
  • 密钥认证(推荐):为了自动化,最好配置SSH免密登录(使用密钥对),而不是每次都输入密码。

基本语法

plink -l username -pw password hostname_or_ip "command"
  • -l username:登录用户名。
  • -pw password:密码(同样不安全,仅演示)。
  • hostname_or_ip:远程主机地址。
  • "command":要执行的命令,必须用引号括起来

实践示例

示例 1:在Linux服务器上执行命令

@echo off
plink -l root -p YourLinuxPass 192.168.1.50 "df -h"
pause

说明

  • df -h 是一个Linux命令,用于查看磁盘使用情况。

示例 2:使用SSH密钥(自动化脚本首选)

  1. 使用 puttygen.exe 生成一对公钥/私钥。
  2. 添加到远程服务器的 ~/.ssh/authorized_keys 文件中。
  3. 使用 -i 参数指定私钥文件路径。
@echo off
rem 假设私钥文件在 C:\keys\my_private_key.ppk
plink -l root -i C:\keys\my_private_key.ppk 192.168.1.50 "uname -a"
pause

使用 PowerShell Remoting (WinRM)

这是微软推荐的现代远程管理方式,功能强大且安全。

准备工作

  • 在远程计算机上启用WinRM:以管理员身份在远程计算机上运行以下命令:
    Enable-PSRemoting -Force
  • 设置信任:在本地计算机上,可以将远程计算机添加到受信任的主机列表(仅适用于测试环境)。
    Set-Item wsman:\localhost\Client\TrustedHosts -Value "WIN-10-PC-01" -Force

在批处理中调用 PowerShell

批处理本身不能直接使用 Invoke-Command,但它可以调用 powershell.exe 来执行。

@echo off
set "remote_pc=WIN-10-PC-01"
set "command=Get-Service -Name 'spooler'"
echo 正在使用PowerShell Remoting执行远程命令...
powershell.exe -Command "Invoke-Command -ComputerName '%remote_pc%' -Credential (Get-Credential) -ScriptBlock { %command% }"
pause

说明

  • -Command:告诉 powershell.exe 要执行的字符串。
  • Invoke-Command:PowerRemoting的核心命令。
  • -ComputerName:远程计算机名。
  • -Credential (Get-Credential):会弹出一个安全的凭据输入窗口,比硬编码密码安全得多。
  • -ScriptBlock { ... }:包含要在远程计算机上执行的代码块。

总结与对比

工具/方法 优点 缺点 适用场景
psexec 功能最全,交互性好,操作直观,可执行GUI程序 需要下载第三方工具,明文密码不安全 日常快速任务,需要交互式操作,部署应用
wmic Windows内置,无需下载,适合获取管理信息 语法复杂,默认不捕获标准输出,交互性差 获取系统信息、状态,适合自动化监控脚本
plink 跨平台(Linux/Unix/Windows),轻量级 需要SSH服务,Windows上非原生 管理Linux服务器,混合环境自动化
PowerShell Remoting 微软官方推荐,基于现代协议,安全性高,功能强大 需要预先配置WinRM,学习曲线稍陡 企业级自动化、复杂脚本、现代Windows环境管理

给新手的建议

  • 如果只是想在Windows计算机之间快速执行一些命令,psexec 是你的首选
  • 记住永远不要在批处理文件中硬编码密码,使用 set /p-Credential (Get-Credential) 的方式来安全地输入凭据。
  • 对于需要将命令输出结果返回给批处理的场景,psexecPowerShell Remoting 更容易实现。
分享:
扫描分享到社交APP
上一篇
下一篇