0

I am posting the question and the answer, I found, as well, incase it would help someone. The following were my minimum requirements:

1. Client machine is Windows 10 and remote server is Linux
2. Connect to remote server via SSH through HTTP Proxy
3. HTTP Proxy uses Basic Authentication
4. Run commands on remote server and display output

The purpose of the script was to login to the remote server, run a bash script (check.sh) present on the server and display the result. The Bash script simply runs a list of commands displaying the overall health of the server.

There have been numerous discussions, here, on how to implement HTTP Proxy or running remote commands using Paramiko. However, I could not find the combination of both.

from urllib.parse import urlparse
from http.client import HTTPConnection
import paramiko
from base64 import b64encode

# host details
host = "remote-server-IP"
port = 22

# proxy connection & socket definition
proxy_url = "http://uname001:passw0rd123@HTTP-proxy-server-IP:proxy-port"
url = urlparse(proxy_url)
http_con = HTTPConnection(url.hostname, url.port)
auth = b64encode(bytes(url.username + ':' + url.password,"utf-8")).decode("ascii")

headers = { 'Proxy-Authorization' : 'Basic %s' % auth }

http_con.set_tunnel(host, port, headers)
http_con.connect()
sock = http_con.sock

# ssh connection
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
        ssh.connect(hostname=host, port=port, username='remote-server-uname', password='remote-server-pwd', sock=sock)
except paramiko.SSHException:
        print("Connection Failed")
        quit()

stdin,stdout,stderr = ssh.exec_command("./check")

for line in stdout.readlines():
        print(line.strip())
ssh.close()

I would welcome any suggestions to the code as I am a network analyst and not a coder but keen to learn and improve.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
Prince
  • 33
  • 4

1 Answers1

0

I do not think that your proxy code is correct.

For a working proxy code, see How to ssh over http proxy in Python?, particularly the answer by @tintin.

As it seems that you need to authenticate to the proxy, after the CONNECT command, add a Proxy-Authorization header like:

Proxy-Authorization: Basic <credentials>

where the <credentials> is base-64 encoded string username:password.

cmd_connect = "CONNECT {}:{} HTTP/1.1\r\nProxy-Authorization: Basic <credentials>\r\n\r\n".format(*target)
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992