Nested SSH session with Paramiko

后端 未结 5 977
眼角桃花
眼角桃花 2020-11-27 03:42

I\'m rewriting a Bash script I wrote into Python. The crux of that script was

ssh -t first.com \"ssh second.com very_remote_command\"

I\'m

5条回答
  •  情深已故
    2020-11-27 04:03

    Here is a small example using paramiko only (and port forwarding):

    import paramiko as ssh
    
    class SSHTool():
        def __init__(self, host, user, auth,
                     via=None, via_user=None, via_auth=None):
            if via:
                t0 = ssh.Transport(via)
                t0.start_client()
                t0.auth_password(via_user, via_auth)
                # setup forwarding from 127.0.0.1: to |host|
                channel = t0.open_channel('direct-tcpip', host, ('127.0.0.1', 0))
                self.transport = ssh.Transport(channel)
            else:
                self.transport = ssh.Transport(host)
            self.transport.start_client()
            self.transport.auth_password(user, auth)
    
        def run(self, cmd):
            ch = self.transport.open_session()
            ch.set_combine_stderr(True)
            ch.exec_command(cmd)
            retcode = ch.recv_exit_status()
            buf = ''
            while ch.recv_ready():
                buf += ch.recv(1024)
            return (buf, retcode)
    
    # The example below is equivalent to
    # $ ssh 10.10.10.10 ssh 192.168.1.1 uname -a
    # The code above works as if these 2 commands were executed:
    # $ ssh -L :192.168.1.1:22 10.10.10.10
    # $ ssh 127.0.0.1: uname -a
    host = ('192.168.1.1', 22)
    via_host = ('10.10.10.10', 22)
    
    ssht = SSHTool(host, 'user1', 'pass1',
        via=via_host, via_user='user2', via_auth='pass2')
    
    print ssht.run('uname -a')
    

提交回复
热议问题