Last active
August 3, 2025 21:27
-
-
Save jetfir3/e25e74a42e7c7ac2c808a537b12dc768 to your computer and use it in GitHub Desktop.
Download VMware Workstation for Linux without a Broadcom Account
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Download VMware Workstation for Linux | |
# Handles legacy versions (12.x - 17.6.3) from Cloudflare CDN cache and | |
# newer versions (17.6.4+) from Archive.org. | |
# | |
# Use '-k' to keep the CDN download file compressed, exiting after download. (Ignored for v17.6.4+) | |
# Use '-v <Version>' to specify desired version directly. | |
BASE_URL="https://softwareupdate-prod.broadcom.com/cds/vmw-desktop/" | |
CDN_MIRROR="softwareupdate-prod.broadcom.com:443:softwareupdate-prod.broadcom.com.cdn.cloudflare.net:443" | |
declare -A ARCHIVE_URLS | |
ARCHIVE_URLS["17.6.4"]="https://archive.org/download/vmware-workstation-full-17.6.4-24832109.x86_64/VMware-Workstation-Full-17.6.4-24832109.x86_64.bundle" | |
# Cloudflare CDN metadata | |
read -r -d '' XML_DATA << 'EOF' | |
<metalist> | |
<metadata><version>12.0.0</version><url>ws/12.0.0/2985596/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.0.1/3160714/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.1.0/3272444/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.1.1/3770994/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.0/4352439/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.1/4542065/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.2/4638234/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.3/5115892/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.4/5192485/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.5/5234757/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.6/5528349/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.7/5813279/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.8/7098237/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.9/7535481/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.0.0/6661328/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.0/7370693/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.1/7528167/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.2/8497320/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.3/9474260/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.4/10722678/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.5/10950780/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.6/12368378/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.7/12989993/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.0/10134415/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.1/10737736/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.2/10952284/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.3/12422535/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.4/12990004/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.1.0/13591040/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.0/14665864/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.1/15018445/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.2/15785246/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.5/16285975/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.6/16341506/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.7/17171714/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.0.0/16894299/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.1.0/17198959/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.1.1/17801498/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.1.2/17966106/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.0/18760230/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.1/18811642/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.3/19376536/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.4/20089737/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.5/20904516/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.0.0/20800274/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.0.1/21139696/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.0.2/21581411/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.5.0/22583795/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.5.1/23298084/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.5.2/23775571/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.0/24238078/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.1/24319023/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.2/24409262/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.3/24583834/linux/core/</url></metadata> | |
</metalist> | |
EOF | |
KEEP_COMPRESSED=false | |
USER_VERSION="" | |
VERSION="" | |
BUILD="" | |
while getopts "kv:" opt; do | |
case $opt in | |
k) KEEP_COMPRESSED=true ;; | |
v) USER_VERSION=$OPTARG ;; | |
*) echo "Usage: $0 [-k] [-v VERSION]" >&2; exit 1 ;; | |
esac | |
done | |
requirements_check() { | |
command -v curl >/dev/null 2>&1 || { echo "Error: curl is required but not installed." >&2; exit 1; } | |
command -v grep >/dev/null 2>&1 || { echo "Error: grep is required but not installed." >&2; exit 1; } | |
command -v awk >/dev/null 2>&1 || { echo "Error: awk is required but not installed." >&2; exit 1; } | |
command -v sed >/dev/null 2>&1 || { echo "Error: sed is required but not installed." >&2; exit 1; } | |
command -v tar >/dev/null 2>&1 || { echo "Error: tar is required but not installed." >&2; exit 1; } | |
command -v sort >/dev/null 2>&1 || { echo "Error: sort is required but not installed." >&2; exit 1; } | |
} | |
requirements_check | |
if [[ $(uname | tr '[:upper:]' '[:lower:]') != "linux"* ]]; then | |
KEEP_COMPRESSED=true | |
echo "Warning: Not running on Linux. Forcing keep compressed." >&2 | |
fi | |
if sort --version 2>/dev/null | grep -q "GNU coreutils"; then | |
SORT_CMD="sort -V" | |
SORT_UNIQUE_CMD="sort -uV" | |
else | |
SORT_CMD="sort -t. -k1,1n -k2,2n -k3,3n -k4,4n" | |
SORT_UNIQUE_CMD="sort -t. -k1,1n -k2,2n -k3,3n -k4,4n -u" | |
fi | |
version_gte() { | |
printf '%s\n%s\n' "$1" "$2" | eval "$SORT_CMD" | head -n 1 | grep -q "^$2$" | |
} | |
get_all_available_versions() { | |
local cdn_versions | |
cdn_versions=$(echo "$XML_DATA" | grep -oP 'ws/\K[0-9]+\.[0-9]+\.[0-9]+' | eval "$SORT_UNIQUE_CMD") | |
local archive_versions | |
archive_versions=$(printf "%s\n" "${!ARCHIVE_URLS[@]}") | |
printf "%s\n%s" "$cdn_versions" "$archive_versions" | eval "$SORT_UNIQUE_CMD" | |
} | |
get_build_for_cdn_version() { | |
local target_version="$1" | |
echo "$XML_DATA" | grep "<url>ws/${target_version}/" | sed -n 's%.*<url>ws/'"$target_version"'/\([0-9]*\)/.*%\1%p' | |
} | |
if [[ -n "$USER_VERSION" ]]; then | |
VERSION="$USER_VERSION" | |
else | |
echo "Available versions:" | |
mapfile -t all_versions < <(get_all_available_versions) | |
[[ ${#all_versions[@]} -eq 0 ]] && { echo "No available versions found." >&2; exit 1; } | |
PS3="Select a version: " | |
select ver in "${all_versions[@]}"; do | |
[[ -n "$ver" ]] && { VERSION=$ver; break; } || echo "Invalid selection. Please try again." | |
done | |
fi | |
if [[ -v "ARCHIVE_URLS[$VERSION]" ]]; then | |
DOWNLOAD_URL="${ARCHIVE_URLS[$VERSION]}" | |
DOWNLOAD_DIR="${HOME}" | |
DOWNLOAD_FILE="${DOWNLOAD_DIR}/$(basename "${DOWNLOAD_URL}")" | |
echo "Selected new version: $VERSION" | |
echo "Downloading from Archive.org..." | |
if [[ "$KEEP_COMPRESSED" = true ]]; then | |
echo "Info: -k flag is ignored for versions 17.6.4 and newer as they are not compressed." | |
fi | |
curl -L --progress-bar -f -o "${DOWNLOAD_FILE}" "${DOWNLOAD_URL}" || { | |
echo "Error: Download failed for ${DOWNLOAD_URL}." >&2 | |
exit 1 | |
} | |
echo "Setting permissions..." | |
chmod +x "${DOWNLOAD_FILE}" | |
echo -e "\nFinished. You can now run the installer bundle." | |
echo "VMware Workstation bundle location: ${DOWNLOAD_FILE}" | |
else | |
BUILD=$(get_build_for_cdn_version "$VERSION") | |
[[ -z "$BUILD" ]] && { echo "Error: Version ${VERSION} not found in the embedded XML data." >&2; exit 1; } | |
echo "Selected legacy version: $VERSION with build: $BUILD" | |
DOWNLOAD_URL="${BASE_URL}ws/${VERSION}/${BUILD}/linux/core/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle.tar" | |
DOWNLOAD_DIR="${HOME}" | |
DOWNLOAD_FILE="${DOWNLOAD_DIR}/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle.tar" | |
EXTRACT_DIR="${DOWNLOAD_DIR}/VMware-Workstation-${VERSION}-${BUILD}" | |
BUNDLE_PATH="${EXTRACT_DIR}/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle" | |
echo "Downloading VMware Workstation v${VERSION} (${BUILD}) from CDN cache..." | |
mkdir -p "${DOWNLOAD_DIR}" | |
check_url() { | |
curl -s --head --connect-to "$CDN_MIRROR" "$1" | head -n 1 | grep "200" >/dev/null | |
} | |
check_url "$DOWNLOAD_URL" || { echo "Error: Installer file not found at $DOWNLOAD_URL via CDN." >&2; exit 1; } | |
curl -k -q --progress-bar -f -o "${DOWNLOAD_FILE}" --connect-to "$CDN_MIRROR" "${DOWNLOAD_URL}" || { | |
echo "Error: Download failed for ${DOWNLOAD_URL}." >&2 | |
exit 1 | |
} | |
if [[ "$KEEP_COMPRESSED" = true ]]; then | |
echo -e "\nFinished. Downloaded file location: ${DOWNLOAD_FILE}" | |
exit 0 | |
fi | |
echo "Extracting tar..." | |
mkdir -p "${EXTRACT_DIR}" && \ | |
tar -xf "${DOWNLOAD_FILE}" -C "${EXTRACT_DIR}" || { | |
echo "Error: Extraction of tar file failed. File may be corrupt." >&2 | |
echo "Downloaded file location: ${DOWNLOAD_FILE}" >&2 | |
rm -rf "${EXTRACT_DIR}" | |
exit 1 | |
} | |
echo "Cleaning up..." | |
chmod +x "${EXTRACT_DIR}/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle" | |
rm -f "${DOWNLOAD_FILE}" "${EXTRACT_DIR}/descriptor.xml" 2>/dev/null | |
echo -e "\nFinished. You can now run the installer bundle." | |
echo "VMware Workstation bundle location: ${BUNDLE_PATH}" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-k
to keep download file compressed, exiting after download (ignored for v17.6.4 and higher)-v VERSION
to specify the desired version (12.0.0 or higher required)Run directly with:
Example with arguments:
VMware Tools:
https://packages-prod.broadcom.com/tools/
Latest - https://packages-prod.broadcom.com/tools/releases/latest/
Legacy / macOS - https://packages-prod.broadcom.com/tools/frozen/
Linux / Windows - https://packages-prod.broadcom.com/tools/releases/
VMware Download scripts for other platforms: