摘要
毕业啊,找工作啊不知不觉都两年没有更新了,最近经常查东西还需要翻开博客看之前的内容,觉得还是有必要继续写下去。就开始今天的内容吧。
正文
SSH客户端
在windows上经常有需要远程连接linux去做一些事情,一般情况都会使用Xmanager这款软件。如果刚好没有这个软件急需使用python与linux交互可以吗?答案是肯定的,不过需要首先安装paramiko这个包。在环境中使用pip安装python的包的方法如下:
pip install paramiko
安装好包以后和linux的交互代码如下:

import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.xxx.xxx', port=22, username='linux用户名', password='linux用户密码') # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 返回值分别为:标准输入 输出 错误 # 获取命令结果 result = stdout.read() print(result.decode()) result = stderr.read() print(result.decode()) # 关闭连接 ssh.close()
可以发现这样写代码时,别人可以轻易的从代码中找到linux机器的用户名和密码。这样对安全没有保障,这时候就需要使用ssh密钥RSA非对称密钥验证了。密钥生成方法,首先在linux的terminal中输入如下指令:
ssh-keygen -t rsa
多回车几次就生成了密钥,然后将公钥id_rsa.pub传输给连接方使用,私钥id_rsa留给被连接方使用。得到公钥后就可以免除密码登录远程主机了。

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.3.4', port=22, username='kyle', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 标准输入 输出 错误 # 获取命令结果 result = stdout.read() print(result.decode()) result = stderr.read() print(result.decode()) # 关闭连接 ssh.close()
同样paramiko还可以实现sftp功能传输文件。

import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') transport = paramiko.Transport(('192.168.3.4', 22)) # transport.connect(username='用户名', password='密码') transport.connect(username='用户名', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) sftp.put('id_rsa.pub', '/tmp/test.py') # sftp.get('/tmp/test.py', 'id_rsa.pub') transport.close()
进程与线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程之间共享内存空间,进程之间的内存独立,同一进程的线程之间可以直接通信,两个进程之间需要一个代理来通信。由于python解释器的原因,同时只有一个线程在运行。
python线程事件实现如下:

import time import threading event = threading.Event() def light(): count = 0 event.set() while True: if 30 > count > 20: event.clear() # 清空标志位 print('