It fetches a given host's IP and connects to that directly This way you can get a low-latency connection but still use Tor as a name service. Sort of.
		
			
				
	
	
		
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#! /usr/bin/env bash
 | 
						|
#
 | 
						|
# ssht
 | 
						|
# Copyright (C) 2018 salt <salt@lap-th-e560-0>
 | 
						|
#
 | 
						|
# Distributed under terms of the MIT license.
 | 
						|
#
 | 
						|
 | 
						|
name="$(basename $0 .sh)"
 | 
						|
 | 
						|
# $1:	Message
 | 
						|
function log() {
 | 
						|
	[ -z ${1+x} ] && return 1
 | 
						|
	printf "\e[94m$name\e[0m: $*\n"
 | 
						|
}
 | 
						|
 | 
						|
# $1:	Binary in $PATH
 | 
						|
function check_program_exists() {
 | 
						|
	if ! which $1 > /dev/null 2>&1; then
 | 
						|
		return 1
 | 
						|
	fi
 | 
						|
	return 0
 | 
						|
}
 | 
						|
 | 
						|
function get_tor_port() {
 | 
						|
	for port in 9050 9051 9150 9151; do
 | 
						|
		if netstat -ntl | grep 127.0.0.1:"$port" > /dev/null 2>&1; then
 | 
						|
			export return="$port"
 | 
						|
			return 0
 | 
						|
		fi
 | 
						|
	done
 | 
						|
	return 1
 | 
						|
}
 | 
						|
 | 
						|
# $1:	Tor Port
 | 
						|
# $2:	Host
 | 
						|
# $*:	Command
 | 
						|
function ssh_through_tor() {
 | 
						|
	[ -z ${3+x} ] && return 1
 | 
						|
	ssh -o ProxyCommand="nc -x 127.0.0.1:$1 \%h \%p" $2 ${*:3}
 | 
						|
}
 | 
						|
 | 
						|
# $1:	Tor Port
 | 
						|
# $2:	Host
 | 
						|
function get_ssh_ip() {
 | 
						|
	# Yes, this is bad and you could totally run it through an SSH tunnel
 | 
						|
	# to avoid the curl requirement on the remote host
 | 
						|
	# Yes, that would avoid an extraneous connection
 | 
						|
	# TODO: That, also add curl to the list of critical requirements
 | 
						|
	log "Checking if host $2 has curl"
 | 
						|
	if ssh_through_tor "$1" "$2" which curl > /dev/null 2>&1; then
 | 
						|
		log "Finding out host's IP through curl"
 | 
						|
		export return="$(ssh_through_tor $1 $2 curl -s http://whatismyip.akamai.com)"
 | 
						|
		return 0
 | 
						|
	fi
 | 
						|
	# TODO: Add more identification methods
 | 
						|
	return 1
 | 
						|
}
 | 
						|
 | 
						|
# $1:	Host
 | 
						|
# $*:	Arguments to ssh
 | 
						|
function main() {
 | 
						|
	if ! [[ "$1" == *.onion ]]; then
 | 
						|
		log "First argument must be a .onion address"
 | 
						|
		exit 1
 | 
						|
	fi
 | 
						|
	for dep in ssh tor netstat nc; do
 | 
						|
		if ! check_program_exists "$dep"; then
 | 
						|
			log "Could not find critical dependency \"$dep\""
 | 
						|
			exit 50
 | 
						|
		fi
 | 
						|
	done
 | 
						|
	if ! get_tor_port; then
 | 
						|
		log "Tor is not running"
 | 
						|
		exit 51
 | 
						|
	fi
 | 
						|
	torport="$return"
 | 
						|
	log "Found Tor listening on local port $torport"
 | 
						|
	if ! get_ssh_ip $torport $1; then
 | 
						|
		log "Failed to determine target's public IP"
 | 
						|
		exit 52
 | 
						|
	fi
 | 
						|
	ssh_ip="$return"
 | 
						|
	log "Found public IP: $ssh_ip"
 | 
						|
	unset return torport
 | 
						|
	exec ssh $ssh_ip ${*:2}
 | 
						|
}
 | 
						|
 | 
						|
main "$@"
 | 
						|
 |