远程控制Linux
自动安装产品到Linux
自动化用例的一些步骤 #log里面读取信息
运维
环境监控
数据的自动获取,分析
方案
Paramiko #主流的库
Pexpect #相对早一点
执行下面的命令
pip install paramiko --default-timeout=60 #国外的源,时间设置的长一点
pip install paramiko -i https://pypi.douban.com/simple/--trusted-host pypi.douban.com #国内豆瓣的源
- 保证 ssh 服务开启
用putty 链接看看 #远程连接工具
常见的linux命令:
-
ls:列出当前目录下所有的目录(相当于dos下的dir) #windows下面的dir
-
pwd:当前目录
-
cat:查看内容(cat 1.txt)(内容较少)
-
more:查看内容(内容较多)
-
clear:清屏
-
mkdir xxx:创建目录
-
cd xxx:进入目录
-
cd -:返回到上一次所处的目录
-
cd ~:命令切换到当前用户的家目录
-
cd ~username:切换到其他用户的家目录
-
echo “XX” > YY:将内容XX存到文件YY中
-
date +%Y%m%d_%H%M%S;free:获取内存信息
-
date:查看系统时间
-
date “+%Y-%m-%d %H:%M:%S”:查看系统时间,格式:2017-08-24 16:29:12
-
date -s “20170901 8:30:00”: 设置系统时间
-
clock --show:查看硬件时间(bios时间)
-
clock --hctosys:更改系统时间为硬件时间(hc代表硬件时间,sys代表系统时间)
-
clock --systohc:更改硬件时间为系统时间(hc代表硬件时间,sys代表系统时间)
-
reboot:重启
-
poweroff:关闭系统
-
uname
-a:完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息 -
cat /etc/redhat-release:查看当前系统版本的详细信息
-
free -h :内存使用情况
-
who:用于查看当前登入主机的用户终端信息
-
tail -n 20:查看文件的最后20行
-
tail -f 文件名:查看实时日志
-
locale:查看系统字符集
-
echo “dasdsadasdasds” > file1 #把内容写入到file1里面*
代码
import paramiko
#创建SSHClient 实例对象
ssh = paramiko.SSHClient() #通过SSHClient类实力一个对象,只要支持远程的ssh协议
#调用方法,表示没有存储远程机器的公钥,允许访问
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #通过对方的一个密钥的存储,把密钥文件,防止钓鱼机
#连接远程机器 地址、端口、用户名密码
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123") #ci.ytesting.com域名,端口22,stt用户名,songqin123密码
#具体操作
#创建目录
cmd = 'mkdir jcy2' #创建目录
ssh.exec_command(cmd) #调用这个命令才会执行
#如果命令跨行
cmd = '''echo '1234
5678
90abc' > myfile
'''
ssh.exec_command(cmd)
#获取命令的执行结果
cmd = 'cat myfile' #看他的文件,cmd是变量
stdin, stdout, stderr = ssh.exec_command(cmd) # ssh.exec_command(cmd) 返回的是文件对象,stdin远程的标准输入,stdout远程标准输出,一般是正确的。stderr一般是错误的输出。赋值给3个变量
output = stdout.read()+ stderr.read() #把正确的错误的read一下,加起来。文件2进制读出来是2进制类型。只加后面两个
print(output.decode('utf8')) #用UTF-8解码,decode
ssh.close()
注意点
exec_command 每次执行会新打开一个channel执行 #类似于新打开一个终端,都是在用户登陆的根目录下执行的
新的环境,不在上次执行的环境里面
所以,我们不能多次调用,达到多次调用的目的
比如:
ssh.exec_command(pwd)
ssh.exec_command("mkdir a123")
ssh.exec_command("mkdir b123")
stdin, stdout, stderr = ssh.exec_command("pwd")
print (stdout.read()) #此时不是在b123的目录下面,还是在用户登录的根目录下面/home/stt
如果一定要上下命令关联,可以多个命令同时执行 比如 cd a123;pwd
代码如下:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")
cmd = "pwd;mkdir jcy4;cd jcy4;pwd;mkdir jcy44"
stdin, stdout, stderr = ssh.exec_command(cmd)
print(stdout.read().decode())
ssh.close()
#结果:b'/home/stt\n/home/stt/jcy4\n'
获取数据进行分析
例如 内存使用
代码如下:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "stt0707")
stdin, stdout, stderr = ssh.exec_command("date +%Y%m%d_%H%M%S;free") #free当前系统的内存使用率 data可以看到当前的时间,合起来就可以看到某个时间点的内存信息,如在一个循环里,每个几秒钟执行一次,还可以用别的工具把它回执图表
print(stdout.read())
ssh.close()
传输文件到远程服务器
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")
sftp = ssh.open_sftp() #打开文件传输的通道
sftp().put("ftp1.py","/home/stt/ftp3.py") #前面的是本地文件,后面的是路径和新起的名字
sftp.close()
从远程机器拷贝文件到本机 #拉去日志分析
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")
sftp = ssh.open_sftp() #打开文件传输的通道
sftp().get("/home/stt/myfile","d:/myfile1.txt") #前面的是本地文件,后面的是路径和新起的名字
sftp.close()
ssh.close()