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 相关文章推荐
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
用Python抢过年的火车票附源码
Dec 07 Python
理解Python中的With语句
Mar 18 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
python找出完数的方法
Nov 12 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
python实现简单学生信息管理系统
Apr 09 Python
python 实现的截屏工具
May 08 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学习笔记 数组的常用函数
2011/06/13 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
php中in_array函数用法分析
2014/11/15 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
管理专员自荐信
2014/01/26 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
无偿献血倡议书
2014/04/14 职场文书
毕业论文评语大全
2014/04/29 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
2015新学期开学寄语
2015/02/26 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL