- Published on
VPS Management
913 words5 min read
VPS Management
SSH, rsync, and tunnel aliases for managing multiple VPS instances.
##########################
# VPS Configuration with download paths
declare -A vps_configs=(
["asuna"]="user@<vps-ip>"
["harshit"]="user@<vps-ip>"
)
declare -A vps_download_paths=(
["asuna"]="/home/asuna/rsynced"
)
##########################
# Pull from VPS
_rsync_pull() {
local vps_name="$1"
shift
local recursive=""
if [[ "$1" == "-r" ]]; then
recursive="-r"
shift
fi
local remote_path="$1"
local ip_user="${vps_configs[$vps_name]}"
local download_path="${vps_download_paths[$vps_name]}"
if [[ -z "$remote_path" ]]; then
echo "Usage: rpull:${vps_name} [-r] <path>"
echo " -r for folders"
echo " dl:filename for ${download_path}/"
return 1
fi
if [[ "$remote_path" == dl:* ]]; then
remote_path="${download_path}/${remote_path#dl:}"
elif [[ "$remote_path" != /* ]]; then
remote_path="~/${remote_path}"
fi
rsync -avP -e "ssh -c chacha20-poly1305@openssh.com" $recursive "${ip_user}:${remote_path}" ~/Downloads/
}
##########################
# Push to VPS
_rsync_push() {
local vps_name="$1"
shift
local recursive=""
if [[ "$1" == "-r" ]]; then
recursive="-r"
shift
fi
local local_path="$1"
local ip_user="${vps_configs[$vps_name]}"
local download_path="${vps_download_paths[$vps_name]}"
if [[ -z "$local_path" ]]; then
echo "Usage: rpush:${vps_name} [-r] <path>"
echo " -r for folders"
return 1
fi
rsync -avzP $recursive "${local_path}" "${ip_user}:${download_path}/"
}
_tunnel() {
local vps_name="$1"
shift
local port="$1"
local ip_user="${vps_configs[$vps_name]}"
if [[ -z "$port" ]]; then
echo "Usage: tunnel:${vps_name} <port>"
return 1
fi
if [[ -z "$ip_user" ]]; then
echo "Unknown VPS: ${vps_name}"
return 1
fi
echo "Opening SSH tunnel to ${vps_name} on port ${port}..."
ssh -f -N -L ${port}:localhost:${port} "${ip_user}"
}
_kill_tunnel() {
local port="$1"
if [[ -z "$port" ]]; then
echo "Usage: killtunnel <port>"
return 1
fi
pkill -f "${port}:localhost:${port}"
echo "Killed tunnel on port ${port}"
}
##########################
# Generate aliases
for name ip_user in ${(kv)vps_configs}; do
alias ssh-${name}="TERM=xterm-256color ssh ${ip_user}"
alias rpull:${name}="_rsync_pull ${name}"
alias rpush:${name}="_rsync_push ${name}"
alias tunnel:${name}="_tunnel ${name}"
alias killtunnel="_kill_tunnel"
done
Credits: Aryan Singh