python 采用paramiko 远程执行命令及报错解决


Posted in Python onOctober 21, 2019

这篇文章主要介绍了python 采用paramiko 远程执行命令及报错解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

import sys
import paramiko
import config_reader
from check_utils import standout_print, parse_remainsize_response_lines, error_out_print
from time import time


class RemoteModel:
  """ remote options model
  execute remote command
  """

  def __init__(self, host, port=22):
    self.hostname = host
    self.port = port

    self.username, self.password = self.load_conf()
    self.s = None
    self.session = None
    self.init_conn()

  def load_conf(self):
    """
      read config get the login info of remote host machine
    :return:
      login username and password of SSH login of this host
    """
    if self.hostname.find("10.179.1.110") != -1:
      error_out_print("Error : the remote machine of KOR can not provide. please know")
      sys.exit(-1)

    username, password = config_reader.read_login_config(self.hostname)

    if not username or not password:
      error_out_print(
        'Error: can not find ssh login info in this host[%s]. check need ' % self.hostname)
      sys.exit(-1)

    return username, password

  def init_conn(self):
    """
      make a connection with the remote machine
    :return:
    """
    try:
      paramiko.util.log_to_file("paramiko_log.log")
      self.s = paramiko.SSHClient()
      self.s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
      self.s.connect(hostname=self.hostname, port=self.port, username=self.username, password=self.password)

      standout_print('success connect the remote machine [host=%s]' % self.hostname)

    except Exception, e:
      standout_print(str(e))
      standout_print(
        'connect failed.in host[%s] user[%s] or pwd[%s] maybe wrong. ' % (
          self.hostname, self.username, self.password))
      sys.exit(-1)

  def close(self):
    """
    close
    if close can not use this connection
    :return:
    """
    if self.s:
      self.s.close()
      self = None

  def execute_command(self, command):
    """
    :param command:
      execute cmd
    :return:
      the response lines
    """
    standout_print("Info: execute command [%s]" % command)
    stdin, stdout, stderr = self.s.exec_command(command)
    stdin.write("pwd"+"\n")
    stdin.flush()

    response_lines = stdout.readlines()
    error_info = stderr.read()

    if error_info and error_info.strip():
      error_out_print(' remote command error info : %s' % stderr.read())
      error_out_print(error_info)
      return None

    # info_arr = response_info.split('\n')

    return response_lines

  def remain_space_size(self, directory_path):
    """
    :param directory_path:

    :return:
      free size of the directory
      unit size : MB
    """

    cmd = 'sudo df -m %s 1>&2' % directory_path # /usr/local/pgsql/data/ssd1

    response_lines = self.execute_command(cmd)
    # response_lines = self.execute_command_channel(cmd)

    return parse_remainsize_response_lines(response_lines)

  def execute(self, command, sudo=False):
    feed_password = False
    if sudo and self.username != "root":
      command = "sudo %s" % command
      feed_password = "pwd"
    stdin, stdout, stderr = self.s.exec_command(command, get_pty=True)
    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__':
  host = ""
  hostname = ""
  command = "sudo df -m /data/pgsql94/data"
  rm = RemoteModel(host=hostname)
  print rm.execute_command(command)
  # print rm.execute("df -m /data/pgsql94/data 1>&2", True)

报错1:

remote command error info : 
sudo: sorry, you must have a tty to run sudo

是由于

self.s.exec_command(command, get_pty=True)

没有设置

get_pty=True

报错2:

会卡死在

stdout.readlines()

是由于 SSH在等待输入用户名的密码

stdin.write("pwd"+"\n")
stdin.flush()

该种方式进行交互,注意必须要换行"\n",和前面必须不能有空格等其他字符,确保密码正确

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过正则查找微博@(at)用户的方法
Mar 13 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
python 中random模块的常用方法总结
Jul 08 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
python数字图像处理之骨架提取与分水岭算法
Apr 27 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
python爬虫要用到的库总结
Jul 28 Python
Python自然语言处理之切分算法详解
Apr 25 Python
python文件读写代码实例
Oct 21 #Python
python 动态调用函数实例解析
Oct 21 #Python
python 两个数据库postgresql对比
Oct 21 #Python
python多进程(加入进程池)操作常见案例
Oct 21 #Python
Python实现字符串中某个字母的替代功能
Oct 21 #Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 #Python
基于Python解密仿射密码
Oct 21 #Python
You might like
php实现在服务器上创建目录的方法
2015/03/16 PHP
Symfony控制层深入详解
2016/03/17 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
python pymysql库的常用操作
2020/10/16 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
推荐信怎么写
2014/05/09 职场文书
开票员岗位职责
2015/02/12 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
综治目标管理责任书
2015/05/11 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
讨论nginx location 顺序问题
2022/05/30 Servers