Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

paramiko/ Socket closes after returning console object from function

I try to return socket object from function, but after return socket immediatly closes. Any help is greatly appreciated :) Thanks

def get_connection(ip, log, paswd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, username=log, password=paswd, timeout=100)
    console = ssh.invoke_shell()
    print(console)
    return console


def get_version(console, host):
    promt = console.recv(1000)
    if '>' in str(promt):
        console.send('enable\n')
        console.send('P@ssw0rd\n')
    console.send('terminal length 0\n')
    console.send('show version\n')
    time.sleep(2)
    out = console.recv(5000).decode('utf-8')
    system_version_finder = re.search('#show version\r\n(.+)', out)
    if system_version_finder:
        system_version = system_version_finder.group(1)
    else:
        system_version = 'Unknown'
    print(host + '\s' + system_version)


def upload_config(console, file_path):
    console.send('configure terminal\n')
    with open(file_path, 'r') as config_file:
        for line in config_file:
            console.send(line)

for host in options.ip_address_list:
    console = get_connection(host, options.login, options.password)
    print(console)
    get_version(console, host)
    if options.conf_file_path:
        upload_config(console, options.conf_file_path)

This is output of script:

<paramiko.Channel 0 (open) window=1024 -> <paramiko.Transport at 0x34f5e10 (cipher aes128-cbc, 128 bits) (active; 1 open channel(s))>>
<paramiko.Channel 0 (closed) -> <paramiko.Transport at 0x34f5e10 (unconnected)>>
Traceback (most recent call last):
  File "llearn.py", line 65, in <module>
    get_version(console, host)
  File "llearn.py", line 32, in get_version
    console.send('terminal length 0\n')
  File "C:\Program Files (x86)\Python\lib\site-packages\paramiko-1.16.0-py3.4.egg\paramiko\channel.py", line 698, in send
  File "C:\Program Files (x86)\Python\lib\site-packages\paramiko-1.16.0-py3.4.egg\paramiko\channel.py", line 1058, in _send
OSError: Socket is closed
like image 661
Антон Кузенков Avatar asked Jun 05 '15 14:06

Антон Кузенков


1 Answers

Hmm, I think the contents of ssh in get_connection might be garbage collected after the function returns, because paramiko isn't holding on to it in console.

Try:

def get_connection(ip, log, paswd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, username=log, password=paswd, timeout=100)
    console = ssh.invoke_shell()
    console.keep_this = ssh
    print(console)
    return console

Note we're now storing a reference to ssh on console.

On FreeBSD, your version doesn't produce errors, but it doesn't seem to work either. Adding that line makes it work for me.

like image 77
Jay Kominek Avatar answered Oct 08 '22 04:10

Jay Kominek