paramiko若何停止长途敕令和下发文件?

发布时间:2018-12-28 11:19 来源:互联网 以后栏目:长途桌面

  写安排脚本时,不免触及到一些长途履行敕令或许传输文件。
  之前一向应用sh库,调用sh.ssh长途履行一些敕令,sh.scp传输文件,然则实际应用中照样比较费事的,光是模仿用户上岸这一点,还须要伶仃定义办法模仿输入。
  感触感染一下:
  fromshimportssh
  PASS='xxxx'
  defssh_interact(line,stdin):
  line=line.strip()
  print(line)
  ifline.endswith('password:'):
  stdin.put(PASS)
  ssh('x.x.x.x',_out=ssh_interact)
  来自官方文档
  后来发明paramiko库加倍优雅、便捷,所以预备用pramiko调换掉落sh。
  之前经过过程同事懂得到,paramiko在长途履行python脚本时,脚本中的输入内容能够会经过过程stderr这个管道输入出来,所以直接用paramiko的SSHClient类中的exec_command办法履行,经过过程读stderr管道中有没有输入来判毕敕令能否成功履行的方法是行不通的。所以用更底层一些的Channel类的recv_exit_status办法断定履行加入码更好一些。
  装置
  可以经过过程应用pipinstallparamiko装置,细节这里不再赘述。
  封装
  起首定义几个异常
  #coding:utf-8
  importos.path
  fromparamikoimportSSHClient,AutoAddPolicy,AuthenticationException
  classConnectError(Exception):
  """
  连接缺点时抛出的异常
  """
  pass
  classRemoteExecError(Exception):
  """
  长途履行敕令,掉败时抛出的异常
  """
  pass
  classSCPError(Exception):
  """
  长途下发文件时抛出的异常
  """
  pass
  ...
  classRemote(object):
  def__init__(self,host,username,password=None,port=22,key_filename=None):
  self.host=host
  self.username=username
  self.password=password
  self.port=port
  self.key_filename=key_filename
  self._ssh=None
  def_connect(self):
  self._ssh=SSHClient()
  self._ssh.set_missing_host_key_policy(AutoAddPolicy())
  try:
  ifself.key_filename:
  self._ssh.connect(self.host,username=self.username,port=self.port,key_filename=self.key_filename)
  else:
  self._ssh.connect(self.host,username=self.username,password=self.password,port=self.port)
  exceptAuthenticationException:
  self._ssh=None
  raiseConnectionError('连接掉败,请确认用户名、暗码、端口或密钥文件能否有效')
  exceptExceptionase:
  self._ssh=None
  raiseConnectionError('连接时出现料想外的缺点:%s'%e)
  defget_ssh(self):
  ifnotself._ssh:
  self._connect()
  returnself._ssh
  实例化SSHClient类,经过过程它的connect()办法获得SSH连接。
  须要留意的是,长途拜访的主机若是第一次连接,属于未知设备须要认证,经过过程set_missing_host_key_policy()办法设置一种战略,这里应用的是AutoAddPolicy()。
  这里的_connect支撑两种方法登录,一种是供给主机的用户名暗码,另外一种是经过过程密钥文件。在连接时检查假设指定了密钥文件则应用这类方法登录,不然经过过程用户名暗码登录。
  _connect()固然是实际的建立连接的办法,但实际对外接口是get_ssh(),假设曾经有建立好的SSH连接直接前往,防止反复建立连接。
  classRemote(object):
  ...
  defssh(self,cmd,root_password=None,get_pty=False,super=False):
  cmd=self._prepare_cmd(cmd,root_password,super)
  stdout=self._exec(cmd,get_pty)
  returnstdout
  def_prepare_cmd(self,cmd,root_password=None,super=False):
  ifself.username!='root'andsuper:
  ifroot_password:
  cmd="echo'{}'|su-root-c'{}'".format(root_password,cmd)
  else:
  cmd="echo'{}'|sudo-p''-Ssu-root-c'{}'".format(self.password,cmd)
  returncmd
  def_exec(self,cmd,gty_pty=False):
  channel=self.get_ssh().get_transport().open_session()
  ifget_pty:
  channel.get_pty()
  channel.exec_command(cmd)
  stdout=channel.makefile('r',-1).readlines()
  stderr=channel.makefile_stderr('r',-1).readlines()
  ret_code=channel.recv_exit_status()
  ifret_code:
  msg=''.join(stderr)ifstderrelse''.join(stdout)
  raiseRemoteExecError(msg)
  returnstdout
  在长途履行某些敕令时,能够须要管理员权限,这类时辰须要做一些断定,起首断定登录供给的用户名假设不是root,则须要对敕令做一些修改。这里的修改有两种情况,一是,该浅显用户本身就有sudo权限,只须要把履行的敕令加到sudo以后履行便可以,还有一种是浅显用户没有sudo权限,须要经过过程su先切换到root身份以后再履行,这类情况下须要供给root暗码。
  还有一点要留意的是get_pty这个参数,现其实长途履行sudo敕令时,普通主机都邑须要经过过程tty才能履行,经过过程把get_pty值设置为True,可以模仿tty,然则随之而来也会有一个成绩,假设是长途履行一个须要经久运转的过程,例如启动nginx办事,当长途敕令履行后SSH加入以后,此次运转的一切法式榜样也会随之停止,所以在须要经过过程长途敕令运转某些办事或法式榜样时,是不克不及指定get_pty参数的;但同时,假设是浅显用户长途登录,是没有权限履行service敕令的。建议的一种方法是修改/etc/sudoers设备文件,注释掉落Defaultsrequiretty这行。
  classRemote(object):
  ...
  defscp(self,local_file,remote_path):
  ifnotos.path.exists(local_file):
  raiseSCPError("Local%sisn'texists"%local_file)
  ifnotos.path.isfile(local_file):
  raiseSCPError("%sisnotaFile"%local_file)
  sftp=self.get_ssh().open_sftp()
  try:
  sftp.put(local_file,remote_path)
  exceptExceptionase:
  raiseSCPError(e)
  先确认要下发的文件存在,并且是文件不是目次,假设不是则抛出异常。同时,remote_path须如果长途主机的文件相对目次,例如/tmp/xxx.xxx,而不克不及是/tmp。
  应用
  #coding:utf-8
  fromremote_clientimportRemoteClient
  rc=RemoteClient('10.1.100.1','test','test_pass')
  rc.ssh('whoami')#[u'test\n']
  rc.scp('/tmp/test.out','/tmp/test.out')
  总结
  相较于sh,paramiko好用的不是一星半点,这里只是供给了一个简单的封装,paramiko本身还有很多其他用法,迎接大年夜家积极评论辩论。
  以上只是自己的一点懂得,假设有缺点的地方,迎接斧正。
  以上这篇应用paramiko长途履行敕令、下发文件的实例就是小编分享给大年夜家的全部内容了,欲望能给大年夜家一个参考。
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、