Python类继承,缺少属性
问题描述:
我学习Python和Python的脚本在我的学习道路运行远程SSH命令 脚本本身运行正常,但它打破当我要进行实验类继承功能。Python类继承,缺少属性
原创剧本pyssh.py:
#!/usr/bin/env python
import sys
import socket
import paramiko
#=================================
# Class: PySSH
#=================================
class PySSH:
def __init__ (self):
self.ssh = None
self.transport = None
def disconnect (self):
if self.transport is not None:
self.transport.close()
if self.ssh is not None:
self.ssh.close()
def connect(self,hostname,username,password,port=22):
self.hostname = hostname
self.username = username
self.password = password
self.ssh = paramiko.SSHClient()
#Don't use host key auto add policy for production servers
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.load_system_host_keys()
try:
self.ssh.connect(hostname,port,username,password)
self.transport=self.ssh.get_transport()
except (socket.error,paramiko.AuthenticationException) as message:
print "ERROR: SSH connection to "+self.hostname+" failed: " +str(message)
sys.exit(1)
return self.transport is not None
def runcmd(self,cmd,sudoenabled=False):
if sudoenabled:
fullcmd="echo " + self.password + " | sudo -S -p '' " + cmd
else:
fullcmd=cmd
if self.transport is None:
return "ERROR: connection was not established"
session=self.transport.open_session()
session.set_combine_stderr(True)
#print "fullcmd ==== "+fullcmd
if sudoenabled:
session.get_pty()
session.exec_command(fullcmd)
stdout = session.makefile('rb', -1)
#print stdout.read()
output=stdout.read()
session.close()
return output
#===========================================
# MAIN
#===========================================
if __name__ == '__main__':
hostname = 'server1'
username = 'admin'
password = 'Password123'
ssh = PySSH()
ssh.connect(hostname,username,password)
output=ssh.runcmd('date')
print output
output=ssh.runcmd('service sshd status',True)
print output
ssh.disconnect()
现在我想用拧干的新脚本pyssh2.sh
#!/usr/bin/env python
from pyssh import PySSH
class PySSHT(PySSH):
def connect(self,hostname):
self.ssh = PySSH()
self.username = 'admin'
self.password = 'Password1'
self.ssh.connect(hostname,self.username,self.password)
host = 'server1'
ssh = PySSHT()
ssh.connect(host)
output=ssh.runcmd('date')
print output
output=ssh.runcmd('service sshd status',True)
print output
ssh.disconnect()
它给了这个错误,测试类的继承,看来自我的价值。在ssh.connect()中分配的传输在runcmd()中丢失。有没有简单的类继承规则我缺少?
[[email protected] ~]# ./pyssh2.py
ERROR: connection was not established
ERROR: connection was not established
Traceback (most recent call last):
File "./pyssh2.py", line 17, in <module>
ssh.disconnect()
File "/root/pyssh.py", line 19, in disconnect
self.ssh.close()
AttributeError: PySSH instance has no attribute 'close
答
看起来你的问题是在这里:
class PySSHT(PySSH):
def connect(self,hostname):
self.ssh = PySSH() # <=== problem here?
self.username = 'admin'
self.password = 'Password1'
self.ssh.connect(hostname,self.username,self.password)
在第一个代码块中,第二块(上面)设置self.ssh到paramiko.SSHClient() 您设置到PySSH
我认为paramiko.SSHClient有.close方法。 PySSH没有。
你不应该设置self.ssh到PySSH我不认为。 更好的方法是这样的:
class PySSHT(PySSH):
def connect(self, hostname):
PySSH.connect(self, hostname = hostname, username = 'admin', password = 'Password1')
return
你也应该对旧式VS新式类在Python阅读起来。 PySSH或许应该得到声明:
class PySSH(object):
为了工作,你应该改变你的最后一行'ssh.disconnect()''到ssh.ssh.disconnect()'。 – snahor 2014-10-30 02:05:31