mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-02 06:08:23 +08:00
433 lines
12 KiB
Bash
Executable File
433 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
# Copyright 2022 Gravitational, Inc
|
|
|
|
# This script detects the current Linux distribution and installs Teleport
|
|
# through its package manager, if supported, or downloading a tarball otherwise.
|
|
# We'll download Teleport from the official website and checksum it to make sure it was properly
|
|
# downloaded before executing.
|
|
|
|
# The script is wrapped inside a function to protect against the connection being interrupted
|
|
# in the middle of the stream.
|
|
|
|
# For more download options, head to https://goteleport.com/download/
|
|
|
|
set -euo pipefail
|
|
|
|
# download uses curl or wget to download a teleport binary
|
|
download() {
|
|
URL=$1
|
|
TMP_PATH=$2
|
|
|
|
echo "Downloading $URL"
|
|
if type curl &>/dev/null; then
|
|
set -x
|
|
# shellcheck disable=SC2086
|
|
$SUDO $CURL -o "$TMP_PATH" "$URL"
|
|
else
|
|
set -x
|
|
# shellcheck disable=SC2086
|
|
$SUDO $CURL -O "$TMP_PATH" "$URL"
|
|
fi
|
|
set +x
|
|
}
|
|
|
|
install_via_apt_get() {
|
|
echo "Installing Teleport v$TELEPORT_VERSION via apt-get"
|
|
add_apt_key
|
|
set -x
|
|
$SUDO apt-get install -y "teleport$TELEPORT_SUFFIX=$TELEPORT_VERSION"
|
|
set +x
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
set -x
|
|
$SUDO apt-get install -y teleport-ent-updater
|
|
set +x
|
|
fi
|
|
}
|
|
|
|
add_apt_key() {
|
|
APT_REPO_ID=$ID
|
|
APT_REPO_VERSION_CODENAME=$VERSION_CODENAME
|
|
IS_LEGACY=0
|
|
|
|
# check if we must use legacy .asc key
|
|
case "$ID" in
|
|
ubuntu | pop | neon | zorin)
|
|
if ! expr "$VERSION_ID" : "2.*" >/dev/null; then
|
|
IS_LEGACY=1
|
|
fi
|
|
;;
|
|
debian | raspbian)
|
|
if [ "$VERSION_ID" -lt 11 ]; then
|
|
IS_LEGACY=1
|
|
fi
|
|
;;
|
|
linuxmint | parrot)
|
|
if [ "$VERSION_ID" -lt 5 ]; then
|
|
IS_LEGACY=1
|
|
fi
|
|
;;
|
|
elementary)
|
|
if [ "$VERSION_ID" -lt 6 ]; then
|
|
IS_LEGACY=1
|
|
fi
|
|
;;
|
|
kali)
|
|
YEAR="$(echo "$VERSION_ID" | cut -f1 -d.)"
|
|
if [ "$YEAR" -lt 2021 ]; then
|
|
IS_LEGACY=1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if [[ "$IS_LEGACY" == 0 ]]; then
|
|
# set APT_REPO_ID if necessary
|
|
case "$ID" in
|
|
linuxmint | kali | elementary | pop | raspbian | neon | zorin | parrot)
|
|
APT_REPO_ID=$ID_LIKE
|
|
;;
|
|
esac
|
|
|
|
# set APT_REPO_VERSION_CODENAME if necessary
|
|
case "$ID" in
|
|
linuxmint | elementary | pop | neon | zorin)
|
|
APT_REPO_VERSION_CODENAME=$UBUNTU_CODENAME
|
|
;;
|
|
kali)
|
|
APT_REPO_VERSION_CODENAME="bullseye"
|
|
;;
|
|
parrot)
|
|
APT_REPO_VERSION_CODENAME="buster"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
echo "Downloading Teleport's PGP public key..."
|
|
TEMP_DIR=$(mktemp -d -t teleport-XXXXXXXXXX)
|
|
MAJOR=$(echo "$TELEPORT_VERSION" | cut -f1 -d.)
|
|
TELEPORT_REPO=""
|
|
|
|
CHANNEL="stable/v${MAJOR}"
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
CHANNEL="stable/cloud"
|
|
fi
|
|
|
|
if [[ "$IS_LEGACY" == 1 ]]; then
|
|
if ! type gpg >/dev/null; then
|
|
echo "Installing gnupg"
|
|
set -x
|
|
$SUDO apt-get update
|
|
$SUDO apt-get install -y gnupg
|
|
set +x
|
|
fi
|
|
TMP_KEY="$TEMP_DIR/teleport-pubkey.asc"
|
|
download "https://deb.releases.teleport.dev/teleport-pubkey.asc" "$TMP_KEY"
|
|
set -x
|
|
$SUDO apt-key add "$TMP_KEY"
|
|
set +x
|
|
TELEPORT_REPO="deb https://apt.releases.teleport.dev/${APT_REPO_ID?} ${APT_REPO_VERSION_CODENAME?} ${CHANNEL}"
|
|
else
|
|
TMP_KEY="$TEMP_DIR/teleport-pubkey.gpg"
|
|
download "https://apt.releases.teleport.dev/gpg" "$TMP_KEY"
|
|
set -x
|
|
$SUDO mkdir -p /etc/apt/keyrings
|
|
$SUDO cp "$TMP_KEY" /etc/apt/keyrings/teleport-archive-keyring.asc
|
|
set +x
|
|
TELEPORT_REPO="deb [signed-by=/etc/apt/keyrings/teleport-archive-keyring.asc] https://apt.releases.teleport.dev/${APT_REPO_ID?} ${APT_REPO_VERSION_CODENAME?} ${CHANNEL}"
|
|
fi
|
|
|
|
set -x
|
|
echo "$TELEPORT_REPO" | $SUDO tee /etc/apt/sources.list.d/teleport.list >/dev/null
|
|
set +x
|
|
|
|
set -x
|
|
$SUDO apt-get update
|
|
set +x
|
|
}
|
|
|
|
# $1 is the value of the $ID path segment in the YUM repo URL. In
|
|
# /etc/os-release, this is either the value of $ID or $ID_LIKE.
|
|
install_via_yum() {
|
|
# shellcheck source=/dev/null
|
|
source /etc/os-release
|
|
|
|
# Get the major version from the version ID.
|
|
VERSION_ID=$(echo "$VERSION_ID" | grep -Eo "^[0-9]+")
|
|
TELEPORT_MAJOR_VERSION="v$(echo "$TELEPORT_VERSION" | grep -Eo "^[0-9]+")"
|
|
|
|
CHANNEL="stable/${TELEPORT_MAJOR_VERSION}"
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
CHANNEL="stable/cloud"
|
|
fi
|
|
|
|
if type dnf &>/dev/null; then
|
|
echo "Installing Teleport v$TELEPORT_VERSION through dnf"
|
|
$SUDO dnf install -y 'dnf-command(config-manager)'
|
|
$SUDO dnf config-manager --add-repo "$(rpm --eval "https://yum.releases.teleport.dev/$1/$VERSION_ID/Teleport/%{_arch}/$CHANNEL/teleport-yum.repo")"
|
|
$SUDO dnf install -y "teleport$TELEPORT_SUFFIX-$TELEPORT_VERSION"
|
|
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
$SUDO dnf install -y teleport-ent-updater
|
|
fi
|
|
|
|
else
|
|
echo "Installing Teleport v$TELEPORT_VERSION through yum"
|
|
$SUDO yum install -y yum-utils
|
|
$SUDO yum-config-manager --add-repo "$(rpm --eval "https://yum.releases.teleport.dev/$1/$VERSION_ID/Teleport/%{_arch}/$CHANNEL/teleport-yum.repo")"
|
|
$SUDO yum install -y "teleport$TELEPORT_SUFFIX-$TELEPORT_VERSION"
|
|
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
$SUDO yum install -y teleport-ent-updater
|
|
fi
|
|
fi
|
|
set +x
|
|
}
|
|
|
|
install_via_zypper() {
|
|
# shellcheck source=/dev/null
|
|
source /etc/os-release
|
|
|
|
# Get the major version from the version ID.
|
|
VERSION_ID=$(echo "$VERSION_ID" | grep -Eo "^[0-9]+")
|
|
TELEPORT_MAJOR_VERSION="v$(echo "$TELEPORT_VERSION" | grep -Eo "^[0-9]+")"
|
|
|
|
CHANNEL="stable/${TELEPORT_MAJOR_VERSION}"
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
CHANNEL="stable/cloud"
|
|
fi
|
|
|
|
$SUDO rpm --import https://zypper.releases.teleport.dev/gpg
|
|
$SUDO zypper addrepo --refresh --repo "$(rpm --eval "https://zypper.releases.teleport.dev/$ID/$VERSION_ID/Teleport/%{_arch}/$CHANNEL/teleport-zypper.repo")"
|
|
$SUDO zypper --gpg-auto-import-keys refresh teleport
|
|
$SUDO zypper install -y "teleport$TELEPORT_SUFFIX"
|
|
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
$SUDO zypper install -y teleport-ent-updater
|
|
fi
|
|
|
|
set +x
|
|
}
|
|
|
|
|
|
# download .tar.gz file via curl/wget, unzip it and run the install script
|
|
install_via_curl() {
|
|
TEMP_DIR=$(mktemp -d -t teleport-XXXXXXXXXX)
|
|
|
|
TELEPORT_FILENAME="teleport$TELEPORT_SUFFIX-v$TELEPORT_VERSION-linux-$ARCH-bin.tar.gz"
|
|
URL="https://cdn.teleport.dev/${TELEPORT_FILENAME}"
|
|
download "${URL}" "${TEMP_DIR}/${TELEPORT_FILENAME}"
|
|
|
|
TMP_CHECKSUM="${TEMP_DIR}/${TELEPORT_FILENAME}.sha256"
|
|
download "${URL}.sha256" "$TMP_CHECKSUM"
|
|
|
|
set -x
|
|
cd "$TEMP_DIR"
|
|
# shellcheck disable=SC2086
|
|
$SUDO $SHA_COMMAND -c "$TMP_CHECKSUM"
|
|
cd -
|
|
|
|
$SUDO tar -xzf "${TEMP_DIR}/${TELEPORT_FILENAME}" -C "$TEMP_DIR"
|
|
$SUDO "$TEMP_DIR/teleport${TELEPORT_SUFFIX}/install"
|
|
set +x
|
|
}
|
|
|
|
# wrap script in a function so a partially downloaded script
|
|
# doesn't execute
|
|
install_teleport() {
|
|
# exit if not on Linux
|
|
if [[ $(uname) != "Linux" ]]; then
|
|
echo "ERROR: This script works only for Linux. Please go to the downloads page to find the proper installation method for your operating system:"
|
|
echo "https://goteleport.com/download/"
|
|
exit 1
|
|
fi
|
|
|
|
KERNEL_VERSION=$(uname -r)
|
|
MIN_VERSION="2.6.23"
|
|
if [ $MIN_VERSION != "$(echo -e "$MIN_VERSION\n$KERNEL_VERSION" | sort -V | head -n1)" ]; then
|
|
echo "ERROR: Teleport requires Linux kernel version $MIN_VERSION+"
|
|
exit 1
|
|
fi
|
|
|
|
# check if can run as admin either by running as root or by
|
|
# having 'sudo' or 'doas' installed
|
|
IS_ROOT=""
|
|
SUDO=""
|
|
if [ "$(id -u)" = 0 ]; then
|
|
# running as root, no need for sudo/doas
|
|
IS_ROOT="YES"
|
|
SUDO=""
|
|
elif type sudo &>/dev/null; then
|
|
SUDO="sudo"
|
|
elif type doas &>/dev/null; then
|
|
SUDO="doas"
|
|
fi
|
|
|
|
if [ -z "$SUDO" ] && [ -z "$IS_ROOT" ]; then
|
|
echo "ERROR: The installer requires a way to run commands as root."
|
|
echo "Either run this script as root or install sudo/doas."
|
|
exit 1
|
|
fi
|
|
|
|
# require curl/wget
|
|
CURL=""
|
|
if type curl &>/dev/null; then
|
|
CURL="curl -fL"
|
|
elif type wget &>/dev/null; then
|
|
CURL="wget"
|
|
fi
|
|
if [ -z "$CURL" ]; then
|
|
echo "ERROR: This script requires either curl or wget in order to download files. Please install one of them and try again."
|
|
exit 1
|
|
fi
|
|
|
|
# require shasum/sha256sum
|
|
SHA_COMMAND=""
|
|
if type shasum &>/dev/null; then
|
|
SHA_COMMAND="shasum -a 256"
|
|
elif type sha256sum &>/dev/null; then
|
|
SHA_COMMAND="sha256sum"
|
|
else
|
|
echo "ERROR: This script requires sha256sum or shasum to validate the download. Please install it and try again."
|
|
exit 1
|
|
fi
|
|
|
|
# detect distro
|
|
OS_RELEASE=/etc/os-release
|
|
ID=""
|
|
ID_LIKE=""
|
|
VERSION_CODENAME=""
|
|
UBUNTU_CODENAME=""
|
|
if [[ -f "$OS_RELEASE" ]]; then
|
|
# shellcheck source=/dev/null
|
|
. $OS_RELEASE
|
|
fi
|
|
# Some $ID_LIKE values include multiple distro names in an arbitrary order, so
|
|
# evaluate the first one.
|
|
ID_LIKE="${ID_LIKE%% *}"
|
|
|
|
# detect architecture
|
|
ARCH=""
|
|
case $(uname -m) in
|
|
x86_64)
|
|
ARCH="amd64"
|
|
;;
|
|
i386)
|
|
ARCH="386"
|
|
;;
|
|
armv7l)
|
|
ARCH="arm"
|
|
;;
|
|
aarch64)
|
|
ARCH="arm64"
|
|
;;
|
|
**)
|
|
echo "ERROR: Your system's architecture isn't officially supported or couldn't be determined."
|
|
echo "Please refer to the installation guide for more information:"
|
|
echo "https://goteleport.com/docs/installation/"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# select install method based on distribution
|
|
# if ID is debian derivate, run apt-get
|
|
case "$ID" in
|
|
debian | ubuntu | kali | linuxmint | pop | raspbian | neon | zorin | parrot | elementary)
|
|
install_via_apt_get
|
|
;;
|
|
# if ID is amazon Linux 2/RHEL/etc, run yum
|
|
centos | rhel | amzn)
|
|
install_via_yum "$ID"
|
|
;;
|
|
sles)
|
|
install_via_zypper
|
|
;;
|
|
*)
|
|
# before downloading manually, double check if we didn't miss any debian or
|
|
# rh/fedora derived distros using the ID_LIKE var.
|
|
case "${ID_LIKE}" in
|
|
ubuntu | debian)
|
|
install_via_apt_get
|
|
;;
|
|
centos | fedora | rhel)
|
|
# There is no repository for "fedora", and there is no difference
|
|
# between the repositories for "centos" and "rhel", so pick an arbitrary
|
|
# one.
|
|
install_via_yum rhel
|
|
;;
|
|
*)
|
|
if [ "$TELEPORT_EDITION" = "cloud" ]; then
|
|
echo "The system does not support a package manager, which is required for Teleport Enterprise Cloud."
|
|
exit 1
|
|
fi
|
|
|
|
# if ID and ID_LIKE didn't return a supported distro, download through curl
|
|
echo "There is no officially supported package for your package manager. Downloading and installing Teleport via curl."
|
|
install_via_curl
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
GREEN='\033[0;32m'
|
|
COLOR_OFF='\033[0m'
|
|
|
|
echo ""
|
|
echo -e "${GREEN}$(teleport version) installed successfully!${COLOR_OFF}"
|
|
echo ""
|
|
echo "The following commands are now available:"
|
|
if type teleport &>/dev/null; then
|
|
echo " teleport - The daemon that runs the Auth Service, Proxy Service, and other Teleport services."
|
|
fi
|
|
if type tsh &>/dev/null; then
|
|
echo " tsh - A tool that lets end users interact with Teleport."
|
|
fi
|
|
if type tctl &>/dev/null; then
|
|
echo " tctl - An administrative tool that can configure the Teleport Auth Service."
|
|
fi
|
|
if type tbot &>/dev/null; then
|
|
echo " tbot - Teleport Machine ID client."
|
|
fi
|
|
if type fdpass-teleport &>/dev/null; then
|
|
echo " fdpass-teleport - Teleport Machine ID client."
|
|
fi
|
|
if type teleport-update &>/dev/null; then
|
|
echo " teleport-update - Teleport auto-update agent."
|
|
fi
|
|
}
|
|
|
|
# The suffix is "-ent" if we are installing a commercial edition of Teleport and
|
|
# empty for Teleport Community Edition.
|
|
TELEPORT_SUFFIX=""
|
|
TELEPORT_VERSION=""
|
|
TELEPORT_EDITION=""
|
|
if [ $# -ge 1 ] && [ -n "$1" ]; then
|
|
TELEPORT_VERSION=$1
|
|
else
|
|
if [ -z "$TELEPORT_VERSION" ]; then
|
|
echo "ERROR: Please provide the version you want to install (e.g., 10.1.9)."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if ! echo "$TELEPORT_VERSION" | grep -qE "[0-9]+\.[0-9]+\.[0-9]+"; then
|
|
echo "ERROR: The first parameter must be a version number, e.g., 10.1.9."
|
|
exit 1
|
|
fi
|
|
|
|
if [ $# -ge 2 ] && [ -n "$2" ]; then
|
|
TELEPORT_EDITION=$2
|
|
|
|
case $TELEPORT_EDITION in
|
|
enterprise | cloud)
|
|
TELEPORT_SUFFIX="-ent"
|
|
;;
|
|
# An empty edition defaults to OSS.
|
|
oss | "" )
|
|
;;
|
|
*)
|
|
echo 'ERROR: The second parameter must be "oss", "cloud", or "enterprise".'
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
install_teleport
|