批量给统信UOS安装VMware Workstation,这招太高效了!

原文链接:「链接」

Hello,大家好啊,今天给大家带来一篇实用教程——如何在统信UOS系统上批量安装 VMware Workstation。很多小伙伴在企业环境里都需要给多台机器安装虚拟化软件,如果一台台点开图形界面去安装,不仅效率低,还容易出错。那有没有办法“一键批量部署”呢?答案当然是:有的!今天就带大家从零开始,看看如何通过脚本实现批量静默安装 VMware Workstation,轻轻松松完成自动化运维。


一、准备工作

在开始批量安装之前,我们需要先在控制端(即执行脚本的机器)准备好环境。

1.确认系统环境

本次示例服务端和客户端的环境是:

系统:统信UOS Desktop 20 专业版

内核:Linux 4.19 x86_64

pdsyw@pdsyw1024:~/Desktop$ cat /etc/os-version 

pdsyw@pdsyw1024:~/Desktop$ uname -a



2.服务端安装sshpass

批量脚本需要通过 sshpass 来实现非交互式 SSH 登录:

pdsyw@pdsyw1024:~/Desktop$ sudo apt install sshpass -y



3.创建目录与配置文件

在控制端建立一个专门的目录:

pdsyw@pdsyw1024:~/Desktop$ mkdir install_vmware

pdsyw@pdsyw1024:~/Desktop$ cd install_vmware/




4.准备三个关键文件:

hosts.txt:存放目标主机列表,每行一个 IP(或 user@ip)。

install_vmware_batch.sh:安装脚本文件。

VMware 安装包:如
VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle。

1)创建主机文件

pdsyw@pdsyw1024:~/Desktop/install_vmware$ vim hosts.txt 

pdsyw@pdsyw1024:~/Desktop/install_vmware$ cat hosts.txt 

192.168.80.68



2)编辑安装脚本文件

(脚本文件可在公众号底部--资源链接--群内资源中获取)

pdsyw@pdsyw1024:~/Desktop/install_vmware$ vim install_vmware_batch.sh 

pdsyw@pdsyw1024:~/Desktop/install_vmware$ cat install_vmware_batch.sh



3)赋予脚本可执行权限

pdsyw@pdsyw1024:~/Desktop/install_vmware$ chmod +x install_vmware_batch.sh 



4)拷贝VMware安装包到目录

pdsyw@pdsyw1024:~/Desktop/install_vmware$ cp ../VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle ./



二、执行安装程序

1.执行脚本

(脚本文件可在公众号底部--资源链接--群内资源中获取)

pdsyw@pdsyw1024:~/Desktop/install_vmware$ ./install_vmware_batch.sh




2.查看日志




三、安装完成

安装完成后,就可以直接在统信UOS桌面打开 VMware Workstation 了:

启动 VMware;

输入序列号(如果是个人用户,可以选择跳过);

输入管理员密码;

开始使用虚拟化环境!

1.打开VMware



2.选择序列号



3.输入管理员密码



4.开始使用





四、常见注意事项

控制端必须有 sshpass,否则无法用密码非交互登录:

pdsyw@pdsyw1024:~/Desktop$ sudo apt install sshpass -y

远端账号 pdsyw 具备 sudo 权限,并允许密码模式(脚本会把 1 作为 sudo 密码输入)。

若远端 sudoers 开启了 requiretty,可能需要在 sudoers 里关闭,或对 pdsyw 放宽。

防火墙/网络允许 22 端口访问。

如需强制重装,把 FORCE_INSTALL=true。

如目标很多、网络抖动大,可调低/升高 PARALLEL,并适当增大 ConnectTimeout。


五、脚本详解

(脚本文件可在公众号底部--资源链接--群内资源中获取)

1.严格模式

#!/usr/bin/env bash

set -euo pipefail

#!/usr/bin/env bash:用系统里找到的 bash 解释器执行脚本,兼容性更好。

set -euo pipefail 开启“严格模式”:

-e:任一命令出错(退出码≠0)就立刻退出当前(子)进程,避免静默失败。

-u:引用了未定义变量就报错退出,防止打错变量名。

-o pipefail:管道中任意一环失败都会被当作失败(默认只看最后一环)。



2.变量区:统一配置

HOSTS_FILE="./hosts.txt"

BUNDLE_LOCAL="./VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle"

REMOTE_BUNDLE="/tmp/VMware-Workstation.bundle"

PARALLEL=4

SSH_USER_DEFAULT="pdsyw"

FORCE_INSTALL=false

CLEANUP_REMOTE=true

LOG_DIR="./logs"

 

SSH_PASSWORD="1"

HOSTS_FILE:主机清单文件路径;每行一个目标(可写 ip 或 user@ip)。

BUNDLE_LOCAL:本地待分发的 VMware .bundle 安装包。

REMOTE_BUNDLE:远端保存安装包的位置(放 /tmp 便于写入和清理)。

PARALLEL:并发任务上限(同时安装多少台)。

SSH_USER_DEFAULT:hosts.txt 没写用户名时默认用这个(环境统一为 pdsyw)。

FORCE_INSTALL:已安装是否仍强装(默认 false,避免重复安装)。

CLEANUP_REMOTE:安装结束是否删除远端安装包。

LOG_DIR:每台机器的执行日志目录。

SSH_PASSWORD:固定 SSH 登录密码为 1;同样也被用作 sudo 密码(见后文)。

安全提示:把密码写死在脚本里不安全,至少应限制脚本文件权限(chmod 700),并只在受控环境下使用。



3.小工具函数

trim() { awk '{$1=$1;print}' <<<"$*"; }

去掉行首行尾空白并压缩多余空格,规范化从 hosts.txt 读到的行。


detect_user_host() {

 local raw="$1"

 if [[ "$raw" == *"@"* ]]; then

  echo "$raw"

 else

  echo "${SSH_USER_DEFAULT}@${raw}"

 fi

}

规范化目标主机表示:如果 hosts.txt 里没写用户名,就补上默认用户 pdsyw,形成 user@ip。


remote_exec() {

 local host="$1"; shift

 sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=8 "$host" "$@"

}

通过 sshpass 把密码传给 SSH,实现非交互登录。

-o StrictHostKeyChecking=no:首次连接不需确认指纹(便捷但降低安全;生产可预配 known_hosts)。

-o ConnectTimeout=8:8 秒连不上就放弃,避免长时间卡住。

"$@":把后面的任意参数原样作为远端命令执行。


remote_sudo_exec() {

 local host="$1"; shift

 local cmd="$*"

 sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=8 "$host" \

  "echo "$SSH_PASSWORD" | sudo -SE -p '' bash -lc $(printf %q "$cmd")"

}

在远端以 sudo 执行命令:

echo "$SSH_PASSWORD" | sudo -SE -p '':把密码喂给 sudo;

-S 从标准输入读密码;-E 保留环境;-p '' 取消密码提示文字。

bash -lc "…":启动 login shell(加载 profile 等),并执行一条字符串命令。

$(printf %q "$cmd"):把整段命令安全转义为一个参数,避免引号/空格造成命令注入或分词错误。

假设远端 pdsyw 账号具备 sudo 权限且允许密码模式(不要求TTY)。


copy_bundle() {

 local host="$1"

 sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no "$BUNDLE_LOCAL" "$host:$REMOTE_BUNDLE" >/dev/null

}

用 scp + sshpass 上传安装包到远端固定位置,屏蔽进度输出让日志更干净。



4.单机安装核心流程

install_on_host() {

 local raw="$1"

 local host; host="$(detect_user_host "$(trim "$raw")")"

 local log_file="${LOG_DIR}/$(echo "$host" | tr '@' '_' | tr ':' '_').log"

读入一条主机记录,规范化为 user@ip,并生成对应日志文件名(把 @ 和 : 变成 _,便于落盘)。



{

 echo "==== $(date '+%F %T') 目标机:$host 开始 ===="

用 { … } | tee 包裹所有输出:既打印到屏幕,又写入独立日志文件,便于排障。


 remote_exec "$host" "echo ok >/dev/null" || { echo "[错误] 无法 SSH 到 $host"; exit 2; }

连通性检查:远端能否正常执行命令;失败就打印错误并以退出码 2 结束该主机流程。


 if remote_exec "$host" "command -v vmware >/dev/null 2>&1"; then

  if [[ "$FORCE_INSTALL" != "true" ]]; then

   echo "[跳过] 已安装 VMware,默认跳过(FORCE_INSTALL=true 可强制)。"

   exit 0

  else

   echo "[提示] FORCE_INSTALL=true,将覆盖安装。"

  fi

 fi

幂等性:检测 vmware 命令是否存在。

默认跳过已安装的主机;若把 FORCE_INSTALL=true,则继续覆盖安装。


 echo "[分发] 上传安装包到远端:$REMOTE_BUNDLE"

 copy_bundle "$host"

 remote_exec "$host" "chmod +x $REMOTE_BUNDLE"

分发 .bundle 文件并赋予可执行权限(有些包不自带执行位)。


 echo "[安装] 开始静默安装..."

 remote_sudo_exec "$host" "sh $REMOTE_BUNDLE --console --required --eulas-agreed"

静默安装(完全无 GUI):

--console:控制台模式。

--required:安装必要组件,跳过可选交互。

--eulas-agreed:自动同意许可协议。



 if remote_exec "$host" "vmware --version >/dev/null 2>&1"; then

  ver="$(remote_exec "$host" "vmware --version 2>/dev/null")"

  echo "[成功] 安装完成:$ver"

 else

  echo "[警告] 未检测到 vmware 命令"

 fi

安装完成后再查一次版本号,给出直观确认信息;失败就提示警告,具体原因看该主机日志。


 if [[ "$CLEANUP_REMOTE" == "true" ]]; then

  remote_exec "$host" "rm -f $REMOTE_BUNDLE || true"

  echo "[清理] 已删除远端安装包"

 fi

清理远端安装包,保持盘面干净;|| true 避免在严格模式下因偶发删除失败导致中断。


 echo "==== $(date '+%F %T') 目标机:$host 完成 ===="

} | tee "$log_file"

收尾并把该主机的全程输出写入独立日志。



5.主流程:并发处理所有主机

mkdir -p "$LOG_DIR"

 

[[ -f "$HOSTS_FILE" ]] || { echo "未找到主机清单:$HOSTS_FILE"; exit 1; }

[[ -f "$BUNDLE_LOCAL" ]] || { echo "未找到安装包:$BUNDLE_LOCAL"; exit 1; }

建日志目录、做前置校验,缺文件直接退出。


pids=(); count=0

while IFS= read -r line; do

 line="$(trim "$line")"

 [[ -z "$line" || "$line" =~ ^# ]] && continue

 install_on_host "$line" &

 pids+=($!)

 ((count++))

 if (( count % PARALLEL == 0 )); then

  wait -n 2>/dev/null || true

 fi

done < "$HOSTS_FILE"

 

wait

echo "全部主机处理完成,日志见:$LOG_DIR/"

从 hosts.txt 按行读取目标主机,空行或以 # 开头的注释行被忽略。

install_on_host ... &:后台并发跑单机流程。

PARALLEL 控制同时并发的数量:每提交 PARALLEL 个任务就 wait -n 等待任意一个先结束,保持并发上限稳定。

末尾 wait:等所有后台任务都完成再退出主脚本。

每台主机的日志已单独保存,便于定位失败原因;并发期间,个别主机失败不会阻断其它主机执行(wait -n || true 也避免了严格模式下的全局中止)。


结语

通过这种方式,我们就能在统信UOS环境中高效地完成 VMware Workstation 的批量自动化安装。相比一台台手工点击,批量脚本不仅节省时间,还能保证环境的一致性和可追溯性。如果你在企业里也面临同样的场景,不妨试试这套方法!欢迎大家分享点赞,点个在看和关注吧!

展开阅读全文

更新时间:2025-09-06

标签:科技   高效   批量   脚本   主机   文件   环境   日志   密码   目标   资源   链接

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020- All Rights Reserved. Powered By bs178.com 闽ICP备11008920号
闽公网安备35020302034844号

Top