SSH - Python with paramiko issue

前端 未结 2 1266
刺人心
刺人心 2021-01-12 09:13

I\'ve been trying to get this to work but keep getting the same errors. I\'ve tried the fqdn and ip of the host. I\'ve tried to pass it with credentials and without. I\'ve l

相关标签:
2条回答
  • 2021-01-12 10:10

    before ssh.connect you need:
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    Then you need to do something with stdout.read() like:

    print stdout.read()
    
    0 讨论(0)
  • 2021-01-12 10:12

    You should provide either a password or a private key (or both), otherwise the SSH client does not know how to authenticate with the login data.

    Here is my code example for your reference.

    #!/usr/bin/python
    
    from StringIO import StringIO
    import paramiko 
    
    class SshClient:
        "A wrapper of paramiko.SSHClient"
        TIMEOUT = 4
    
        def __init__(self, host, port, username, password, key=None, passphrase=None):
            self.username = username
            self.password = password
            self.client = paramiko.SSHClient()
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            if key is not None:
                key = paramiko.RSAKey.from_private_key(StringIO(key), password=passphrase)
            self.client.connect(host, port, username=username, password=password, pkey=key, timeout=self.TIMEOUT)
    
        def close(self):
            if self.client is not None:
                self.client.close()
                self.client = None
    
        def execute(self, command, sudo=False):
            feed_password = False
            if sudo and self.username != "root":
                command = "sudo -S -p '' %s" % command
                feed_password = self.password is not None and len(self.password) > 0
            stdin, stdout, stderr = self.client.exec_command(command)
            if feed_password:
                stdin.write(self.password + "\n")
                stdin.flush()
            return {'out': stdout.readlines(), 
                    'err': stderr.readlines(),
                    'retval': stdout.channel.recv_exit_status()}
    
    if __name__ == "__main__":
        client = SshClient(host='host', port=22, username='username', password='password') 
        try:
           ret = client.execute('dmesg', sudo=True)
           print "  ".join(ret["out"]), "  E ".join(ret["err"]), ret["retval"]
        finally:
          client.close() 
    
    0 讨论(0)
提交回复
热议问题