python ssh shell交互_使用Paramiko在Python上用ssh实现交互式shell?

我想编写一个程序(在Windows 7上的Python 3.x中),它通过ssh在远程shell上执行多个命令.在查看paramikos的exec_command()函数之后,我意识到它不适合我的用例(因为在执行命令后通道被关闭),因为命令依赖于环境变量(由先前的命令设置)并且不能连接到一个exec_command()调用,因为它们将在程序中的不同时间执行.

因此,我想在同一个通道中执行命令.我研究的下一个选项是使用paramikos的invoke_shell()函数实现交互式shell:

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(host, username=user, password=psw, port=22)

channel = ssh.invoke_shell()

out = channel.recv(9999)

channel.send('cd mivne_final\n')

channel.send('ls\n')

while not channel.recv_ready():

time.sleep(3)

out = channel.recv(9999)

print(out.decode("ascii"))

channel.send('cd ..\n')

channel.send('cd or_fail\n')

channel.send('ls\n')

while not channel.recv_ready():

time.sleep(3)

out = channel.recv(9999)

print(out.decode("ascii"))

channel.send('cd ..\n')

channel.send('cd simulator\n')

channel.send('ls\n')

while not channel.recv_ready():

time.sleep(3)

out = channel.recv(9999)

print(out.decode("ascii"))

ssh.close()

这段代码存在一些问题:

>第一次打印并不总是打印ls输出(有时它只打印在第二次打印时).

>第一个cd和ls命令始终存在于输出中(我通过recv命令获取它们,作为输出的一部分),而有时会打印以下所有cd和ls命令,有时它们不会.

>第二个和第三个cd和ls命令(打印时)总是出现在第一个ls输出之前.

我对这种“非决定论”感到困惑,非常感谢你的帮助.

最佳答案

import paramiko

import re

class ShellHandler:

def __init__(self, host, user, psw):

self.ssh = paramiko.SSHClient()

self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

self.ssh.connect(host, username=user, password=psw, port=22)

channel = self.ssh.invoke_shell()

self.stdin = channel.makefile('wb')

self.stdout = channel.makefile('r')

def __del__(self):

self.ssh.close()

def execute(self, cmd):

"""

:param cmd: the command to be executed on the remote computer

:examples: execute('ls')

execute('finger')

execute('cd folder_name')

"""

cmd = cmd.strip('\n')

self.stdin.write(cmd + '\n')

finish = 'end of stdOUT buffer. finished with exit status'

echo_cmd = 'echo {} $?'.format(finish)

self.stdin.write(echo_cmd + '\n')

shin = self.stdin

self.stdin.flush()

shout = []

sherr = []

exit_status = 0

for line in self.stdout:

if str(line).startswith(cmd) or str(line).startswith(echo_cmd):

# up for now filled with shell junk from stdin

shout = []

elif str(line).startswith(finish):

# our finish command ends with the exit status

exit_status = int(str(line).rsplit(maxsplit=1)[1])

if exit_status:

# stderr is combined with stdout.

# thus, swap sherr with shout in a case of failure.

sherr = shout

shout = []

break

else:

# get rid of 'coloring and formatting' special characters

shout.append(re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]').sub('', line).

replace('\b', '').replace('\r', ''))

# first and last lines of shout/sherr contain a prompt

if shout and echo_cmd in shout[-1]:

shout.pop()

if shout and cmd in shout[0]:

shout.pop(0)

if sherr and echo_cmd in sherr[-1]:

sherr.pop()

if sherr and cmd in sherr[0]:

sherr.pop(0)

return shin, shout, sherr

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux7如何进入紧急模式,CentOS7开机进入紧急模式EmergencyMode的解决办法

iOS Runtime学习笔记Associated Objects: interface NSObject (AssociatedObject) property (nonatomic, strong) id associat ...Vim,极简使用教程,让你瞬间脱离键鼠切换的痛苦注:看大家对Vim仇恨极大,其实它只是一种文本操作方式,可以减少键鼠的切换,从…

用pycharm写python_如何利用pyCharm编写和运行python文件

在安装python环境后,通常可以利用IDE pyCharm来编译我们的python文件。创建一个python文件夹,用pyCharm打开文件夹,在文件夹中新建一个python文件demo.py 也许你知道用cmd中的python指令 python demo.py去运行这个文件,但是如何在…

5.JDK环境配置

下载 进入Oracle官网下载,点击进入 安装 一路下一步。记住安装到哪里了。 配置环境变量 JAVA_HOME 刚才的java安装目录 PATH %JAVA_HOME%\bin PATH里配置多个用英文的分号; 分隔。 *classpath,jdk5.0以上可以不用配置了 测试 windows下&#xf…

GBK 编码

GBK编码范围:8140-FEFE,汉字编码范围见第二节:码位分配及顺序。 GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK编码依然采用双字节编码方案,其编码范围:8140&#x…

less webpack 热更新_webpack---less+热更新 使用

最近尝试用less写界面,webpack进行打包,然后发现每次修改less时都需要重新执行webpack打包一下,于是就想到了webpack热更新这个功能。一、使用lessless是一门css预处理语言,它是拓展了css,增加了变量,Mixin等等。使用l…

6.第一个程序Hello World

新建文件夹 在C盘新建个文件夹 mycode。注意不要用中文。 新建java文件 1、显示隐藏文件名。 2、右键新建文本文件 3、重命名为 Welcome.java。(首字母必须大写。如果不显示隐藏文件名,会是Welcome.java.txt不是java文件) 4、编写代码 p…

pythonstdin_python 笔试输入:sys.stdin.readline和input

①:输入一行数据并输 出两种方法 # 输入一行数据并输出 import sys # 方法一: str1 input() print(input 输入:,str1,len,len(str1)) print(循环遍历输入得到输入的每个字符的ascii码如下:) for i in str1: print(ord(i)) # 方法二&#xff…

c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

C语言中动态分配二维数组复习过程.docC语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的。C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C语言书中…

7.Java常用开发工具

文本编辑器 任意选一款 UltraEdit EditPlus notepad 集成开发环境 IDE:Integrated Development Environment --JBulider (基本淘汰) --Eclipse 普遍使用。https://www.eclipse.org/downloads/ --NetBeans ------------- 更多的Java&a…

python京东商品_Python爬取京东的商品分类与链接

前言本文主要的知识点是使用Python的BeautifulSoup进行多层的遍历。如图所示。只是一个简单的哈,不是爬取里面的隐藏的东西。示例代码from bs4 import BeautifulSoup as bsimport requestsheaders {"host": "www.jd.com","User-Agent&quo…

python加入中小学课程_【python即将进入中学课堂,编程从小抓起,竟然在这几点上应验了】- 环球网校...

【摘要】我们都知道,不论是我们使用的app,还是各种各样的游戏,小程序,都离不开编程软件的贡献,其中python占据了半壁江山,随着大家对python的重视,python即将进入中学课堂,这究竟是好…

用动态规划算法求解最少硬币问题 c语言,动态规划算法求解硬币找零问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼看着这代码怎么这么熟悉。package 动态规划找零;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int change;change scan.nextInt();int[] coins …

git命令行使用

* git branch : 查看本地分支 * git branch -r : 查看远程分支 * git branch -a : 查看全部分支 * git branch name : 本地新建分支 * git checkout name : 切换到本地 name 分支 * git pull origin name : 从远程 name 拉取代码 * git merge name : 合并name * git diff : 查看…

8.对Hello World程序的深入

Welcome.java public class Welcome{public static void main(String[] args){System.out.println("Hello World,I am Java!");}}1、Java对大小写敏感。如果出现了大小写拼写错误,程序无法运行。 关键字class表明Java程序中的全部内容都包含在类中&…

python整数类型没有取值范围限制_详解Python中6种数据类型

Python中数据类型主要有六种:数字类型,字符串类型,元组类型,列表类型,文件类型和字典类型,我们今天先介绍前四种类型。 假如在Python程序中,出现了“010”,那么这个“010”到底是什么…

bb平台c语言第2章 习题,C语言各章习题集

C语言习题集第 1 章C语言概述一. 填空题1. C程序是由构成的,一个C程序中至少包含。是C程序的基本单位。2. 任何C程序必须有且只有一个_______函数。3. C程序注释是由和所界定的文字信息组成的。二. 判断题1.2.3.4.5. 一个C程序的执行总是从该程序的main函数开始&…

陶晶驰stm32_陶晶驰串口屏学习日记(1)

关于文本控件的key属性和按钮控件的注意事项:1 一定加入的是文本控件,把vscope设置成全局才能使用key属性里的键盘。我刚开始用了文本控件设置了key为keybdB,然后又自己弄了个按钮控件,在弹起事件里写了page keybdB,在编译没错&am…

failed to keep to the max pss of 66560

错误警报D/ModuleListener: ModuleListener.testFailed(com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps, java.lang.AssertionError: com.google.android.youtube81073, failed to keep to the max pss of 66560 at org.junit.Assert.fail(Assert.…

9.关于Unicode字符集

原文链接:http://blog.csdn.net/yang3wei/article/details/47414483 点击阅读原文 ------------------------------------- 1)Java 中 char 占两个字节,既可以表示中文字符,也可以表示英文字符 2)Unicode只是一个编码…

10.java 关键字与保留字

Java 关键字列表 (依字母排序 共51组)所有的关键字都是小写。 在IDE中都会显示不同的颜色: abstract, assert, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum,extends, final, finally, float, for, if,imple…