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运用于数据分析的简单教程
Mar 27 Python
python编写分类决策树的代码
Dec 21 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
Python实现的特征提取操作示例
Dec 03 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
django实现用户注册实例讲解
Oct 30 Python
Python的几种主动结束程序方式
Nov 22 Python
关于ResNeXt网络的pytorch实现
Jan 14 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 similar_text 字符串的相似性比较函数
2010/05/26 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
php while循环得到循环次数
2013/10/26 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
Python中基本的日期时间处理的学习教程
2015/10/16 Python
你应该知道的python列表去重方法
2017/01/17 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
如何判断计算机可能已经中马
2013/03/22 面试题
求职信的要素有哪些呢
2013/12/26 职场文书
科研先进个人典型材料
2014/01/31 职场文书
电子银行营销方案
2014/02/22 职场文书
法制宣传标语集锦
2014/06/25 职场文书
运动会报道稿300字
2014/10/02 职场文书
班主任开场白
2015/06/01 职场文书
个人欠条范本
2015/07/03 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
优质服务标语口号
2015/12/26 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
MySQL创建管理子分区
2022/04/13 MySQL