原文链接:「链接」
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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-=date("Y",time());?> All Rights Reserved. Powered By bs178.com 闽ICP备11008920号
闽公网安备35020302034844号