Skip to content

Instantly share code, notes, and snippets.

@jetfir3
Last active August 3, 2025 21:27
Show Gist options
  • Save jetfir3/e25e74a42e7c7ac2c808a537b12dc768 to your computer and use it in GitHub Desktop.
Save jetfir3/e25e74a42e7c7ac2c808a537b12dc768 to your computer and use it in GitHub Desktop.
Download VMware Workstation for Linux without a Broadcom Account
#!/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
@jetfir3
Copy link
Author

jetfir3 commented Aug 3, 2025

  • Run script to download without sign-up
  • Use -k to keep download file compressed, exiting after download (ignored for v17.6.4 and higher)
  • Use -v VERSION to specify the desired version (12.0.0 or higher required)

Run directly with:

bash <(curl -sSL https://gist.github.com/jetfir3/e25e74a42e7c7ac2c808a537b12dc768/raw/download_workstation.sh)

Example with arguments:

bash <(curl -sSL https://gist.github.com/jetfir3/e25e74a42e7c7ac2c808a537b12dc768/raw/download_workstation.sh) -k -v 17.6.3

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:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment