paramiko模块,线程,进程
关于paramiko模块
paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令、文件传输,中间ssh代理等
paramiko的安装:
安装好之后,用paramiko模块写一个简单的远程ssh运行命令,代码如下:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("192.168.1.23",22,username="root",password="")
stdin,stdout,stderr = ssh.exec_command("df -h")
result = stdout.read()
print(result.decode())
运行结果如下:
D:\python35\python.exe D:/python培训/s14/day9/ssh例子.py
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 77G 1.6G 72G 3% /
tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot Process finished with exit code 0
paramiko的核心组件:
SSHClient类,SFTPClient类
a. SSHClient类是一个SSH服务会话的高级表示,该类封装了传输(transport),通道(channel)及SFTPClient的校验,建立的方法,通常用于执行远程命令
connect方法
connect(self, hostkey=None, username='', password=None, pkey=None,gss_host=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True)
参数说明:
hostname(str类型):连接的目标主机地址
port(int类型):连接目标主机的端口,默认为22
username(str类型):用户名
password(str类型):密码
pkey(PKey类型):私钥方式,用于身份验证
gass_host(str类型): The target's name in the kerberos database. Default: hostname
gss_auth(布尔类型):是否使用GSS-API认证
ss_kex=False(布尔类型):是否将GSS-API key和用户认证交换
gss_deleg_creds(布尔类型):是否代表包含GSS-API 客户端的凭据
exec_command方法:
远程执行命令方法,该命令的输入与输入流为标准输入(stdin)、输出(stdout)、错误(stderr)
load_system_host_keys方法
load_host_keys(self, filename)
加载本地总要校验文件,默认为~/.ssh/known_hosts,非默认另需要手工指定。
参数:
filename(str类型)指定远程主机公钥记录文件
set_missing_host_key_policy方法:
set_missing_host_key_policy(self, policy)
设置连接的远程主机没有本地主机秘钥或HostKeys对象时的策略,目前支持三种,分别是:AutoAddPolicy、RejectPolicy(默认)、WarningPolicy,三者的含义如下:
AutoAddPolicy:自动添加主机名及主机秘钥到本地HostKeys对象,并将其保存,不依赖load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不产生影响
RejectPolicy:自动拒绝位置的主机名和秘钥,依赖load_system_host_keys()的配置
WarningPolicy:用于记录一个位置的主机秘钥的python警告,并接受它,功能上与AutoAddPolicy相似,但未知主机会有警告
b. SFTPClient类
SFTPClient根据SSH传输协议的sftp命令会话,实现远程文件操作:文件的上传、下载、权限、状态等操作。
from_transport方法:
from_transport(cls, t, window_size=None, max_packet_size=None)
参数说明:
t:一个已经通过验证的传输对象
例子:
transport = paramiko.Transport(('192.168.1.23',22))
transport.connect(username="root",password="")
sftp = paramiko.SFTPClient.from_transport(transport)
put方法:
长传本地文件到远程SFTP服务端
put(self, localpath, remotepath, callback=None, confirm=True)
参数说明:
localpath(str类型):需要上传的本地文件(源文件)
remotepath(str类型):远程路径(目标文件)
callback(function(init,init)):获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None
confirm(bool类型):文件长传完毕后是否调用start()方法,以便确认文件的大小
get方法
get(self, remotepath, localpath, callback=None)
从远程SFTP服务端下载本地
参数说明:
remotepath(str类型):需要下载的远程文件
localpath(str类型):本地路径
callback(function(init,init)): 获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None
其他方法:
SFTPClient类其他常用方法:
Mkdir:在SFTP服务端创建目录
remove:删除SFTP服务端指定目录
rename:重命名SFTP服务端文件或目录
stat:获取远程SFTP服务端指定文件的信息
listdir:获取远程SFTP服务端指定目录列表,以Python的列表形式返回
下面是实际的代码例子:
基于账户名和密码的上传和下载文件
#AUTHOR:FAN
import paramiko
#t就相当于创建通道
t = paramiko.Transport(("192.168.1.23",22))
t.connect(username="root",password="123456")
#这里表示sftp通过t这个通道传输数据
sftp = paramiko.SFTPClient.from_transport(t)
#sftp.put("ssh例子.py","/tmp/aaa.py")
sftp.get("/tmp/aaa.py","sss")
sftp.close()
同样的也可以通过基于公钥的上传和下载文件
进程与线程
1、 线程:是操作系统能够进行运算的调度的最小单位,它被包含在进程中,是进程中实际的运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程可以并发多个线程,每条线程并行执行不同的任务。
线程是一串指令的集合
2、 进程:程序要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等….即对各种资源的集合。
进程要操作cpu,必须要先创建一个线程
所有在同一个进程里的线程是共享同一块内存空间的
线程共享内存空间,进程的内存是独立的
同一个进程的线程之间可以直接交流,两个进程想要通信,必须通过一个中间代理来实现
创建新线程很简单,创建新进程需要对其父进程进行一次克隆
一个线程可以控制和操作同一个进程里的其他线程,但是进程只能操作子进程
一个最简单的多线程的代码例子:
import threading,time
def run(n):
print("task",n)
time.sleep(2) t1 = threading.Thread(target=run,args=("t1",))
t2 = threading.Thread(target=run,args=("t2",))
t1.start()
t2.start()
下面是一个对多线程的一个处理方法:(需要理解):
import threading
import time
def run(n):
print("task:",n)
time.sleep(2)
print("task done:",n) start_time = time.time()
for i in range(10):
t = threading.Thread(target=run,args=(i,))
t.start()
print("cost:",time.time()-start_time)
运行结果如下:
D:\python35\python.exe D:/python培训/s14/day9/threading_ex2.py
task: 0
task: 1
task: 2
task: 3
task: 4
task: 5
task: 6
task: 7
task: 8
task: 9
cost: 0.0010001659393310547
task done: 1
task done: 2
task done: 4
task done: 0
task done: 5
task done: 9
task done: 8
task done: 6
task done: 3
task done: 7 Process finished with exit code 0
下图是对上述程序的理解,这个非常重要,之前自己一直迷糊在这个地方
下图是对上述程序的理解,这个非常重要,之前自己一直迷糊在这个地方
但是现在有个问题,我们需要计算所有线程的执行时间,并且让所有线程运行之后再运行主程序
这里就需要用到线程里的一个方法join()意思其实就是等待的意思代码如下:
import threading
import time
def run(n):
print("task:",n)
time.sleep(2)
print("task done:",n) start_time = time.time()
t_obj = []
for i in range(10):
t = threading.Thread(target=run,args=(i,))
t.start()
t_obj.append(t)
for i in t_obj:
i.join() print("all thread is done")
print("cost:",time.time()-start_time)
threading.current_thread() 表示当前线程
threading.active_count() 表示当前活跃线程数
关于守护线程
如果将线程设置为守护线程,则主程序不会管线程是否执行完,只有主程序执行完毕之后,就会结束
代码例子如下:
#AUTHOR:FAN import threading
import time
def run(n):
print("task:",n)
time.sleep(2)
print("task done:",n) start_time = time.time()
for i in range(10):
t = threading.Thread(target=run,args=(i,))
t.setDaemon(True)
t.start() print("all thread is done",threading.current_thread(),threading.active_count())
print("cost:",time.time()-start_time)
运行结果如下:
D:\python35\python.exe D:/python培训/s14/day9/threading_ex2.py
task: 0
task: 1
task: 2
task: 3
task: 4
task: 5
task: 6
task: 7
task: 8
task: 9
all thread is done <_MainThread(MainThread, started 5908)> 11
cost: 0.007000446319580078 Process finished with exit code 0
GIL 全局解释器锁
无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行
线程锁(互斥锁)
一个进程下可以启动多个线程,多个线程共享父进程的内存空间,这样每个线程可以访问同一份数据,此时如果多个线程同时修改一份数据,就会出现问题。
但是经过测试在3.0上不存在这个问题
递归锁
也就是锁中包含锁,代码例子:
import threading,time def run1():
print("grab the first part data")
lock.acquire()
global num
num +=1
lock.release()
return num
def run2():
print("grab the second part data")
lock.acquire()
global num2
num2+=1
lock.release()
return num2
def run3():
lock.acquire()
res = run1()
print('--------between run1 and run2-----')
res2 = run2()
lock.release()
print(res,res2) if __name__ == '__main__': num,num2 = 0,0
lock = threading.RLock()
for i in range(10):
t = threading.Thread(target=run3)
t.start() while threading.active_count() != 1:
print(threading.active_count())
else:
print('----all threads done---')
print(num,num2)
信号量semaphore
互斥锁同时只允许一个线程更改数据,而信号量可以同时允许一定数量的线程更改数据
待续,还没有整理完
paramiko模块,线程,进程的更多相关文章
- Python-Day9 Paramiko模块/进程/线程/RabbitMQ队列
一.Paramiko模块 1.Paramiko安装 Python的目录下有个Scripts目录,cd到这个目录用这里面的pip命令(如果添加的环境变量可以在cmd直接输入命令):pip install ...
- 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型
一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...
- python笔记-10(socket提升、paramiko、线程、进程、协程、同步IO、异步IO)
一.socket提升 1.熟悉socket.socket()中的省略部分 socket.socket(AF.INET,socket.SOCK_STREAM) 2.send与recv发送大文件时对于黏包 ...
- paramiko模块-2
如何用paramiko模块模拟登入服务器,并记录操作日志,起到审计的作用? 各个client ---(连接跳转机)--->(跳转机)------>各自的目标服务器. 目前我们公司的跳转机, ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
- python网络编程——SocketServer/Twisted/paramiko模块
在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...
- Python 线程&进程与协程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- python之线程进程协成
线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
- 利用paramiko模块实现堡垒机+审计功能
paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...
随机推荐
- Javascript 利用a标签自动解析URL分析网址实例
/* * @function: 通过a标签解析url标签 * @param:url url参数是字符串,解析的目标 通过IE6-9 chrome Firefox测试 * */ function par ...
- ACM 推桌子
推桌子 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 The famous ACM (Advanced Computer Maker) Company has re ...
- 【BZOJ】2693: jzptab
http://www.lydsy.com/JudgeOnline/problem.php?id=2693 题意:求$\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j)$, ...
- 【Poj】 p2342 Anniversary party(树形DP第一道)
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5523 Accepted: 3169 ...
- [奇葩 bug]视图在 ipad5 上正常显示,在 iPad3上超出了边界
一,问题分析 1.理论上 iPad 是按像素点排列的,可 iPad5为什么和 iPad3差别那么大??? 2.iPad3超出边界的视图,都有一个 leading 是superview 的 leadin ...
- Linux_解决nohup命令生成的多余的大日志文件
解决nohup命令生成的多余的大日志文件 经常使用命令 nohup /usr/bin/php /srv/www/update.php & 可以让它在后台安静的进行,但是有一个烦恼就是,它会生成 ...
- Net-SNMP是线程安全的吗
原文地址 : http://www.net-snmp.org/wiki/index.php/FAQ:General_19 Net-SNMP是线程安全的吗? 确切的说,不是.不过呢,在多线程管理的应用进 ...
- (转) 使用Speech SDK 5.1文字转音频
下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=10121 SeppchSDK51.exe 语音合成引擎 SpeechSDK ...
- 既然nodejs是单线程的,那么它怎么处理多请求高并发的?
单线程解决高并发的思路就是采用非阻塞,异步编程的思想.简单概括就是当遇到非常耗时的IO操作时,采用非阻塞的方式,继续执行后面的代码,并且进入事件循环,当IO操作完成时,程序会被通知IO操作已经完成.主 ...
- php循环删除文件目录及文件
删除文件及目录: //循环删除目录和文件函数 function delDirAndFile( $dirName ) { if ( $handle = opendir( "$dirName&q ...