添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Paramiko官网文档链接: http://docs.paramiko.org/en/stable/

一、执行指令路径

exec_command是在登录时默认路径下执行命令,且每次执行都是在登录时的默认路径下执行命令,即使执行了client.exec_command('cd XXX'),再执行下一条指令时,仍然在登录时的默认路径。

要规避该问题有三种方法

1、每次与路径相关的指令用绝对路径

2、一条字符串包含多条指令,指令间用分号间隔,一起传递。

client.exec_command('cd /home/; ls -al')

3、交互式编程,通过invoke_shell开启一个会话,然后用会话的send,recv方法分别发送和接收指令。

二、SFTP传递文件情况实时监测

当SFTP需要发送或接收的文件较大时,传递时间较长,等待过程中需要提示文件传递情况。

注意put方法中的callback,可以定义一个回调函数,以实时检测文件传递情况。

put ( localpath , remotepath , callback=None , confirm=True )

Copy a local file ( localpath ) to the SFTP server as remotepath . Any exception raised by operations will be passed through. This method is primarily provided as a convenience.

The SFTP operations use pipelining for speed.

Parameters:
  • localpath ( str ) – the local file to copy
  • remotepath ( str ) – the destination path on the SFTP server. Note that the filename should be included. Only specifying a directory may result in an error.
  • callback ( callable ) – optional callback function (form: func(int, int) ) that accepts the bytes transferred so far and the total bytes to be transferred
  • confirm ( bool ) – whether to do a stat() on the file afterwards to confirm the file size
sftp_client.put(src_file, dst_file,callback=self.PutCallback)

回调函数调用的非常频繁,具体时间未测试。为减少提示次数,定义每增加5%提示一次。

def PutCallback(self,TransferredSize, ToBeTransferred):
    rate = int(TransferredSize * 100 / ToBeTransferred)
    if rate > self.percent + 5:
        self.percent = rate

三、执行指令持续输出

https://stackoverflow.com/questions/25260088/paramiko-with-continuous-stdout

stdin, stdout, stderr = client.exec_command(str_command)  #str_command为需要执行的指令
for l in self.line_buffered(stdout):  #stdout为持续输出的结果,l为结果的每一行。如果行中包含update_prog_percent则输出给界面显示
    if "update_prog_percent" in l:
        self.MsgSigOut.emit(addr + l, 1)
    self.log.info(addr + l)
def line_buffered(self, f):     #每读取一行执行结果就输出一行
    line_buf = ""
    while not f.channel.exit_status_ready():
        line_buf += f.read(1).decode('utf8')
        if line_buf.endswith('\n'):
            yield line_buf
            line_buf = ''


四、Client、Channel、Transport的关系

SSHClient表示与SSH server会话的高层表示,封装了Transport、Channel和SFTPClient。在SSHClient源代码中可以看到其包含了一个transport作为私有变量,通过transport创建出channel后在channel执行exec_command和invoke_shell。

Transport像一个流而不是像socket,它协商了加密会话,鉴权并创建了流的隧道控制,也即channel。许多的channel通过一个会话复用。(通常在端口转发(port forwarding)模式下)。

端口转发(port forwarding)原理见下文:

https://www.cnblogs.com/kidsitcn/p/11090252.html

一个Channel与一个socket类似,其API与Python socket API完全一致。SSH2有一个类似滑动窗口的流控机制,如果客户端停止从Channel读取,并且Channel的buffer满了,则服务器不能再向客户端发送数据直到客户端读取了数据。(这不会影响同一个transport下面其他channel的流控,同一个transport下面的channel都是独立进行流控的)。类似的,如果服务器不及时读取客户端发送的数据,客户端发送数据将会出现阻塞,除非客户端设置了超时机制。

exec_command在服务器执行命令,如果服务器允许执行,命令执行后channel立即连接到stdin、stdout和stderr。

exec_command命令执行完后,channel会关闭并且不再使用,如果要执行其他命令需要重新打开一个channel。

invoke_shell在channel上获取一个交互式shell会话。如果服务器允许,channel将连接到stdin、stdout和stderr。

在invoke_shell之前一般需要调用get_pty创建伪终端,channel连接到伪终端的stdin、stdout和stderr。

当shell退出时,channel会关闭并且不再被使用。如果想打开领一个shell需要打开一个新的channel。

get_pty从服务器获取一个伪终端,这通常在创建client channel之后,请求服务器为invoke_shell创建的shell提供服务。如果只是通过exec_command执行单个指令则不需要调用该方法。

Paramiko官网文档链接: http://docs.paramiko.org/en/stable/一、执行指令路径exec_command是在登录时默认路径下执行命令,且每次执行都是在登录时的默认路径下执行命令,即使执行了client.exec_command('cd XXX'),再执行下一条指令时,仍然在登录时的默认路径。要规避该问题有三种方法1、每次与路径相关的指令用绝对路...
使用Ansible编排业务流程 目前,运行此存储库的唯一方法是启动无所事事的实例以对其进行测试。 剧本设置了一个Puppet Enterprise主服务器和两个代理。 要求:在使用此之前,您将需要 。 还需要Virtualbox和Vagrant。 ##流浪者测试 ### 1。 克隆此仓库 ### 2。 cd puppet-ansible && vagrant up ### 3。 使用ansible设置ssh密钥可以使事情变得更容易: ansible-playbook -c paramiko -i setup/hosts setup/setup.yml --ask-pass --sudo 注意:如果您破坏无用的实例,重新创建它们,然后重新运行此剧本,除非从便携式计算机的已知主机文件中删除无用的IP地址,否则您将收到错误消息。 系统将提示您输入密码。 这是“无聊的”。 然后,系统
第一步是配置.env文件,这个项目的一些组件使用的信息应该在那里。 查看必须配置的内容: KEY_NAME =seu@email.net AWS_ACCESS_KEY =access_key AWS_SECRET_KEY =secret_key KEY_PASS =key_pass REGION =us-east-1 DEFAULT_INSTANCE_ID =ami-9eaa1cf6 INSTANCE_SIZE =m3.medium DEFAULT_SECURITY_GROUP =default SSH_USER =ubuntu PARAMIKO_DEBUG =True
如何安装线声和声应用程序 注意:对于线索同步服务器,请使用Pardus-19.2-SERVER版本。 您可以从下载Pardus 19.2版本。 将服务器语言设置为英语。 以下命令按顺序写在终端中。 sudo apt-get install python3-paramiko python3-pyqt5 python3-mysql.connector python3-psutil xterm 下载应用程序 下载Lider Ahenk安装应用程序; sudo apt-get install git git软件包随命令一起安装。 git clone https://github.com/Pardus-LiderAhenk/lider-ahenk-installer.git 用命令Lider Harmony Installation Application下载。 运行应用程序
paramiko 执行多条语句或执行sudo命令时,须要在exec_command加上get_pty=True。 在远程执行某些命令时,可能需要管理员权限,这种时候需要做一些判断,首先判断登录提供的用户名如果不是root,则需要对命令做一些修改。这里的修改有两种情况,一是,该普通用户本身就有sudo权限,只需要把执行的命令加到sudo之后执行就可以,还有一种是普通用户没有sudo权限,需要通过su先切换到root身份之后再执行,这种情况下需要提供root密码。 还有一点要注意的是get_pty这个参数,实际
vyos_cfg_v2是的新闪亮版本。 主要区别是使用的“后端”。 在VYOS_CFG的情况下,它是很好的旧paramiko,VYOS_CFG_V2改用VYOS_API。 请注意,您目前需要使用VyOS滚动版本来获得API支持。 vyos_cfg.py 一个简单的脚本,用于将配置推送到两个或多个VyOS实例。 它可以使用API​​将预定义的命令列表发送到设备。 您可以使用YAML语法指定逻辑以支持不同的方案(例如,部署前检查,部署,部署后活动)。 ├── deployment.yaml YAML file with deployment logic ├── helpers.py Just a bunch of functions ├── inventory.yaml Use this to
如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线。所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器上做成定时任务,每天发送AAA巡检报告。 下面是我写的一个python练手小程序。用来扫描一个网段中的在线主机,并尝试AAA去登录。统计一个大网段内可以成功aaa登录的主机。 该程序只是测试小程序,还有些小bug需要解决。不是通用的程序。主要提供一个大致思路。 主要用到了python-nmap, paramiko库。 程序大概思路: 利用nmap扫描一个指定网段,只做ping扫描,所以前提所管理的设备中ping必须开启。获取存活设备IP列表。
rcontrol是基于的paramiko旨在工作,通过SSH远程机器上一个Python库。 与fabric不同,它旨在以异步方式执行任务,并与 python >= 2.7 (包括python 3 )一起工作。 请注意,这正在开发中! 我正在等待反馈、想法和贡献者来使这个工具发展。 基本示例: from rcontrol . ssh import SshSession , ssh_client from rcontrol . core import SessionManager def log ( task , line ): print ( "%r: %s" % ( task , line )) with SessionManager () as sessions : # create sessions on two hosts sessions
opsmonitor是一个简单的服务器监控系统,本项目fork于flask-adminlte-handler 开发opsmonitor的原因是,现有的开源监控服务如:nagios、cacti等,配置繁琐、安装复杂; 开发这个系统的目的就是为了解决繁琐的配置问题,opsmonitor主体功能现都已完成,可以满足基本 的监控需求。 opsmonitor只适用于小型系统的监控,目前的opsmonitor对于监控项目过多的系统 会有性能问题,建议监控主机数少于20台,并且监控项数据少于100个。 本系统用户管理界面的switch开关不起作用 使用的技术 Web框架使用Flask,默认Jinja模版 ORM框架使用Peewee 前端套用基于BootStrap的AdminLTE模板,也使用了少量的layui 使用paramiko通过ssh通道获取主机硬件信息
本文实例讲述了python下paramiko模块实现ssh连接登录Linux服务器的方法。分享给大家供大家参考。具体分析如下: python下有个paramiko模块,这个模块可以实现ssh登录linux服务器,下面贴出代码,注意,我在centos5.6下,python2.6.5,paramiko-1.7的版本下测试成功。 #!/usr/bin/env python import paramiko\nhostname='172.28.102.249'\nusername='root'\npassword='toor' if __name__=='__main__': paramiko.util
最近在学习《python 自动化运维》 一书,书中提到使用paramiko的send和recv来进行远程ssh的命令输入和结果获取,我也尝试使用了下。 开始在连接connect 目标host和port后准备按照书中所说连接堡垒机 channel.send(‘ssh ’ +…………………………….) 准备输入密码 while not buff.endswith(“password: “)
Paramiko是一个基于Python的SSH2协议库,用于在Python编写的程序中连接到远程服务器并执行命令。使用Paramiko可以轻松创建SSH连接,通过SSH在远程主机上执行命令、上传和下载文件等操作。 如果没有网络,可以使用Paramiko离线包。Paramiko离线包是将Paramiko库的所有依赖项打包到一个压缩文件中,这个压缩文件可以在没有网络的情况下进行离线安装。Paramiko离线包的安装方式与在线安装相同。 使用Paramiko离线包的步骤如下: 1.下载Paramiko离线包并解压缩; 2.将解压后的文件夹放到要使用的Python环境的site-packages目录下; 3.在Python程序中引入Paramiko模块,就可以开始使用Paramiko库了。 需要注意的是,Paramiko离线包只是解决了没有网络时无法通过PIP在线安装Paramiko库的问题。如果程序需要连接到远程服务器,则仍需确保机器可以访问该服务器。