#!/usr/bin/env bash set -e export MSYS_NO_PATHCONV=1 function with_set_x() { set -x "$@" { ec=$? set +x return $ec } 2>/dev/null } function log() { echo "$*" >&2 } ssh_cmd='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' ssh_copy_id=false args=() subnet_args=() while [[ $# -gt 0 ]]; do arg=$1 shift case "$arg" in -v|-vv*) ssh_cmd+=" -v" args+=("$arg") ;; -r) args+=("-r" "$1") shift ;; --copy-id) ssh_copy_id=true ;; --server-py=*) server_pyenv_ver="${arg#*=}" ;; --client-py=*) client_pyenv_ver="${arg#*=}" ;; -6) ipv6_only=true ;; --sshuttle-bin=*) sshuttle_bin="${arg#*=}" ;; -N|*/*) subnet_args+=("$arg") ;; -*) args+=("$arg") ;; *) if [[ -z "$target" ]]; then target=$arg else args+=("$arg") fi ;; esac done if [[ ${#subnet_args[@]} -eq 0 ]]; then subnet_args=("-N") fi if [[ $target == node-* ]]; then log "Target is a a test-bed node" port="2222" user_part="test:test" host=$("$(dirname "$0")/test-bed" get-ip "$target") index=${target#node-} if [[ $ipv6_only == true ]]; then args+=("2001:0DB8::/112") else args+=("10.55.$index.0/24") fi target="$user_part@$host:$port" if ! command -v sshpass >/dev/null; then log "sshpass is not found. You might have to manually enter ssh password: 'test'" fi if [[ -z $server_pyenv_ver ]]; then log "server-py argumwnt is not specified. Setting it to 3.8" server_pyenv_ver="3.8" fi fi if [[ -n $server_pyenv_ver ]]; then log "Would pass PYENV_VERRSION=$server_pyenv_ver to server. pyenv is required on server to make it work" pycmd="/pyenv/shims/python" ssh_cmd+=" -o SetEnv=PYENV_VERSION=${server_pyenv_ver:-'3'}" args=("--python=$pycmd" "${args[@]}") fi if [[ $ssh_copy_id == true ]]; then log "Trying to make it passwordless" if [[ $target == *@* ]]; then user_part="${target%%@*}" host_part="${target#*@}" else user_part="$(whoami)" host_part="$target" fi if [[ $host_part == *:* ]]; then host="${host_part%:*}" port="${host_part#*:}" else host="$host_part" port="22" fi if [[ $user_part == *:* ]]; then user="${user_part%:*}" password="${user_part#*:}" else user="$user_part" password="" fi cmd=(ssh-copy-id -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p "$port" "$user@$host") if [[ -n $password ]] && command -v sshpass >/dev/null; then cmd=(sshpass -p "$password" "${cmd[@]}") fi with_set_x "${cmd[@]}" fi if [[ -z $sshuttle_bin || "$sshuttle_bin" == dev ]]; then cd "$(dirname "$0")/.." export PYTHONPATH="." if [[ -n $client_pyenv_ver ]]; then log "Using pyenv version: $client_pyenv_ver" command -v pyenv &>/dev/null || log "You have to install pyenv to use --client-py" && exit 1 sshuttle_cmd=(/usr/bin/env PYENV_VERSION="$client_pyenv_ver" pyenv exec python -m sshuttle) else log "Using best python version availble" if [ -x "$(command -v python3)" ] && python3 -c "import sys; sys.exit(not sys.version_info > (3, 5))"; then sshuttle_cmd=(python3 -m sshuttle) else sshuttle_cmd=(python -m sshuttle) fi fi else [[ -n $client_pyenv_ver ]] && log "Can't specify --client-py when --sshuttle-bin is specified" && exit 1 sshuttle_cmd=("$sshuttle_bin") fi if [[ " ${args[*]} " != *" --ssh-cmd "* ]]; then args=("--ssh-cmd" "$ssh_cmd" "${args[@]}") fi if [[ " ${args[*]} " != *" -r "* ]]; then args=("-r" "$target" "${args[@]}") fi set -x "${sshuttle_cmd[@]}" --version exec "${sshuttle_cmd[@]}" "${args[@]}" "${subnet_args[@]}"