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异步任务队列示例
Apr 01 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
python实现逆序输出一个数字的示例讲解
Jun 25 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
Mar 18 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
python批量解压zip文件的方法
Aug 20 Python
python实现图片横向和纵向拼接
Mar 05 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
网站当前的在线人数
2006/10/09 PHP
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
Python中一行和多行import模块问题
2018/04/01 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
成教自我鉴定
2013/10/27 职场文书
安全责任书怎么写
2014/07/28 职场文书
银行员工考核评语
2014/12/31 职场文书
运动会加油稿50字
2015/07/21 职场文书
python实现剪贴板的操作
2021/07/01 Python
python中__slots__节约内存的具体做法
2021/07/04 Python