python(九)线程与进程(上):线程

发布时间:2017-09-10 10:44:14
python(九)线程与进程(上):线程 一、paramiko 模块 1、堡垒机准备

paramiko:基于ssh用于连接远程服务器并执行相关操作,批量管理

安装 yum -y install python-pip # linux环境,win安装完python自带pip pip install paramiko

1.1 SSHClient 基于用户名密码连接

基于用户名密码连接 执行命令: import paramiko # 创建ssh对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机,可以注释掉看下效果 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.8.140',port=22,username='root',password='123456') # 执行命令 stdin, stdout, stderr = ssh.exec_command("top") # 标准输入、标准输出、标准错误 # 获取命令结果 stdout_result = stdout.read() stderr_result = stderr.read() result = stdout_result if stdout_result else stderr_result print(result.decode()) # 关闭连接 ssh.close() 基于用户名密码连接 传输文件: # shell scp 传输文件 scp -rp -P22 fgf.txt root@192.168.8.140:/tmp/ import paramiko transport = paramiko.Transport(('192.168.8.140',22)) transport.connect(username='root', password='123456') sftp = paramiko.SFTPClient.from_transport(transport) # 将文件上传到服务器 sftp.put('ssh.py', '/tmp/ssh.py') # 讲文件下载到本地 sftp.get('/tmp/ssh.py', 'ssh1.py') transport.close()

1.2 SSHClient 基于密钥连接

RSA : 非对称密钥验证
公钥 : public key
私钥 : private key
把自己的公钥放在自己要连的机器上

# 生成: 权限必须600 ssh-keygen # 公钥放到对方要登录用户的.ssh下 authorized_keys (一行) # 命令拷贝 (以下命令用一个就可以,或者自己拷贝) ssh-copy-id "-p22 root@10.0.0.31 " ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.198.132 基于公钥密钥连接 执行命令 import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') # 创建ssh对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.8.140',port=22,username='root',pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command("ifconfig") # 获取命令结果 stdout_result = stdout.read() stderr_result = stderr.read() result = stdout_result if stdout_result else stderr_result print(result.decode()) # 关闭连接 ssh.close() 基于公钥密钥连接 传输文件 import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='fgf', pkey=private_key ) sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close() 二、多线程、多进程 1、什么是线程(thread)?

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
一个线程指的是进程中一个单一顺序的控制流,
一个进程中可以并发多个线程,每条线程并行执行不同的任务
简单理解:线程 <—> 一堆指令

2、什么是进程(process)?

每一个程序的内存是独立的,例如:word不能访问QQ
进程:qq 要以一个整体的形式暴露给操作系统管理,里面包含各种资源的调用(内存管理、网络接口调用等)

3、线程和进程的区别 [x] 进程:对各种资源管理的集合 [x] 线程:操作系统最小的调度单位,是一串指令的集合

进程不能单独执行,只是资源的集合
进程要操作CPU,必须要先创建一个线程。
所有在同一个进程里的线程,是同享同一块内存空间的

< 关系

进程中第一个线程是主线程,主线程创建其他线程,其他线程也可以创建线程,线程之间是平等的
进程有父进程、子进程,独立的内存空间,唯一的进程标识符、pid

< 速度

启动线程比启动进程快。运行进程和运行线程速度上是一样的,没有可比性。
线程共享内存空间,进程的内存是独立的

< 创建

父进程生成子进程,相当于克隆一份内存空间。进程直接不能直接访问
创建新线程很简单,创建新进程需要对其父进程进行一次克隆
一个线程可以控制和操作同一线程里的其他线程,但是进程只能操作子进程

< 交互

同一个进程之间的线程之间可以直接交流
两个进程想通信必须通过一个中间代理来实现。

三、使用多线程 threading

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站制作 http://www.45qun.com