文章目录
实用脚本
nginx 日志切割
#!/usr/bin/env bash
# Auth: liuli
# Version: v1.0, 2021/12/07
# Sys: CentOS 7.9
# Features: 切割 nginx 日志
# 获取昨天的日期
YESTERDAY=`date -d yesterday "+%Y-%m-%d"`
# Nginx 日志文件所在目录
LOG_PATH=/opt/nginx1.4/logs
# Pid 文件
PID_PATH=/opt/nginx1.4/logs/nginx.pid
# 分割日志函数
function cut_nginx_log(){
mv ${LOG_PATH}/$1 ${LOG_PATH}/$1_${YESTERDAY}
kill -USR1 `cat ${PID_PATH}`
zip -qrjm ${LOG_PATH}/$1_${YESTERDAY}.zip ${LOG_PATH}/$1_${YESTERDAY}
}
cut_nginx_log access_admin.log
cut_nginx_log access_api.log
cut_nginx_log access_web.log
# 删除 30 天前的日志
find ${LOG_PATH} -name '*.zip' -type f -mtime +30 -exec rm -rf {} \;
python 爬虫
#/usr/bin/env python
import requests
from bs4 import BeautifulSoup
import pprint
import json
import os
kebie = {
"huxineike":3,
"yingyangke":4
}
for key, value in kebie.items():
# 下载html页面
def download_all_htmls():
htmls = []
headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
for idx in range(value):
url = f"https://jbk.39.net/bw/{key}_t1_p{idx+1}/"
#print("craw html:", url)
r = requests.get(url,headers=headers)
if r.status_code != 200:
raise Exception("error")
htmls.append(r.text)
return htmls
htmls = download_all_htmls()
# 解析html数据
def parse_single_html(html_doc):
soup = BeautifulSoup(html_doc, 'html.parser')
links = soup.body.find_all('p','result_item_top_l')
datas = []
for link in links:
link_node = (
link
.find("a")
)
title = link_node["title"]
link = link_node["href"]
datas.append(
{"title":title, "link":link}
)
return datas
# 执行所有的HTML页面的解析
all_datas = []
for html_doc in htmls:
all_datas.extend(parse_single_html(html_doc))
pprint.pprint(all_datas)
python循环接口下载图片
# /usr/bin/env python
# -- coding:UTF-8 --
import requests
import json
import os
# 定义调用的url
# 登录
loginSubmit_url = 'http://server.xxx.net/index/index/loginSubmit'
# 患者列表
patientList_url = 'http://server.xxx.net/doctor/patient/index'
# 病例列表
caseList_url = 'http://server.xxx.net/doctor/visit/getCaseHistoryList'
# 化验报报告
laboratorySheetList_url = 'http://server.xxx.net/doctor/visit/getLaboratorySheetList' # noqa: E501
# 影响图片
imagesList_url = 'http://server.xxx.net/doctor/visit/getImagesList'
# 获取token函数
def get_token():
params = {'username': '188xxx85', 'password': 'winxxx0'}
res = requests.post(loginSubmit_url, params).json()
return res['token']
token = get_token()
# 获取患者列表函数
def get_patient_list():
params = {'type': 'hz', 'search': '', 'token': token}
res = requests.post(patientList_url, params).json()
return res
# print(len(get_patient_list()))
# 根据patient_id与url获取患者不同类型信息函数
def get_detail(patient_id, url):
params = {'patient_id': patient_id, 'token': token}
res = requests.post(url, params).json()
return res
# 获取病例列表
# print(get_detail('aa1982758a63af59ef713a767ae3f552',caseList_url))
# 获取化验报告
# print(get_detail('aa1982758a63af59ef713a767ae3f552',laboratorySheetList_url))
# 获取影像图片
# print(get_detail('3d1ad64611449a596c0e1709690754fc',imagesList_url))
# 下载图片函数
def get_imgs(img_url, save_path):
response = requests.get(img_url)
img = response.content
file_name = img_url.split('/')[-1]
with open(save_path+'/'+file_name, 'wb') as f:
f.write(img)
def download_img(dict_list, file_dir):
for i in dict_list:
if patient_id == i['patient_id']:
imgs_list = i['imgs']
get_date = i['get_date']
# print(patient_id,patient_phone,get_date,case_imgs)
for k in imgs_list:
# print(patient_id,patient_phone,get_date,k)
file_path = file_dir + '/' + get_date
if os.path.isdir(file_path):
# print('dir exists'mgs)
get_imgs(k, file_path)
else:
# print('dir not exists')
os.makedirs(file_path)
get_imgs(k, file_path)
else:
print('空')
# 获取患者列表
patient_list = get_patient_list()
# 循环患者列表得到patient_phone和patient_id
for patient in patient_list:
patient_id = patient['patient_id']
patient_phone = patient['patient']['phone']
# print(patient_id,'+',patient_phone)
# 根据手机号创建目录
case_dir = '/root/data/' + patient_phone + '/' + 'case/'
laboratory_dir = '/root/data/' + patient_phone + '/' + 'laboratory/'
images_dir = '/root/data/' + patient_phone + '/' + 'images/'
# 根据手机号查询patient_id,得到病例照片链接,放入 data/手机号/case/日期/ 目录中
case_list = get_detail(patient_id, caseList_url)
download_img(case_list, case_dir)
# 根据手机号查询patient_id,得到化验报告的照片链接,放入 data/手机号/laboratory/日期/ 目录中
laboratory_list = get_detail(patient_id, laboratorySheetList_url)
download_img(laboratory_list, laboratory_dir)
# 根据手机号查询patient_id,得到影像的照片链接,放入 data/手机号/images/日期/ 目录中
images_list = get_detail(patient_id, imagesList_url)
download_img(images_list, images_dir)
python遍历目录修改文件名
# /usr/bin/env python
# -- coding:UTF-8 --
import os
root_dir = '/root/data/'
file_list = os.listdir(root_dir)
# print(file_list)
# 获取手机号目录
for a in file_list:
shouji_dir = root_dir + a
#print(shouji_dir)
# 获取分类列表
for b in shouji_dir:
fenlei_list = os.listdir(shouji_dir)
# 获取分类目录
for c in fenlei_list:
fenlei_dir = shouji_dir + '/' + c
#print(fenlei_dir)
# 获取日期列表
for d in fenlei_dir:
date_list = os.listdir(fenlei_dir)
#print(date_list)
# 获取日期目录
for e in date_list:
date_dir = fenlei_dir + '/' + e
#print(date_dir)
# 获取图片列表
for f in date_dir:
pic_list = os.listdir(date_dir)
#print(pic_list)
# 获取图片路径
for g in pic_list:
pic_dir = date_dir + '/' + g
#print(pic_dir)
# 获取图片数量与索引
pic_nu = len(pic_list)
pic_index = pic_list.index(g) + 1
#print(pic_dir,pic_nu,pic_index)
# 根据数量和索引修改文件名
new_path = date_dir + '/' + str(pic_nu) + '-' + str(pic_index) + '.jpg'
os.rename(pic_dir,new_path)
#print(new_path)
字节单位换算
#! /bin/bash
function checkNumber() {
re='^[0-9]+(\.[0-9]+)?$'
if ! [[ $1 =~ $re ]];then
return 1
fi
return 0
}
function Convert() {
if ! checkNumber $1;then
echo "expect number but receive $1"
return 1
fi
local gb=$((1024 * 1024 * 1024))
local mb=$((1024 * 1024))
local kb=1024
if (($1 >= $gb));then
echo "$(( $1 / $gb)) GB"
elif (($1 >= $mb));then
echo "$(( $1 / $mb)) MB"
elif (($1 >= $kb));then
echo "$(( $1 / $kb )) KB"
else
echo "$1 B"
fi
}
Convert $*
对一组 url 测试能否访问成功
#!/bin/bash
url_list=( #定义一个包含三个网址的数组 url_list
http://www.baidu.com
https://www.shiyanlou.com
http://www.google.com
)
wait(){ #定义倒计时函数 wait
echo -n 'wait 3 second...'
for ((i=0;i<3;i++))
do
echo -n ".";sleep 1 #每隔1秒打印一个点
done
echo
}
check_url(){
wait # 调用已经定义的 wait 函数
#循环遍历 url_list 中的地址
for ((i=0;i<`echo ${#url_list[*]}`;i++))
do
#检测是否可以访问数组元素中的地址
wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1 #--tries是设置尝试次数,--spider检查网址,后面的>/dev/null 2>&1是不保留任何输出
if [ $? -eq 0 ];then #如果返回值为0则表示访问成功
echo "${url_list[$i]} success"
else
echo "${url_list[$i]} false"
fi
done
}
main(){ #定义主函数,即入口函数,应用程序运行时首先执行的代码
check_url #调用定义的 check_url 函数
}
main #调用主函数
查询可用IP
#!/bin/bash
. /etc/init.d/functions
for var in {1..254};
do
ip=172.16.50.$var
ping -c2 $ip >/dev/null 2>&1
if [ $? = 0 ];then
action "$ip" /bin/true
else
action "$ip" /bin/false
fi
done
Spring Boot启动脚本
#!/bin/bash
SpringBoot=$2
if [ "$1" = "" ];
then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1
fi
if [ "$SpringBoot" = "" ];
then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
function start()
{
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
if [ $count != 0 ];then
echo "$SpringBoot is running..."
else
echo "Start $SpringBoot success..."
nohup java -jar $SpringBoot > /dev/null 2>&1 &
fi
}
function stop()
{
echo "Stop $SpringBoot"
boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
if [ $count != 0 ];then
kill $boot_id
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
kill -9 $boot_id
fi
}
function restart()
{
stop
sleep 2
start
}
function status()
{
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
if [ $count != 0 ];then
echo "$SpringBoot is running..."
else
echo "$SpringBoot is not running..."
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
echo -e "\033[0;31m Usage: \033[0m \033[0;34m sh $0 {start|stop|restart|status} {SpringBootJarName} \033[0m
\033[0;31m Example: \033[0m
\033[0;33m sh $0 start esmart-test.jar \033[0m"
esac
MySQL单表数据同步脚本
#!/usr/bin/env bash
# Auth: liuli
# Version: v1.0, 2020/6/17
# Sys: CentOS 7.6
# Features: 用于同步研发数据库中的某些表至生产数据库
# set -xeuo pipefail
time=`date '+%Y-%m-%d-%H:%M'`
mkdir -p ./sql/${time}
db_Name="temp-tenant"
table_Name=(
interface_authority
interface_permissions
t_user_function_authority
t_user_function_permission
t_menu
)
# 研发环境
dev_IP="192.168.1.15"
dev_Port="3306"
dev_Pass="123456Aa."
# 生产环境
prod_IP="192.168.1.16"
prod_Port="23306"
prod_Pass="123456Aa."
# 导出研发环境的表
for i in ${table_Name[*]}
do
mysqldump -h${dev_IP} -uroot -P${dev_Port} -p${dev_Pass} ${db_Name} ${i} > ./sql/${time}/dev.sql
done
# 导出生产环境的整个库
mysqldump -h${prod_IP} -uroot -P${prod_Port} -p${prod_Pass} ${db_Name} > ./sql/${time}/${db_Name}.sql
# 删除生产环境的表
for i in ${table_Name[*]}
do
mysql -h${prod_IP} -uroot -P${prod_Port} -p${prod_Pass} -e "USE ${db_Name};DROP TABLE ${i}"
done
# 导入研发环境的表
mysql -h${prod_IP} -uroot -P${prod_Port} -p${prod_Pass} ${db_Name} < ./sql/${time}/dev.sql
Shell执行SQL示例
#!/usr/bin/env bash
# Auth: liuli
# Version: v1.0, 2020/6/24
# Sys: CentOS 7.6
# Features: 解除医生端小程序微信绑定的医生信息
#set -xeuo pipefail
clear
# 变量
USER=root
HOST=127.0.0.1
PORT=3306
PASSWORD=6yhn^YHN
DATABASE=temp-tenant
# 查询函数
function my_query ()
{
query=$1
mysql -u${USER} -h${HOST} -P${PORT} -p${PASSWORD} ${DATABASE} -e "${query}"
}
# 判断函数
function stat ()
{
if [ $? -ne 0 ]; then
echo $2
else
echo $1
fi
}
# 程序开始
echo -n "你的unionid是:"
read UNIONID
# 判断UNIONID的正确性
if [ "${UNIONID}" = "" ];
then
echo -e "\033[0;31m 未输入unionid \033[0m "
exit 1
fi
if [ "${#UNIONID}" -ne "28" ];
then
echo -e "\033[0;31m 请输入正确的unionid \033[0m "
exit 1
fi
# 1、判断该unionid是否已绑定医生
sql1="SELECT count( id ) FROM t_user WHERE unionid = '${UNIONID}' AND type = '2';"
COUNT=$(my_query "${sql1}" | awk -F ")" '{print $NF}')
if [ "${COUNT}" -eq "1" ];then
echo "已绑定医生"
else
echo "该unionid未绑定医生"
exit 0
fi
# 2、获取医生账号(account)和密码(password1、password2)
sql2="SELECT account,PASSWORD password1, ( SELECT PASSWORD FROM t_user_account WHERE account IN ( SELECT account FROM t_wechat_user_info WHERE unionid = '${UNIONID}' ) ) password2 FROM t_wechat_user_info WHERE unionid = '${UNIONID}';"
ACCOUNT=$(my_query "${sql2}"| sed -n "2p"| awk '{print $1}')
echo $(stat "获取医生账号成功" "获取医生账号失败")
echo "绑定的医生账号为:${ACCOUNT}"
PASSWD1=$(my_query "${sql2}"| sed -n "2p"| awk '{print $2}')
echo $(stat "获取password1成功" "获取password1失败")
echo "密码1:${PASSWD1}"
PASSWD2=$(my_query "${sql2}"| sed -n "2p"| awk '{print $3}')
echo $(stat "获取password2成功" "获取password2失败")
echo "密码2:${PASSWD2}"
# 3、修改用户信息
sql3="UPDATE t_user SET openid = '${ACCOUNT}', unionid = '${ACCOUNT}' WHERE unionid = '${UNIONID}' AND type = '2';"
my_query "${sql3}"
echo $(stat "修改用户信息成功" "修改用户信息失败")
# 4、增加微信信息
sql4="INSERT INTO t_wechat_user_info ( subscribe,openid,nickname,sex,language,city,province,country,headimgurl,subscribe_time,unionid,remark,groupid,tagids,subscribe_scene,qr_scene,qr_scene_str,create_time,account,password,update_time,source,is_bind) VALUES ( 0,'${ACCOUNT}','',1,NULL,'','','','',NULL,'${ACCOUNT}',NULL,NULL,NULL,NULL,NULL,NULL,'2020-06-05 17:13:17','${ACCOUNT}','${PASSWD1}','2020-06-24 09:44:37','2','0');"
my_query "${sql4}"
echo $(stat "增加微信信息成功" "增加微信信息失败")
# 5、删除角色信息
sql5="DELETE FROM t_user_role WHERE user_id IN ( SELECT id FROM t_user WHERE unionid = '${UNIONID}');"
my_query "${sql5}"
echo $(stat "删除角色信息成功" "删除角色信息失败")
# 6、删除用户信息
sql6="DELETE FROM t_user WHERE unionid = '${UNIONID}';"
my_query "${sql6}"
echo $(stat "删除用户信息成功" "删除用户信息失败")
# 7、删除用户账号
sql7="DELETE FROM t_user_account WHERE account IN ( SELECT account FROM t_wechat_user_info WHERE unionid = '${UNIONID}' );"
my_query "${sql7}"
echo $(stat "删除用户账号成功" "删除用户账号失败")
# 8、删除微信信息
sql8="DELETE FROM t_wechat_user_info WHERE unionid = '${UNIONID}';"
my_query "${sql8}"
echo $(stat "删除微信信息成功" "删除微信信息失败")
# 9、新建被删除的医生
sql9="INSERT INTO t_user_account ( account, password ) VALUES ( '${ACCOUNT}', '${PASSWD2}' );"
my_query "${sql9}"
echo $(stat "新建被删除的医生成功" "新建被删除的医生失败")
带选择的Shell示例
#!/bin/bash
#
clear
echo "
选择一个选项:
1. 系统信息
2. 可用和已用磁盘空间
3. /home中每个用户的磁盘使用率
0. 退出
"
read -p "输入您的选项[0-3] > "
if [[ $REPLY =~ ^[0-3]$ ]]; then
if [[ $REPLY == 0 ]]; then
echo "脚本结束."
exit
fi
if [[ $REPLY == 1 ]]; then
echo "Hostname: $HOSTNAME"
uptime
exit
fi
if [[ $REPLY == 2 ]]; then
df -h
exit
fi
if [[ $REPLY == 3 ]]; then
if [[ $(id -u) -eq 0 ]]; then
echo " /home (All Users)的使用"
du -sh /home/*
else
echo "/home ($USER)的使用"
du -sh $HOME
fi
exit
fi
else
echo "输入错误." >&2
exit 1
fi
防DDOS攻击脚本
#!/bin/bash
netstat -na | awk '/ESTABLISHED/{split($5,T,":");print T[1]}' | sort | grep -v -E '192.168|127.0' | uniq -c | sort -rn | head -10 | awk '{if ($2!=null && $1>4) {print $2}}' > /var/log/rejectip
for i in $(cat /var/log/rejectip)
do
rep=$(iptables-save | grep $i)
if [[ -z $rep ]];then
/sbin/iptables -A INPUT -s $i -j DROP
echo "$i kill at `date`">>/var/log/ddos-ip
fi
done
文本处理
Sed 专栏
删除
# 删除第15行,d 表示删除
sed -i '15d' a.txt
# 删除第2~5行,'2,5d' 表示 2~5 行
sed -i '2,5d' a.txt
# 删除第13行到最后一行, $ 定位到最后一行
sed -i '13,$d' a.txt
# 删除最后一行
sed -i '$d' a.txt
# 删除空行
sed -i '/^$/d' a.txt
# 删除 # 开头的行
sed -i '/^#/d' a.txt
替换
# 所有空白替换成换行
sed -i 's/ /\n/g' a.txt
# 批量替换文件中匹配的字符串
grep 原字符串 -rwl /需要查找的目录/ | xargs -r sed -i 's/原字符串/新字符串/g'
# 使用 ; 或 -e 或 脚本文件 批量替换
sed -i 's/syl/shiyanlou/g; s/hate/love/g' a.txt
sed -i -e 's/syl/shiyanlou/g' -e 's/hate/love/g' a.txt
sed -i -f script words
# 将字符 A 所在行的字符 N 替换为 TEST
sed -i '/A/s/B/TEST/' a.txt
添加
# a 表示在行后添加一行加上字符串,i 表示在行前加一行添加字符串
# 在第二行后添加 test 字符串
sed -i '2a test' a.txt
# 第二行前添加一行插入 test 字符串
sed -i '2i test' a.txt
取出字符串后几位
取后三位
echo "SYBASE4"|sed 's/.*\(...\)$/\1/'
取后四位
echo "SYBASE4"|sed 's/.*\(....\)$/\1/'
awk专栏
获取某个进程的pid
ps -ef | grep mysql | grep -v grep | awk {print'$2'}
cut专栏
根据指定分界符截取文本
打印/etc/passwd
文件中以:
为分隔符的第 1 个字段和第 6 个字段分别表示用户名和其家目录
cut /etc/passwd -d ':' -f 1,6
打印/etc/passwd文件中每一行的前 N 个字符
# 前五位(包含第五个)
cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
$ cut /etc/passwd -c 5-
# 第五个
$ cut /etc/passwd -c 5
# 2到5之间的(包含第五个)
$ cut /etc/passwd -c 2-5
tr专栏
删除、替换一段文本信息中的某些文字
删除 “hello shiyanlou” 中所有的’o’,‘l’,‘h’
echo 'hello shiyanlou' | tr -d 'olh'
将"hello" 中的ll,去重为一个l
echo 'hello' | tr -s 'l'
将输入文本,全部转换为大写或小写输出
echo "hello" | tr [:lower:] [:upper:]
echo "hello" | tr [a-z] [A-Z]
Vim命令
# 每行的行首都添加一个字符串
:%s/^/字符串
# 每行的行尾都添加一个字符串
:%s/$/字符串
解释:
% 代表针对被编辑文件的每一行进行后续操作
$ 代表一行的结尾处
^ 代表一行的开头处
文本检索
搜索包含特定字符串的文本
搜索/etc
目录下所有包含passwd
的文本
grep -rnI "passwd" /etc/
统计文件数
下面统计/etc
下面所有目录数
ll -d /etc/*/ | wc -l
统计出现频率最多的前三个字符串
cat data1 |cut -c 8-|sort|uniq -dc|sort -rn -k1 |head -3
cat data1:查看data1文件
cut -c 8-:从第八个字符开始截取
sort :排序,将重复的放在一起
uniq -dc:去重,并显示出现频率大于1的行的次数
sort -rn -k1:按照指定的第1列,字符串数值降序排序
head -3:只看前三行
数据备份
rsync远程同步目录
需要对目标主机先配置ssh-copy-id
免登录
推送
#! /bin/bash
set -xeuo pipefail
ip="192.168.1.23"
log="/var/log/backup-192.168.1.21.log"
# 备份目录
dir=(
/home/ftp/ftpuser/liuli
/home/elasticsearch
/opt/shell
/root
/var/spool/cron/root
/var/log/backup-192.168.1.21.log
)
echo "****************************************** `date '+%Y-%m-%d %H:%M:%S'` 开始备份数据 ******************************************" >> ${log}
for i in ${dir[@]}
do
echo "`date '+%Y-%m-%d %H:%M:%S'` 备份${i}..." >> ${log}
rsync -az --delete ${i} ${ip}:/home/192.168.1.21
done
拉取
#!/bin/bash
ip="47.92.169.25"
log="/home/47.92.169.25/backup-47.92.169.25.log"
dir=(
/data
/home/mysql_sql
)
echo "****************************************** `date '+%Y-%m-%d %H:%M:%S'` 开始备份数据 ******************************************" >> ${log}
for i in ${dir[@]}
do
echo "`date '+%Y-%m-%d %H:%M:%S'` 备份${i}..." >> ${log}
rsync -az --delete ${ip}:${i} /home/47.92.169.25
done
mysqlLdump脚本
需要添加my.cnf
配置文件
[mysqldump]
user=root
password=123456Aa.
#!/bin/bash
time=`date "+%Y-%m-%d-%H:%M"`
mkdir -p /home/mysql_sql/${time}
db=(
confluence
physical2
un-paltform
)
for i in ${db[@]}
do
mysqldump -uroot -h127.0.0.1 -P3306 ${i} >/home/mysql_sql/${time}/${i}.sql
done
删除某天前创建的文件
语句写法:find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;
# 例1:将/usr/local/backups目录下所有10天前带"."的文件删除
find /usr/local/backups -mtime +10 -name "*.*" -exec rm -rf {} \;
# 例2:将/home/mysql_sql/目录下1天前创建的文件清空
find /home/mysql_sql/ -mtime +1 -name "*" -exec rm -rf {} \;
find:linux的查找命令,用户查找指定条件的文件
/usr/local/backups:想要进行清理的任意目录
-mtime:标准语句写法
+10:查找10天前的文件,这里用数字代表天数,+30表示查找30天前的文件
"*.*":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用
-exec:固定写法
rm -rf:强制删除文件,包括目录
{} \; :固定写法,一对大括号+空格+\
根据JSON返回值链接 wget 下载视频
#!/usr/bin/env bash
# Auth: liuli
# Version: v1.0, 2020/9/21
# Sys: CentOS 7.6
# Features: 根据接口返回值链接,下载视频
# 当前日期
TIME=`date -d "yesterday" +%Y-%m-%d`
# 创建备份目录
mkdir -p /home/tencent_video/${TIME}/
# 调用当日视频链接
function get_video() {
curl -sH "Content-Length:0" -X GET "http://192.168.1.11:30011/video/getVideoUrlByTime?startTime=${TIME}T00:00:00Z&endTime=${TIME}T23:59:00Z"
}
# 获取当日视频链接
get_video | jq '.data' > /tmp/video_link.txt
# 获取连接数量
NUM=$((`grep -o 'filePath' /tmp/video_link.txt | wc -l`-1))
# 循环下载视频
for i in `seq 0 ${NUM}`
do
# 获取视频名称
VIDEONAME=`get_video | jq '.data['${i}'].videoName'| awk -F '"' '{print $2}'`
# 获取视频下载路径
FILEPATH=`get_video | jq '.data['${i}'].filePath'| awk -F '"' '{print $2}'`
# 下载视频
wget -q ${FILEPATH} -O /home/tencent_video/${TIME}/${VIDEONAME}.mp4
done
Jenkins发布脚本
Jar包
ip="192.168.0.21"
passwd="root"
port="11822"
path="/root/ms"
jarname="dataWarehouse-ms-0.0.1.jar"
target="/root/.jenkins/workspace/dataWareHouse-ms/dataWarehouse-ms/target"
pid=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "ps -ef | grep ${jarname} | grep java | grep -v grep | awk '{print \\$2}'"`
if [ "X${pid}" = "X" ]
then
sshpass -p ${passwd} ssh ${ip} -p${port} -o StrictHostKeychecking=no "rm -rf ${path}/${jarname}"
sshpass -p ${passwd} scp -P ${port} ${target}/${jarname} ${ip}:${path}
sshpass -p ${passwd} ssh ${ip} -p${port} -o StrictHostKeychecking=no "cd ${path};nohup java -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -Dfile.encoding=UTF8 -Duser.timezone=GMT+08 -jar ${jarname} > ${path}/log.out 2>&1 &"
else
sshpass -p ${passwd} ssh ${ip} -p${port} -o StrictHostKeychecking=no "kill -9 \$(ps -ef | grep ${jarname} | grep java | grep -v grep | awk '{print \$2}')"
sshpass -p ${passwd} ssh ${ip} -p${port} -o StrictHostKeychecking=no "rm -rf ${path}/${jarname}"
sshpass -p ${passwd} scp -P ${port} ${target}/${jarname} ${ip}:${path}
sshpass -p ${passwd} ssh ${ip} -p${port} -o StrictHostKeychecking=no "cd ${path};nohup java -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -Dfile.encoding=UTF8 -Duser.timezone=GMT+08 -jar ${jarname} > ${path}/log.out 2>&1 &"
fi
Tomcat-静态文件
ip="192.168.0.21"
passwd="root"
port="11122"
tomcatpath="/root/tomcat-bg"
pid=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "ps -ef | grep ${tomcatpath} | grep java | grep -v grep | awk '{print \\$2}'"`
if [ "X${pid}" = "X" ]
then
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${tomcatpath}/webapps/*"
sshpass -p ${passwd} scp -P ${port} -r /root/.jenkins/workspace/${JOB_NAME}/dist ${ip}:${tomcatpath}/webapps
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "mv ${tomcatpath}/webapps/dist ${tomcatpath}/webapps/ROOT"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cp -r /opt/WEB-INF ${tomcatpath}/webapps/ROOT"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "${tomcatpath}/bin/startup.sh"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${tomcatpath}/webapps/*"
sshpass -p ${passwd} scp -P ${port} -r /root/.jenkins/workspace/${JOB_NAME}/dist ${ip}:${tomcatpath}/webapps
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "mv ${tomcatpath}/webapps/dist ${tomcatpath}/webapps/ROOT"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cp -r /opt/WEB-INF ${tomcatpath}/webapps/ROOT"
fi
Tomcat-war包
ip="192.168.0.21"
passwd="root"
port="12122"
tomcatpath="/root/cn-out-children-cs"
warname="cnSoutChildrenCs.war"
target="/root/.jenkins/workspace/dev-znbx/south-univ-children-sys/cn-out-children-cs/target"
pid=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "ps -ef | grep ${tomcatpath} | grep java | grep -v grep | awk '{print \\$2}'"`
if [ "X${pid}" = "X" ]
then
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${tomcatpath}/webapps/*"
sshpass -p ${passwd} scp -P ${port} ${target}/${warname} ${ip}:${tomcatpath}/webapps
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cd ${tomcatpath}/webapps/;unzip ${warname} -d ./ROOT"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${tomcatpath}/webapps/${warname}"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "${tomcatpath}/bin/startup.sh"
else
sshpass -p ${passwd} ssh ${ip} -p${port} -o StrictHostKeychecking=no "kill -9 \$(ps -ef | grep ${tomcatpath} | grep java | grep -v grep | awk '{print \$2}')"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${tomcatpath}/webapps/*"
sshpass -p ${passwd} scp -P ${port} ${target}/${warname} ${ip}:${tomcatpath}/webapps
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cd ${tomcatpath}/webapps/;unzip ${warname} -d ./ROOT"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${tomcatpath}/webapps/${warname}"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "${tomcatpath}/bin/startup.sh"
fi
node镜像
############################## 变量定义 ##############################
#### 远程服务器 ####
# IP地址
ip="192.168.1.26"
# 用户名
user="root"
# 密码
passwd="yidongjituan@123"
# 端口
port="22"
# docker映射端口
docker_port="31180"
# docker构建目录
docker_space="/tmp/docker/${JOB_NAME}"
# docker镜像名
docker_images="${JOB_NAME}:latest"
# docker容器名
docker_container="${JOB_NAME}"
############################## 环境检查 ##############################
#### 本地服务器 ####
# dockerfile目录是否存在
if [ -d "/root/docker/node/${JOB_NAME}/" ];then rm -rf /root/docker/node/${JOB_NAME}/*;else mkdir -p /root/docker/node/${JOB_NAME}/; fi
#### 远程服务器 ####
# docker构建目录是否存在
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "if [ -d ${docker_space} ];then rm -rf ${docker_space}/*;else mkdir -p ${docker_space}; fi"
# 删除同名容器
old_docker_container=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker ps -a|grep -w ${docker_container}|awk '{print \\$NF}'"`
if [ ! -n "${old_docker_container}" ];then
echo "container not exist"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker rm -f ${old_docker_container}"
fi
# 删除同名镜像
old_docker_image=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker images ${docker_images} | grep -v IMAGE |awk '{print \\$3}'"`
if [ ! -n "${old_docker_image}" ];then
echo "images not exist"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker rmi ${docker_images} "
fi
############################## dockerfile ##############################
cat >/root/docker/node/${JOB_NAME}/dockerfile<<EOF
FROM node:hospital_room
EXPOSE 30180
WORKDIR /my-node
ADD node.tar.gz /my-node
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
CMD ["npm","start"]
EOF
############################## 配置文件 ##############################
cat >/root/.jenkins/workspace/${JOB_NAME}/config/config.js<<EOF
// mysql配置文件
const dbConfig = {
connectionLimit: 5,
host: "192.168.1.26",
user: "root",
port: "3306",
password: "6yhn^YHN",
database: "demo-x",
timezone: "08:00"
};
// redis配置文件
const redisConfig = {
port: 26379,
host: "192.168.1.26"
};
const publicTopicObj = {};
exports.dbConfig = dbConfig;
exports.redisConfig = redisConfig;
EOF
############################## 项目打包 ##############################
cd /root/.jenkins/workspace/${JOB_NAME};rm -rf node.tar.gz
cd /root/.jenkins/workspace/${JOB_NAME};npm install
cd /root/.jenkins/workspace/${JOB_NAME};tar -zcf node.tar.gz *
############################## 构建镜像 ##############################
sshpass -p ${passwd} scp -P ${port} /root/.jenkins/workspace/${JOB_NAME}/node.tar.gz ${ip}:${docker_space}
sshpass -p ${passwd} scp -P ${port} /root/docker/node/${JOB_NAME}/dockerfile ${ip}:${docker_space}
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cd ${docker_space};docker build -t ${docker_images} ."
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker run -d -p ${docker_port}:30180 --restart=always --name ${docker_container} ${docker_images}"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker stop ${docker_container}"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "supervisorctl start docker-hospital_room"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${docker_space}/*"
Java镜像
############################## 定义变量 ##############################
#### 远程服务器 ####
# IP地址
ip="192.168.1.171"
# 用户名
user="root"
# 密码
passwd="root"
# 端口
port="22"
# docker映射端口
docker_port="30000"
# docker构建目录
docker_space="/tmp/docker/${JOB_NAME}"
# docker镜像名
docker_images="${JOB_NAME}:latest"
# docker容器名
docker_container="${JOB_NAME}"
# jar包目录
java_dir="/root/.jenkins/workspace/${JOB_NAME}/multi-tenant-eureka-sever/target"
# jar包名称
java_name="multi-tenant-eureka-sever-0.0.1.jar"
# jar包配置文件名称
config_name="application.properties"
# 配置文件端口
config_port="30171"
############################## 环境检查 ##############################
#### 本地服务器 ####
# dockerfile目录是否存在
if [ -d "/root/docker/java/${JOB_NAME}/" ];then rm -rf /root/docker/java/${JOB_NAME}/*;else mkdir -p /root/docker/java/${JOB_NAME}; fi
# jar包配置文件目录是否存在
if [ -d "/root/docker/java/${JOB_NAME}/config/" ];then rm -rf /root/docker/java/${JOB_NAME}/config/*;else mkdir -p /root/docker/java/${JOB_NAME}/config/; fi
#### 远程服务器 ####
# docker构建目录是否存在
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "if [ -d ${docker_space} ];then rm -rf ${docker_space}/*;else mkdir -p ${docker_space}; fi"
# 删除同名容器
old_docker_container=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker ps -a|grep -w ${docker_container}|awk '{print \\$NF}'"`
if [ ! -n "${old_docker_container}" ];then
echo "container not exist"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker rm -f ${old_docker_container}"
fi
# 删除同名镜像
old_docker_image=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker images ${docker_images} | grep -v IMAGE |awk '{print \\$3}'"`
if [ ! -n "${old_docker_image}" ];then
echo "images not exist"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker rmi ${docker_images} "
fi
############################## dockerfile ##############################
cat >/root/docker/java/${JOB_NAME}/dockerfile<<EOF
FROM openjdk:8u252-slim-buster
EXPOSE ${config_port}
WORKDIR /my-java
ADD . /my-java
CMD ["java","-Xms2048m","-Xmx4096m","-XX:PermSize=256m","-XX:MaxPermSize=512m","-XX:MaxNewSize=512m","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-jar","${java_name}"]
EOF
############################## 配置文件 ##############################
cat >/root/docker/java/${JOB_NAME}/config/${config_name}<<"EOF"
spring.application.name=eureka-server
server.port=30171
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${config_port}/eureka/
EOF
############################## 构建镜像 ##############################
sshpass -p ${passwd} scp -P ${port} ${java_dir}/${java_name} ${ip}:${docker_space}
sshpass -p ${passwd} scp -P ${port} /root/docker/java/${JOB_NAME}/config/${config_name} ${ip}:${docker_space}
sshpass -p ${passwd} scp -P ${port} /root/docker/java/${JOB_NAME}/dockerfile ${ip}:${docker_space}
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cd ${docker_space};docker build -t ${docker_images} ."
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker run -d -p ${docker_port}:${config_port} --restart=always --name ${docker_container} ${docker_images}"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${docker_space}/*"
tomcat-vue镜像
############################## 定义变量 ##############################
ip="192.168.1.172"
user="root"
passwd="root"
port="22"
docker_port="9876"
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:latest"
docker_container="${JOB_NAME}"
############################## 环境检查 ##############################
if [ -d "/root/docker/vue/${JOB_NAME}/" ];then rm -rf /root/docker/vue/${JOB_NAME}/*;else mkdir -p /root/docker/vue/${JOB_NAME}/; fi
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "if [ -d ${docker_space} ];then rm -rf ${docker_space}/*;else mkdir -p ${docker_space}; fi"
old_docker_container=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker ps -a|grep -w ${docker_container}|awk '{print \\$NF}'"`
old_docker_image=`sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker images ${docker_images} | grep -v IMAGE |awk '{print \\$3}'"`
if [ ! -n "${old_docker_container}" ];then
echo "container not exist"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker rm -f ${old_docker_container}"
fi
if [ ! -n "${old_docker_image}" ];then
echo "images not exist"
else
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker rmi ${docker_images} "
fi
############################## 配置文件 ##############################
cat >/root/.jenkins/workspace/${JOB_NAME}/src/config/index.js<<EOF
const iot = "http://39.100.246.141:30025";
const iot_login = "http://39.100.246.141:30023";
export {
iot,
iot_login,
}
EOF
############################## dockerfile ##############################
cat >/root/docker/vue/${JOB_NAME}/dockerfile<<EOF
FROM tomcat:jdk8-openjdk-slim
RUN rm -rf /usr/local/tomcat/webapps/*
COPY dist /usr/local/tomcat/webapps/ROOT
EOF
############################## 项目打包 ##############################
cd /root/.jenkins/workspace/${JOB_NAME};npm install
cd /root/.jenkins/workspace/${JOB_NAME};npm run build
cp -r /opt/WEB-INF/ /root/.jenkins/workspace/${JOB_NAME}/dist/
############################## 构建镜像 ##############################
sshpass -p ${passwd} scp -P ${port} -r /root/.jenkins/workspace/${JOB_NAME}/dist ${ip}:${docker_space}
sshpass -p ${passwd} scp -P ${port} /root/docker/vue/${JOB_NAME}/dockerfile ${ip}:${docker_space}
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "cd ${docker_space};docker build -t ${docker_images} ."
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "docker run -d -p ${docker_port}:8080 --restart=always --name ${docker_container} ${docker_images}"
sshpass -p ${passwd} ssh ${ip} -p ${port} -o StrictHostKeychecking=no "rm -rf ${docker_space}/*"
K8S
# 定义变量
java_dir="/home/.jenkins/workspace/${JOB_NAME}/public-model/cn-eureka-sever/target"
java_name="cn-eureka-sever-0.0.1.jar"
config_url="https://config.asiayd.com/java_config/internet-hospital/eureka.yml"
config_port="30000"
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_NUMBER}"
# 生成dockerfile
if [ -d ${docker_space} ];then rm -rf ${docker_space}/*;else mkdir -p ${docker_space}; fi
cat >${docker_space}/dockerfile<<EOF
FROM openjdk:8u252-slim-buster
EXPOSE ${config_port}
WORKDIR /my-java
ADD . /my-java
CMD ["java","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-jar","${java_name}"]
EOF
# 构建镜像
cp ${java_dir}/${java_name} ${docker_space}
wget ${config_url} -O ${docker_space}/bootstrap.yml
cd ${docker_space};docker build -t ${docker_images} .
rm -rf ${docker_space}/*
# 推送至仓库
docker tag ${docker_images} 192.168.1.40/xzzyy/${docker_images}
docker push 192.168.1.40/xzzyy/${docker_images}
docker rmi ${docker_images}
docker rmi 192.168.1.40/xzzyy/${docker_images}
# 生成Yaml
cat >/opt/yaml/revision/internet-hospital/${JOB_NAME}_v${BUILD_NUMBER}.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${JOB_NAME}-deployment
namespace: liuli-space
spec:
revisionHistoryLimit: 10
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: ${JOB_NAME}-pod
template:
metadata:
labels:
app: ${JOB_NAME}-pod
spec:
imagePullSecrets:
- name: yd-secret
containers:
- name: ${JOB_NAME}
image: 192.168.1.40/xzzyy/${docker_images}
ports:
- name: ${JOB_NAME}-port
containerPort: ${config_port}
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: ${JOB_NAME}-svc
namespace: liuli-space
labels:
name: ${JOB_NAME}-svc
spec:
type: NodePort
selector:
app: ${JOB_NAME}-pod
ports:
- protocol: TCP
port: ${config_port}
targetPort: ${config_port}
nodePort: ${config_port}
EOF
# 备份文件
scp /opt/yaml/revision/internet-hospital/${JOB_NAME}_v${BUILD_NUMBER}.yaml 39.100.246.14:/usr/share/nginx/html/k8s_config/internet-hospital
# 部署
kubectl apply -f /opt/yaml/revision/internet-hospital/${JOB_NAME}_v${BUILD_NUMBER}.yaml
Dockerfile
java项目
FROM openjdk:8u252-slim-buster
EXPOSE ${config_port}
WORKDIR /my-java
ADD . /my-java
CMD ["java","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-jar","${java_name}"]
node项目
# 拉取node:10-slim镜像
FROM node:10-slim
# 暴露8080端口
EXPOSE 8080
# 切换工作目录/my-node
WORKDIR /my-node
# 将node包解压进my-node目录
ADD node.tar.gz /my-node
# 启动node项目
CMD ["npm","start"]
gcc环境
#拉取Centos镜像
FROM centos:latest
#作者信息
MAINTAINER liuli<1224979840@qq.com>
#配置阿里的yum源,删除系统自带的yum源
RUN rm -rf /etc/yum.repos.d/*
#将阿里的yum文件复制进去
COPY Centos-7.repo /etc/yum.repos.d/Centos-7.repo
#设置亚洲时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#安装openssh-server
RUN yum install -y openssh-server \
#修改配置
&& sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
#安装openssh-clients
&& yum install -y openssh-clients \
#修改root密码
&& echo "root" | passwd --stdin root \
#生成密钥
&& ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
#安装gcc环境
&& yum install -y gcc \
&& yum clean all
#设置支持中文字符
RUN yum -y install kde-l10n-Chinese telnet \
&& yum -y reinstall glibc-common \
&& yum clean all
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.utf8
ENV LANGUAGE=zh_CN.utf8
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#暴露22端口
EXPOSE 22
#执行后台启动ssh服务命令
CMD ["/usr/sbin/sshd", "-D"]
带ssh环境
#拉取Centos镜像
FROM centos:latest
#作者信息
MAINTAINER liuli<1224979840@qq.com>
#配置阿里的yum源,删除系统自带的yum源
RUN rm -rf /etc/yum.repos.d/*
#将阿里的yum文件复制进去
COPY Centos-7.repo /etc/yum.repos.d/Centos-7.repo
#设置亚洲时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#安装openssh-server
RUN yum install -y openssh-server \
#修改配置
&& sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
#安装openssh-clients
&& yum install -y openssh-clients \
#修改root密码
&& echo "root" | passwd --stdin root \
#生成密钥
&& ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
#清除yum安装缓存
&& yum clean all
#设置支持中文字符
RUN locale \
&& localedef -i zh_CN -c -f UTF-8 zh_CN.UTF-8 \
&& echo "export LC_ALL=zh_CN.UTF-8" >> /etc/profile && source /etc/profile \
ENV LANG zh_CN.UTF-8
ENV LC_CTYPE zh_CN.UTF-8
#暴露22端口
EXPOSE 22
#执行后台启动ssh服务命令
CMD ["/usr/sbin/sshd", "-D"]
启动
docker run -d -p10022:22 --name centos 192.168.0.20:5000/centos