Shell脚本合集

实用脚本

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值