首页
关于
推荐
CSDN
Search
1
文件上传下载-io-流的理解-笔记
128 阅读
2
vue循环指令el-table-column展示图片src路径拼接
121 阅读
3
正则表达式,将字符串分割两部分
111 阅读
4
MySQL数据库练习【一】
109 阅读
5
MySQL数据库练习【三】
92 阅读
默认分类
Mysql
Java基础
一天一练
Mongodb
Nginx
Docker
FastDFS
面试题
云计算基础
linux基础
shell脚本
实验
工具
基础命令
redis
zookeeper
部署
案例
登录
Search
标签搜索
vue
Mysql
IO
面试题
良辰美景好时光
累计撰写
67
篇文章
累计收到
0
条评论
首页
栏目
默认分类
Mysql
Java基础
一天一练
Mongodb
Nginx
Docker
FastDFS
面试题
云计算基础
linux基础
shell脚本
实验
工具
基础命令
redis
zookeeper
部署
案例
页面
关于
推荐
CSDN
搜索到
6
篇与
的结果
2025-04-30
源码安装tomcat脚本rocky/ubuntu
源码安装tomcat脚本#!/bin/bash # ************************************* # * 功能: JDK或者tomcat源码环境部署 # * 作者: 刘丹玉 # * 联系: v649352141@163.com # * 版本: 2025-04-30 # ************************************* # 上传相关jdk源码包 Rocky_jdk="jdk-23_linux-x64_bin.rpm" Rocky_tomcat="apache-tomcat-10.1.33" Ubuntu_jdk="jdk-23_linux-x64_bin.deb" Ubuntu_tomcat11="apache-tomcat-11.0.4" Ubuntu_tomcat9="apache-tomcat-9.0.97" # 错误处理:如果命令执行失败,脚本将终止 set -e # 颜色脚本,通用 color () { RES_COL=60 MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_WARNING="echo -en \\033[1;33m" SETCOLOR_NORMAL="echo -en \E[0m" echo -n "$1" && $MOVE_TO_COL echo -n "[" if [ $2 = "success" -o $2 = "0" ] ;then ${SETCOLOR_SUCCESS} echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE} echo -n $"FAILED" else ${SETCOLOR_WARNING} echo -n $"WARNING" fi ${SETCOLOR_NORMAL} echo -n "]" echo } # 查看属于Rocky、Ubuntu、openEuler系列 os_type () { awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release } # 源码安装JDK install_jdk_resource (){ color "$(os_type) 开始安装JDK" 0 mkdir /data/{softs,server,app} -p cd /data/softs if [ $(os_type) == "Rocky" ] || [ $(os_type) == "openEuler" ];then [ -f $Rocky_jdk ] && rpm -ivh $Rocky_jdk > /dev/null 2>&1 || { color "$Rocky_jdk 文件不存在,安装失败,退出!" 1 ;exit; } elif [ $(os_type) == "Ubuntu" ] ;then [ -f $Ubuntu_jdk ] && dpkg -i $Ubuntu_jdk > /dev/null 2>&1 || { color "$Ubuntu_jdk 文件不存在,安装失败,退出!" 1 ;exit; } else color "$(os_type) 暂不支持此版本" 3 fi color "$(os_type) JDK 安装成功" 0 } # rocky源码安装tomcat install_tomcat_resource_rocky (){ color "$(os_type) 开始安装java环境" 0 yum -y install java-11-openjdk > /dev/null 2>&1 cat > /etc/profile.d/java.sh<<EOF export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.25.0.9-3.el9.x86_64 export JAVA_BIN=$JAVA_HOME/bin export PATH=$JAVA_BIN:$PATH EOF source /etc/profile.d/java.sh color "$(os_type) java环境安装成功" 0 color "$(os_type) 开始安装tomcat" 0 [ -f $Rocky_tomcat.tar.gz ] && { tar xf $Rocky_tomcat.tar.gz -C /data/server/; } || { color "$Rocky_tomcat.tar.gz 文件不存在,安装失败,退出!" 1 ;exit; } ln -s /data/server/$Rocky_tomcat /data/server/tomcat cat > /etc/profile.d/tomcat.sh <<EOF export CATALINA_BASE=/data/server/tomcat export CATALINA_HOME=/data/server/tomcat export CATALINA_TMPDIR=$CATALINA_HOME/temp export CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar export PATH=$CATALINA_HOME/bin:$PATH EOF source /etc/profile.d/tomcat.sh useradd -r -s /sbin/nologin tomcat chown -R tomcat:tomcat /data/server/tomcat chown -R tomcat:tomcat /data/server/tomcat/* if [ $(os_type) == "Rocky" ];then cat > /usr/lib/systemd/system/tomcat.service <<EOF [Unit] Description=Tomcat After=syslog.target network.target [Service] Type=forking Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.25.0.9-3.el9.x86_64/ ExecStart=/data/server/tomcat/bin/startup.sh ExecStop=/data/server/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target EOF elif [ $(os_type) == "openEuler" ];then cat > /usr/lib/systemd/system/tomcat.service <<EOF [Unit] Description=Tomcat After=syslog.target network.target [Service] Type=forking Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.25.9-3.oe2403.x86_64/ ExecStart=/data/server/tomcat/bin/startup.sh ExecStop=/data/server/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target EOF else color "$(os_type) 暂不支持此版本" 3 fi systemctl daemon-reload systemctl start tomcat color "$(os_type) tomcat安装成功" 0 } # 源码安装tomcat11 install_tomcat11_resource_ubuntu (){ color "$(os_type) 开始安装java环境" 0 apt update > /dev/null 2>&1 && apt install openjdk-17-jdk -y > /dev/null 2>&1 cat > /etc/profile.d/java.sh<<EOF export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export JAVA_BIN=$JAVA_HOME/bin export PATH=$JAVA_BIN:$PATH EOF source /etc/profile.d/java.sh color "$(os_type) java环境安装成功" 0 color "$(os_type) 开始安装tomcat11" 0 cd /data/softs [ -f $Ubuntu_tomcat11.tar.gz ] && { tar xf $Ubuntu_tomcat11.tar.gz -C /data/server/; } || { color "$Ubuntu_tomcat11.tar.gz 文件不存在,安装失败,退出!" 1 ;exit; } ln -s /data/server/$Ubuntu_tomcat11 /data/server/tomcat cat > /etc/profile.d/tomcat.sh <<EOF export CATALINA_BASE=/data/server/tomcat export CATALINA_HOME=/data/server/tomcat export CATALINA_TMPDIR=$CATALINA_HOME/temp export CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar export PATH=$CATALINA_HOME/bin:$PATH EOF source /etc/profile.d/tomcat.sh useradd -r -s /sbin/nologin tomcat chown -R tomcat:tomcat /data/server/tomcat chown -R tomcat:tomcat /data/server/tomcat/* cat > /usr/lib/systemd/system/tomcat.service <<EOF [Unit] Description=Tomcat After=syslog.target network.target [Service] Type=forking # Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/ ExecStart=/data/server/tomcat/bin/startup.sh ExecStop=/data/server/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start tomcat color "$(os_type) tomcat11安装成功" 0 } # 源码安装tomcat9 install_tomcat9_resource_ubuntu (){ color "$(os_type) 开始安装java环境" 0 apt update > /dev/null 2>&1 && apt -y install openjdk-11-jdk > /dev/null 2>&1 cat > /etc/profile.d/java.sh<<EOF export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export JAVA_BIN=$JAVA_HOME/bin export PATH=$JAVA_BIN:$PATH EOF source /etc/profile.d/java.sh color "$(os_type) java环境安装成功" 0 color "$(os_type) 开始安装tomcat9" 0 cd /data/softs [ -f $Ubuntu_tomcat9.tar.gz ] && { tar xf $Ubuntu_tomcat9.tar.gz -C /data/server/; } || { color "$Ubuntu_tomcat9.tar.gz 文件不存在,安装失败,退出!" 1 ;exit; } ln -s /data/server/$Ubuntu_tomcat9 /data/server/tomcat cat > /etc/profile.d/tomcat.sh <<EOF export CATALINA_BASE=/data/server/tomcat export CATALINA_HOME=/data/server/tomcat export CATALINA_TMPDIR=$CATALINA_HOME/temp export CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar export PATH=$CATALINA_HOME/bin:$PATH EOF source /etc/profile.d/tomcat.sh useradd -r -s /sbin/nologin tomcat chown -R tomcat:tomcat /data/server/tomcat chown -R tomcat:tomcat /data/server/tomcat/* cat > /usr/lib/systemd/system/tomcat.service <<EOF [Unit] Description=Tomcat After=syslog.target network.target [Service] Type=forking # Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/ ExecStart=/data/server/tomcat/bin/startup.sh ExecStop=/data/server/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start tomcat color "$(os_type) tomcat9安装成功" 0 } # 定义菜单函数 show_menu_tomcat() { echo "请选择以下操作:" echo "1. 源码部署tomcat9环境" echo "2. 源码部署tomcat11环境" echo "3. 退出" read -p "请输入你的选择(1-3): " choice_tomcat } # 安装tomcat install_tomcat (){ mkdir /data/{server,softs,code} -p cd /data/softs if [ $(os_type) == "Rocky" ] || [ $(os_type) == "openEuler" ];then install_tomcat_resource_rocky elif [ $(os_type) == "Ubuntu" ] ;then show_menu_tomcat case $choice_tomcat in 1) install_tomcat9_resource_ubuntu ;; 2) install_tomcat11_resource_ubuntu ;; 3) echo "退出程序" break ;; *) echo "无效的选择,请输入 1 到 3 之间的数字。" ;; esac else color "$(os_type) 暂不支持此版本" 3 fi color "$(os_type) 源码部署tomcat成功 " 0 } # 定义菜单函数 show_menu() { echo "请选择以下操作:" echo "1. 源码部署JDK环境" echo "2. 源码部署tomcat环境" echo "3. 退出" read -p "请输入你的选择(1-3): " choice } main () { color "$(os_type) 源码部署,请提前上传源码到/data/softs中 " 0 show_menu case $choice in 1) install_jdk_resource ;; 2) install_tomcat ;; 3) echo "退出程序" break ;; *) echo "无效的选择,请输入 1 到 3 之间的数字。" ;; esac } mainendl
2025年04月30日
4 阅读
0 评论
0 点赞
2025-04-28
expect基本使用
expect基本使用使用expect创建脚本的方法1.定义脚本执行的shell#!/usr/bin/expect 这里定义的是expect可执行文件的链接路径(或真实路径),功能类似于bash等shell功能。2.set timeout 30设置超时时间,单位是秒,如果设置为timeout -1意为永不超时。3.spawnspawn是进入expect环境后才能执行的内部命令,不能直接在默认的shell环境中进行执行 主要功能:传递交互命令4.expect这里的expect同样是expect的内部命令 主要功能:判断输出结果是否包含某项字符串,没有则立即返回,否则就等待一段时间后返回,等待时间通过timeout进行设置。5.send执行交互动作,将交互要执行的动作进行输入给交互指令 命令字符串结尾要加上"r",如果出现异常等待的状态可以进行核查6.interact执行完后保持交互状态,把控制权交给控制台 如果不加这一项,交互完成后自动退出7.exp_continue继续执行接下来的交互操作8.$argvexpect脚本可以接收从bash传递过来的参数,可以使用[index $atgv n]获得,n从0开始,分别表示第一个,第二个,第三个......参数案例案例1:实现ssh远程登录#!/usr/bin/expect # 开启一个程序 spawn ssh root@10.0.0.12 expect { "yes/no" { send "yes\r" exp_continue } "password:" { send "123456\r" } } interact[root@openEuler-14 data]# ./ssh-v0.sh spawn ssh root@10.0.0.12 root@10.0.0.12's password: Activate the web console with: systemctl enable --now cockpit.socket Last login: Sun Apr 27 21:42:07 2025 from 10.0.0.14 [root@Rocky-12 ~]# exit 注销 Connection to 10.0.0.12 closed.案例2:免密码登录其他主机[root@openEuler-14 data]# cat ssh.exp #!/usr/bin/expect set ipaddress "10.0.0.12" set passwd "123456" set timeout 30 spawn ssh root@$ipaddress expect { "yes/no" { send "yes\r" exp_continue } "password:" { send "$passwd\r" } } interactchmod +x ssh.exp ./ssh.exp执行验证:[root@openEuler-14 data]# ./ssh.exp spawn ssh root@10.0.0.12 root@10.0.0.12's password: Activate the web console with: systemctl enable --now cockpit.socket Last login: Tue Apr 1 16:28:20 2025 from 10.0.0.1 [root@Rocky-12 ~]# exit 注销 Connection to 10.0.0.12 closed.案例3:通过调用bash的位置参数实现ssh远程登录#!/usr/bin/expect set ipaddress [ lindex $argv 0 ] set user [ lindex $argv 1 ] set passwd [ lindex $argv 2 ] set timeout 30 spawn ssh $user@$ipaddress expect { "yes/no" { send "yes\r" exp_continue } "password:" { send "$passwd\r" } } interact[root@openEuler-14 data]# ./ssh.exp 10.0.0.12 root 123456 spawn ssh root@10.0.0.12 root@10.0.0.12's password: Activate the web console with: systemctl enable --now cockpit.socket Last login: Sun Apr 27 20:57:37 2025 from 10.0.0.14案例4:A远程登录到server上操作#!/usr/bin/expect set ipaddress "10.0.0.12" set passwd "123456" set timeout 30 spawn ssh root@$ipaddress expect { "yes/no" { send "yes\r" exp_continue } "password:" { send "$passwd\r" } } #interact expect "#" send "hostname\r" send "useradd test01\r" send "pwd\r" send "exit\r" expect eof测试效果[root@openEuler-14 data]# ./ssh-v3.sh spawn ssh root@10.0.0.12 root@10.0.0.12's password: Activate the web console with: systemctl enable --now cockpit.socket Last login: Sun Apr 27 21:54:27 2025 from 10.0.0.14 [root@Rocky-12 ~]# hostname Rocky-12 [root@Rocky-12 ~]# useradd test01 [root@Rocky-12 ~]# pwd /root [root@Rocky-12 ~]# exit 注销 Connection to 10.0.0.12 closed. [root@openEuler-14 data]#案例5:shell脚本和expect结合使用,在多台服务器上创建1个用户[root@openEuler-14 data]# cat ip.txt 10.0.0.12 123456 10.0.0.13 123456 1.循环 2.登录远程主机-->ssh-->从ip.txt文件里获取IP和密码分别赋值给两个变量 3.使用expect程序来解决交互问题[root@openEuler-14 data]# cat a.sh #!/bin/bash while read ip username;do echo $ip,$username done < ip.txt [root@openEuler-14 data]# bash a.sh 10.0.0.12,123456 10.0.0.13,123456脚本#!/bin/bash # 循环在指定的服务器上创建用户和文件 while read ipaddress passwd do /usr/bin/expect <<-END &>/dev/null spawn ssh root@$ipaddress expect { "yes/no" { send "yes\r" exp_continue } "password:" { send "$passwd\r" } } expect "#" { send "useradd zhangsan;rm -rf /tmp/*;exit\r" } expect eof END done < ip.txt执行程序[root@openEuler-14 data]# ./ssh-v4.sh [root@openEuler-14 data]# 测试结果root@ubuntu-13:~# ls /tmp 10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt root@ubuntu-13:~# id zhangsan id: "zhangsan": 无此用户 root@ubuntu-13:~# ls /tmp root@ubuntu-13:~# id zhangsan uid=1001(zhangsan) gid=1001(zhangsan) 组=1001(zhangsan) [root@Rocky-12 ~]# ls /tmp 10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt [root@Rocky-12 ~]# id zhangsan id: “zhangsan”:无此用户 [root@Rocky-12 ~]# ls /tmp [root@Rocky-12 ~]# id zhangsan 用户id=1002(zhangsan) 组id=1002(zhangsan) 组=1002(zhangsan)综合案例实战案例1:shell批量推送公钥脚本写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上 说明:主机和密码文件已经提供 10.0.0.10:123456 10.0.0.11:123456 10.0.0.12:123456 10.0.0.13:123456[root@openEuler-14 data]# cat ip.txt | tr ':' ' ' > ip.bak [root@openEuler-14 data]# tr ':' ' ' < ip.txt > ip.bak [root@openEuler-14 data]# cat ip.bak 10.0.0.10 123456 10.0.0.11 123456 10.0.0.12 123456 10.0.0.13 123456 [root@openEuler-14 data]# tr ':' ' ' < ip.txt | tee ip.bak 10.0.0.10 123456 10.0.0.11 123456 10.0.0.12 123456 10.0.0.13 123456 [root@openEuler-14 data]# tr ':' ' ' < ip.txt | while read ip pass;do echo $ip:$pass;done 10.0.0.10 123456 10.0.0.11 123456 10.0.0.12:123456 10.0.0.13:123456案例分析:关闭防火墙和selinux判断ssh服务是否开启(默认ok)==循环判断给定密码文件里的哪些IP是可以ping通的== ip pass==判断IP是否可以ping通--->$?-->流程控制语句====密码文件里获取主机的IP和密码保存变量==ip pass==判断公钥是否存在-->不存在创建它====ssh-copy-id将跳板机上的yunwei用户的公钥推送到远程主机-->expect解决交换==将ping通的主机IP单独保存到一个文件测试验证代码拆分:1.获取IP并且判断是否可以ping通 1) 主机密码文件ip.txt 10.0.0.10:123456 10.0.0.11:123456 10.0.0.12:123456 10.0.0.13:123456 2) 循环判断主机是否ping通 tr ':' ' ' < ip.txt | while read ip pass do ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then 判断公钥是否存在 推送公钥 fi done 2.判断yunwei用户的公钥是否存在 [ ! -f /hmoe/yunwei/.ssh/id_rsa ] && ssh-keygen -P '' -f /root/.ssh/id_rsa 3.非交互推送公钥 /usr/bin/expect <<-END &>/dev/null spawn ssh-copy-id root@$ip expect { "yes/no" { send "yes\r" exp_continue } "password:" { send "$pass\r" } } expect eof END最终实现:环境: jumper-server 有yunwei用户 1.在跳板机上创建yunwei用户,并且生成一对秘钥 2.检测当前局域网中哪些ip是能ping通,哪些是不能ping通 循环语句并发的去检查 3.在脚本中所有的交互动作需要用到expect实现 yunwei用户sudo授权: visudo ## Allow root to run any commands anywhere root ALL=(ALL) ALL yunwei ALL=(root) NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm -rf /解释说明: 1)第一个字段yunwei指定的是用户:可以是用户名,也可以是别名。每个用户设置一行,多个用户设置多行,也可以将多个用户设置成一个别名后再进行设置。 2)第二个字段ALL指定的是用户所在的主机:可以是ip,也可以是主机名,表示该sudo设置只在该主机上生效,ALL表示在所有主机上都生效!限制的一般都是本机,也就是限制使用这个文件的主机;一般都指定为”ALL"表示所有的主机,不管文件拷到那里都可以用。比如:10.1.1.1=...则表示只在当前主机生效。 3)第三个字段(root)括号里指定的也是用户:指定以什么用户身份执行sudo,即使用sudo后可以享有所有root账号下的权限。如果要排除个别用户,可以在括号内设置,比如ALL=(ALL,!oracle,!pos)。 4)第四个字段ALL指定的是执行的命令:即使用sudo后可以执行所有的命令。除了关机和删除根内容以外;也可以设置别名。NOPASSWD:ALL表示使用sudo的不需要输入密码。 5)也可以授权给一个用户组 %admin ALL=(ALL) ALL表示admin组里的所有成员可以在任何主机上以任何用户身份执行任何命令#!/bin/bash # push publickey to app-servers # 将局域网内可以ping通的主机ip保存到一个文件 > ip_up.txt tr ':' ' ' < ip.txt | while read ip pass do { ping -c1 $ip &>/dev/null [ $? -eq 0 ] && echo "$ip $pass" | tee -a ip_up.txt }& # 并行放到后台运行 done wait # 等待进程结束 # 将yunwei用户目录下的公钥推送到可以ping的服务器上 # 1.判断yunwei用户下有没有公钥 [ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null 2>&1 # 2.将id_rsa.pub公钥远程推送到指定服务器 # 2.1 判断expect程序是否安装,没安装则安装它 { rpm -q expect [ $? -ne 0 ] && sudo yum -y install expect &>/dev/null 2>&1 while read remote_ip pass do /usr/bin/expect <<-END spawn ssh-copy-id root@$remote_ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect eof END done < ip_up.txt }>/dev/null wait echo "公钥已经推送完毕,正在测试..." # 测试验证 remote_ip=$(tail -1 ip_up.txt | cut -d' ' -f1) ssh root@$remote_ip hostname &>/dev/null test $? -eq 0 && echo "公钥成功推送完毕"[root@openEuler-14 data]# bash a.sh 10.0.0.10 123456 10.0.0.11 123456 10.0.0.12 123456 10.0.0.13 123456 公钥已经推送完毕,正在测试... 公钥成功推送完毕实战案例2:shell批量推送公钥脚本--优化#!/bin/bash >ip_up.txt # 判断公钥是否存在 [ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null 2>&1 # 循环判断主机是否ping通,如果ping通则推送公钥 tr ':' ' ' < ip.txt | while read ip pass do { ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo $ip >> ip_up.txt /usr/bin/expect <<-END &>/dev/null spawn ssh-copy-id root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect eof END fi }&>/dev/null done wait echo "公钥已经推送完毕,正在测试..." # 测试验证 remote_ip=$(tail -1 ip_up.txt) ssh root@$remote_ip hostname &>/dev/null test $? -eq 0 && echo "公钥成功推送完毕"实战案例3:多机互通--优化[root@openEuler-14 ~]# cat ip.txt 10.0.0.10:123456 10.0.0.11:123456 10.0.0.12:123456 10.0.0.13:123456#!/bin/bash echo "清空 ip_up.txt 文件" > ip_up.txt # 生成 SSH 密钥对,不输出信息到屏幕 echo "生成 SSH 密钥对" ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa > /dev/null 2>&1 echo "检查 ip.txt 文件是否存在" if [ ! -f "ip.txt" ]; then echo "ip.txt 文件不存在,请检查。" exit 1 fi echo "判断是否安装expect" rpm -q expect [ $? -ne 0 ] && sudo yum -y install expect &>/dev/null 2>&1 echo "将ssh密钥对复制到本地主机" # 使用 expect 实现 ssh-copy-id 到本地主机 /usr/bin/expect <<-END &>/dev/null spawn ssh-copy-id 127.1 expect { "yes/no" { send "yes\r"; exp_continue } "password:" { send "Huawei12#$\r" } timeout { puts "连接 127.0.0.1 超时,推送失败。" exit 1 } eof { if { [exp_status] != 0 } { puts "向 127.0.0.1 推送公钥失败。" exit 1 } } } expect eof END echo "start" # 循环判断主机是否 ping 通,如果 ping 通则推送公钥 while IFS=: read -r ip pass; do # 检查读取的行是否符合格式 if [ -z "$ip" ] || [ -z "$pass" ]; then echo "ip.txt 文件中存在格式错误的行:$ip:$pass" continue fi ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo $ip $pass echo $ip $pass >> ip_up.txt /usr/bin/expect <<-END &>/dev/null spawn rsync -avz /root/.ssh/ $ip:/root/.ssh/ expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } timeout { puts "连接 $ip 超时,推送失败。" exit 1 } eof { if { [exp_status] != 0 } { puts "向 $ip 推送公钥失败。" exit 1 } } } expect eof END fi done < ip.txt wait echo "秘钥已经推送完毕,正在测试..." echo "测试所有可达主机的公钥推送是否成功" all_success=true while read -r line; do remote_ip=$(echo "$line" | cut -d' ' -f1) ssh root@"$remote_ip" hostname &>/dev/null if [ $? -ne 0 ]; then echo "向 $remote_ip 推送公钥失败。" all_success=false fi done < ip_up.txt if $all_success; then echo "秘钥成功推送完毕" else echo "部分主机公钥推送失败,请检查。" fi echo "endl"[root@openEuler-14 ~]# bash a.sh 清空 ip_up.txt 文件 生成 SSH 密钥对 检查 ip.txt 文件是否存在 判断是否安装expect expect-5.45.4-8.oe2403.x86_64 将ssh密钥对复制到本地主机 start 10.0.0.12 123456 10.0.0.13 123456 秘钥已经推送完毕,正在测试... 测试所有可达主机的公钥推送是否成功 秘钥成功推送完毕 endl实战案例4:快速删除远程密钥对在3的基础上,万一密钥对泄露,可以实现快速删除,更换秘钥对[root@openEuler-14 ~]# cat ip_up.txt 10.0.0.12:123456 10.0.0.13:123456echo "生成并清空 ip_del.txt 文件" > ip_del.txt echo "检查 ip_up.txt 文件是否存在" if [ ! -f "ip_up.txt" ]; then echo "ip_up.txt 文件不存在,请检查。" exit 1 fi echo "测试所有密钥对是否删除成功" all_success=true while read -r line; do remote_ip=$(echo "$line" | cut -d' ' -f1) ssh root@"$remote_ip" "rm -rf ~/.ssh/*" &>/dev/null if [ $? -ne 0 ]; then echo "$remote_ip删除秘钥失败。" echo $remote_ip >> ip_del.txt all_success=false fi done < ip_up.txt if $all_success; then # 删除本机密钥对 rm -rf ~/.ssh echo "秘钥对成功删除" else echo "部分秘钥对成功删除失败,请检查。" fi echo "endl"endl
2025年04月28日
7 阅读
0 评论
0 点赞
2025-04-25
安装nginx脚本rocky/ubuntu
安装nignx脚本#!/bin/bash # #****************************************************************************** #Author: dange #QQ: XXXXXXXXX #Date: 2025-04-25 #FileName: install_nginx.sh #Description: Ubuntu 22.04/24.04 & Rocky 8/9 & openEuler24系列 #Copyright (C): 2025 All rights reserved #****************************************************************************** SRC_DIR=/data/server NGINX_URL=http://nginx.org/download/ NGINX_FILE=nginx-1.26.3 TAR=.tar.gz NGINX_INSTALL_DIR=/data/server/nginx CPUS=$(nproc) # 颜色脚本,通用 color () { RES_COL=60 MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_WARNING="echo -en \\033[1;33m" SETCOLOR_NORMAL="echo -en \E[0m" echo -n "$1" && $MOVE_TO_COL echo -n "[" if [ $2 = "success" -o $2 = "0" ] ;then ${SETCOLOR_SUCCESS} echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE} echo -n $"FAILED" else ${SETCOLOR_WARNING} echo -n $"WARNING" fi ${SETCOLOR_NORMAL} echo -n "]" echo } # 查看属于Rocky、Ubuntu、openEuler系列 os_type () { awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release } # Linux版本信息 os_version () { awk -F'"' '/^VERSION_ID/{print $2}' /etc/os-release } check () { # 检查文件夹是否存在 [ -d ${SRC_DIR} ] || { mkdir /data/codes /data/server /data/softs -p; } # 检查是否存在nginx执行文件 [ -e ${NGINX_INSTALL_DIR} ] && { color "nginx 已安装,请卸载后再安装" 1; exit; } cd ${SRC_DIR} if [ -e ${NGINX_FILE}${TAR} ];then color "相关文件已准备好" 0 else color '开始下载 nginx 源码包' 0 wget ${NGINX_URL}${NGINX_FILE}${TAR} > /dev/null 2>&1 [ $? -ne 0 ] && { color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; } fi } install () { color "开始安装 nginx" 0 # 创建用户 if id nginx &> /dev/null;then color "nginx 用户已存在" 1 else useradd -s /sbin/nologin -r nginx color "创建 nginx 用户" 0 fi # 临时关闭setenforce,防止启动不起来nginx,报错 if [[ $(os_type) == "CentOS" || $(os_type) == "Rocky" || $(os_type) == "openEuler" ]] ;then if [[ $(getenforce) == "Enforcing" ]];then setenforce 0 color "SELinux 已临时关闭" 0 fi fi # 安装需要依赖的软件包 color "开始安装 nginx 依赖包" 0 if [[ $(os_type) == "Rocky" || $(os_type) == "openEuler" ]] ;then yum -y -q install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel > /dev/null 2>&1 yum -y -q install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel > /dev/null 2>&1 elif [ $(os_type) == "Ubuntu" ] ;then apt update > /dev/null 2>&1 apt -y install build-essential gcc g++ libc6 libc6-dev libpcre3 libpcre3-dev libssl-dev libsystemd-dev zlib1g-dev > /dev/null 2>&1 apt -y install libxml2 libxml2-dev libxslt1-dev php-gd libgd-dev geoip-database libgeoip-dev > /dev/null 2>&1 else apt update > /dev/null 2>&1 apt -y install make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev > /dev/null 2>&1 fi color "开始安装 nginx 配置" 0 cd $SRC_DIR # 解压缩 tar xf ${NGINX_FILE}${TAR} cd ${NGINX_FILE} ./configure --prefix=${NGINX_INSTALL_DIR} --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module >/dev/null 2>&1 # 多线程编译 color "开始安装 nginx 多线程编译" 0 make -j $CPUS > /dev/null 2>&1 && make install > /dev/null 2>&1 [ $? -eq 0 ] && color "nginx 编译安装成功" 0 || { color "nginx 编译安装失败,退出!" 1 ;exit; } # 定制环境变量 echo "PATH=${NGINX_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/nginx.sh source /etc/profile.d/nginx.sh # 修改目录属主属组并查看 chown -R nginx:nginx /data/server/nginx/ # 创建软链接 ln -sv /data/server/nginx/sbin/nginx /usr/sbin/nginx >/dev/null 2>&1 # 生成pid mkdir -p ${NGINX_INSTALL_DIR}/run # touch ${NGINX_INSTALL_DIR}/run/nginx.pid # 修改配置文件设置pid路径 sed -i.bak '/pid/a pid /data/server/nginx/run/nginx.pid;' /data/server/nginx/conf/nginx.conf # 创建日志文件夹 # mkdir ${NGINX_INSTALL_DIR}/logs/ color "定制nginx服务管理" 0 cat > /usr/lib/systemd/system/nginx.service <<EOF [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=${NGINX_INSTALL_DIR}/run/nginx.pid ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx -c ${NGINX_INSTALL_DIR}/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID LimitNOFILE=100000 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now nginx &> /dev/null systemctl is-active nginx &> /dev/null || { color "nginx 启动失败,退出!" 1 ; exit; } color "nginx 安装完成" 0 } check install endl
2025年04月25日
6 阅读
0 评论
1 点赞
2024-10-31
shell脚本变量子串和变量扩展【进阶篇】
@TOC1.特殊位置变量符号含义应用$0脚本的名字出现故障提示 使用帮助一般与$#$n(n数字)脚本的第几个参数 传参桥梁(命令行 传递到 脚本中)/etc/init.d/network start$#脚本参数的个数判断参数个数是否正常$*取出所有的参数 加上双引号:相当于是1个整体 1个参数循环或数组$@取出所有的参数 加上双引号:就是每个都是独立循环或数组2.特殊变量之状态符号含义 $?上一条命令0 正常非0 失败判断各种东西执行 服务是否成功 配合判断$$当前运行脚本的pid在脚本中把pid记录到文件 方便后面进行kill$!上一个运行的脚本的pid $_上一个命令或脚本的最后一个参数 esc+._(下划线)环境变量3.变量子串格式${xxxxx}主要作用:变量子串效率比使用相应的命令 效率更高提前说明:parameter 变量名字(参数)使用的时候 遇到 含义 去哪里查找man bash 参考Parameter Expansion内容parameter变量含义基本 ${parameter}返回变量的内容${#parameter}返回变量$parameter的长度按照范围cut截取 ${parameter:offset}在$parameter中,从位置offset之后开始提取子串${parameter:offset:length}在$parameter中,从位置offset之后开始提取长度为length的子串删除(sed) ${parameter#world}从变量$parameter的开头,删除最短匹配word的子串${parameter##world}从变量$parameter的开头,删除最长匹配word的子串${parameter%world}从变量$parameter的结尾,删除最短匹配word的子串${parameter%%world}从变量$parameter的结尾,删除最长匹配word的子串替换(sed) ${parameter/pattern/string}使用string来代替第一个匹配的pattern${parameter//pattern/string}使用string代替所有匹配的pattern3.1.统计变量中内容的字数(字符数)3.2.统计字符数方法3.3.面试题:I am a student,welcome to our traning study.显示这串字符串中单词字数大于6的单词3.4.按照范围cut截取切片${变量:起点} 从起点显示到结束${变量:起点:长度} 从起点显示最多“长度”个字符顾头不顾尾3.5.字符删除${变量#内容} 左边开始(开头)${变量%内容} 右边开始(结尾)3.6.取出文件名和文件路径【效率高】3.7.字符替换(sed)不支持正则表达式,目前只能支持通配符 * {} [0-9] [a-z] [A-Z]| ${parameter/pattern/string} | 使用string来代替第一个匹配的pattern | | ${parameter//pattern/string} | 使用string代替所有匹配的pattern |4.变量扩展给变量设置==默认值==内容含义${parameter:-word}如果parameter没有被赋值或者其值为空,那么就以word作为其值${parameter:=word}如果parameter没有被赋值或者其值为空,那么就以word作为其值,并且将word赋值给parameter${parameter:?word}如果parameter没有被赋值或者其值为空,那么就以word作为错误输出.否则显示parameter内容${parameter:+word}如果parameter没有被赋值或者其值为空,就什么都不做。否则用word替换变量内容5.小结[19:57:12 root@backup ~]# ll /etc/init.d/functions /etc/init.d/network -rw-r--r--. 1 root root 18281 May 22 2020 /etc/init.d/functions -rwxr-xr-x. 1 root root 7928 May 22 2020 /etc/init.d/networkendl
2024年10月31日
4 阅读
0 评论
0 点赞
2024-07-24
xsync集群同步脚本
@TOC一、简介配置集群时需要将文件拷贝到各个机器,使用 xsync 工具同时进行多台机器同步数据,省去了麻烦。二、环境准备准备三台虚拟机,IP 分别为 192.168.147.128、192.168.147.129、192.168.147.130,修改三台机器主机名:# 192.168.147.128 echo > host128 /etc/hostname # 192.168.147.129 echo > host129 /etc/hostname # 192.168.147.130 echo > host130 /etc/hostname三、添加到机器的 hosts 文件vim /etc/hosts # 添加以下内容 192.168.147.128 host128 192.168.147.129 host129 192.168.147.130 host130四、ping 命令测试# 每隔0.6秒ping一次,一共ping 5次 ping -c 5 -i 0.6 host128五、SSH 配置5.1.本地先生成公钥和私钥ssh-keygen5.2.将公钥拷贝到其他机器# 命令格式 ssh-copy-id -i ~/.ssh/id_rsa.pub remote_ip # remote_ip 为远程主机的 IP 地址,我们需要同时输入其它机器ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.147.128 ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.147.129 ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.147.130六、xsync 脚本编写6.1.安装 rsyncxsync 是对 rsync 的再封装,需要安装 rsync yum -y install rsync6.2.新建 xsync.shvim /usr/bin/xsync.sh6.3.xsync.sh脚本#!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in host128 host129 host130 do echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4. 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done6.4.赋予脚本执行权限chmod 777 /usr/bin/xsync.sh6.5.测试touch /usr/local/a.txt xsync.sh /usr/local/a.txt endl
2024年07月24日
6 阅读
0 评论
1 点赞
1
2