~/snippets/vps
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