Linux使用shell脚本实现目录创建与文件传输
Linux使用shell脚本实现目录创建与文件传输前言需求分析与难点实现SSH无密码登录安装Expect动态创建目录发送文件至目标服务器前言本人是个java开发,第一次接触devops系统的开发,对shell脚本并不是特别的熟悉,因此实现的方式可能比较愚蠢,大神勿喷,如果有更好的建议,欢迎留言。需求devops开发(二开),在pipeline执行过程中,拉取代码后进行sonar扫描。要求sonar
Linux使用shell脚本实现目录创建与文件传输
前言
本人是个java开发,第一次接触devops系统的开发,对shell脚本并不是特别的熟悉,因此实现的方式可能比较愚蠢,大神勿喷,如果有更好的建议,欢迎留言。
需求
devops开发(二开),在pipeline执行过程中,拉取代码后进行sonar扫描。
要求sonar扫描后生成pdf文件后,上传至minio文件服务器并且提供下载功能。
分析与难点
- 在旧版本中,生成的sonarPDF文件直接储存在了跑在同一台主机的tomcat上,只需要在shell脚本中cp一下就ok了。但是, 新版本Jenkins与minio文件服务器不在同一台主机上。所以需要想办法把Jenkins主机上生成的pdf文件上传至minio。
- 每一个应用对应一个pipeline,每次执行当前应用的pipeline都会生成一个新的版本,每个版本都会生成一个sonarPDF文件。但是当前应用的pipeline和sonar中的项目是一一对应的关系,也就是说每次sonar扫描后都会覆盖jenkins上生成的pdf文件,所以需要每次生成后利用我们自定义的规则分别存储再minio服务器上。
- 如果我在devops开发系统服务器上写代码,读取jenkins服务器上某目录下的pdf文件为Inputstream,然后再调用minioSDK上传至minio。 就会变成 Jenkins -> devops -> minio,怎么感觉都觉得不合理。所以经过思考,决定再Jenkins服务器执行Pipeline时执行到sonar.sh脚本中的生成pdf文件成功后,在脚本中追加一段上传minio服务器的代码。
- 随之而来的问题。上传至minio服务器的脚本应该怎么写?翻遍文档资料,只发现了minio提供的SDK,并没有发现有shell上传的文档。
- 最终,经过仔细研究,发现minio的有一个data的目录,只要把文件放入到这个文件夹中,就会显示出Bucket和对应的文件。那么,如何利用shell脚本在Jinkens服务器远程动态生成目录?创建完目录后又如何把pdf传递至minio服务器?
minio官方文档:https://docs.min.io/cn
实现SSH无密码登录
- 使用
ssh-keygen
命令在本地机器上使用ssh-keygen产生公钥私钥对。
$ ssh-keygen
- 用ssh-copy-id将公钥复制到远程机器中
$ ssh-copy-id -i .ssh/id_rsa.pub 用户名字@192.168.x.xxx
- 登录到远程机器不用输入密码
$ ssh 用户名字@192.168.x.xxx
Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2
参考资料:https://blog.csdn.net/liu_qingbo/article/details/78383892
这样无需密码就可以登录到远程服务器了,在写shell脚本的时候可以少写几行代码。
安装Expect
yum install expect
什么是expect?
在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。这就是expect!!!
参考:https://www.cnblogs.com/zhuyeshen/p/11731942.html
动态创建目录
创建一个脚本
$ vim create_dir.sh
#!/usr/bin/expect -f
set user [lindex $argv 0]
set url [lindex $argv 1]
set dir [lindex $argv 2]
spawn ssh ${user}@${url}
expect "100%"
send "mkdir -p /data/minio/data/${dir}/ \r"
expect "eof"
其中变量user为目标主机的用户,url为IP,dir为要动态创建的目录。
发送文件至目标服务器
$ vim send.sh
#!/bin/sh
user=$1
url=$2
dir=$3
echo "/app/cip-shell/create_dir.sh ${user} ${url} ${dir}"
expect /app/cip-shell/create_dir.sh ${user} ${url} ${dir}
echo "scp /app/sonarpdf/*.pdf ${user}@${url}:/data/minio/data/${dir}/sona.pdf"
scp /app/sonarpdf/*.pdf ${user}@${url}:/data/minio/data/${dir}/sona.pdf
因为我把两个脚本的内容写在一起时总是执行失败,因此我分成了两个脚本执行竟然成功了。
虽然功能成功实现了,但是我依然觉得哪里不对劲,如果大神有更好的建议,希望留言交流。
更多推荐
所有评论(0)