Last active
October 19, 2025 23:26
-
-
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 |
Damn... I really needed one of the older versions. Thanks for getting back, though! Archive org has the version I'm looking for, but it's for a Windows host. I need the Linux build.
Damn... I really needed one of the older versions. Thanks for getting back, though! Archive org has the version I'm looking for, but it's for a Windows host. I need the Linux build.
https://github.com/201853910/VMwareWorkstation/releases
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
it appears the builds are no longer cached by cloudflare. so, for now, only the latest build which is hosted on archive.org will work.