首页
关于
推荐
CSDN
Search
1
文件上传下载-io-流的理解-笔记
156 阅读
2
vue循环指令el-table-column展示图片src路径拼接
149 阅读
3
正则表达式,将字符串分割两部分
142 阅读
4
MySQL数据库练习【一】
134 阅读
5
MySQL数据库练习【三】
122 阅读
默认分类
Mysql
Java基础
一天一练
Mongodb
Nginx
Docker
FastDFS
面试题
云计算基础
linux基础
shell脚本
实验
工具
基础命令
redis
zookeeper
部署
案例
登录
Search
标签搜索
vue
Mysql
IO
面试题
良辰美景好时光
累计撰写
72
篇文章
累计收到
0
条评论
首页
栏目
默认分类
Mysql
Java基础
一天一练
Mongodb
Nginx
Docker
FastDFS
面试题
云计算基础
linux基础
shell脚本
实验
工具
基础命令
redis
zookeeper
部署
案例
页面
关于
推荐
CSDN
搜索到
72
篇与
的结果
2025-04-30
shell脚本一天一练----修改文件和目录权限
shell脚本一天一练----修改文件和目录权限[root@Rocky9-12 ~]# cat 0430-03.sh #!/bin/bash # ************************************* # * 功能: Shell脚本模板 # * 作者: 刘丹玉 # * 联系: v649352141@163.com # * 版本: 2025-04-30 # ************************************* # 需求: # 检查/data/wwwroot/app目录下所有文件和目录,看是否满足下面条件 # 1) 所有文件权限为644 # 2) 所有目录权限为755 # 3) 文件和目录所有者为www,所属组为root # 如果不满足,改成符合要求 # 注意,不要直接改权限,一定要有判断的过程 rm -rf /data/* mkdir -p /data/wwwroot/app cd /data/wwwroot/app mkdir -p a/b/c/d/e/f/g/h touch a/a.{1..5}.txt touch a/b/b.{1..5}.txt touch a/b/c/c.{1..5}.txt touch a/b/c/d/d.{1..5}.txt touch a/b/c/d/e/e.{1..5}.txt touch a/b/c/d/e/f/f.{1..5}.txt touch a/b/c/d/e/f/g/g.{1..5}.txt touch a/b/c/d/e/f/g/h/h.{1..5}.txt # 遍历所有目录和文件,用"find ."即可 for f in $(find .) do # 查看文件权限 f_p=$(stat -c %a $f) # 查看文件所有者 f_u=$(stat -c %U $f) # 查看文件所属组 f_g=$(stat -c %G $f) # 判断是否为目录 if [ -d $f ] then [ $f_p != '755' ] && chmod 755 $f else [ $f_p != '644' ] && chmod 644 $f fi ## &&用在两条命令中间,可以起到if判断的作用 ## 当第一条命令成功,才会执行后面的命令 [ $f_u != 'www' ] && chown www $f [ $f_g != 'root' ] && chown :root $f done <<'COMMENT' 另外也可以用find来实现 find /data/wwwroot/app/ -type d ! -prem 755 -exec chmod 755 {} \; find /data/wwwroot/app/ ! -type d ! -prem 644 -exec chmod 644 {} \; find /data/wwwroot/app/ ! -user www -exec chown www {} \; find /data/wwwroot/app/ ! -group root -exec chgrp root {} \; 两个脚本相比,第一个只需要find一次,而第二个需要find四次 如果文件量很大,执行效率很差 ### 关键知识点总结: 1) 查看文件权限: stat -c %a 1.txt 2) 查看文件所属组: stat -c %G 1.txt 3) 查看文件所有者: stat -c %U 1.txt 4) && 可以实现: 当前面命令执行成功再执行后面命令 5) || 可以实现: 当前面命令执行不成功再执行后面命令 COMMENTendl
2025年04月30日
16 阅读
0 评论
0 点赞
2025-04-30
shell脚本一天一练----检测磁盘读写正常与否
shell脚本一天一练----检测磁盘读写正常与否#!/bin/bash # ************************************* # * 功能: 检测磁盘读写正常与否 # * 作者: 刘丹玉 # * 联系: v649352141@163.com # * 版本: 2025-04-30 # ************************************* # 需求 # 写一个检测脚本,用来检测本机所有磁盘分区读写是否都正常 # 提示:可以遍历所有挂载点,然后新建一个测试文件 # 然后再删除测试文件,如果可以正常新建和删除,那说明该分区没问题 for mount_p in $(df | sed '1d' | grep -v 'tmpfs' | awk '{print $NF}') do # 创建测试文件,并删除,从而确定该磁盘分区是否有问题 dd if=/dev/zero of=$mount_p/testfile bs=1 count=10 >/dev/null 2>&1 && rm -f $mount_p/testfile if [ $? -ne 0 ] then echo "$mount_p 读写有问题" else echo "$mount_p 读写正常" fi done ### 关键知识点总结: # 1) &&连接符表示当前面的命令执行成功才会执行后面的命令 # 在本例中,只有两条命令都执行成功了返回值才是0 # 否则任何一条命令执行出错,返回值都为非0 # 2) 写脚本的过程中,可以一边在命令行中运行命令 调试 一般写脚本 # 3) shell脚本里的sed、grep、awk 无处不在,所以用户这三个工具也是关键 [root@Rocky9-12 ~]# bash 0430-02.sh / 读写正常 /boot 读写正常 /home 读写正常 endl
2025年04月30日
19 阅读
0 评论
0 点赞
2025-04-30
shell脚本一天一练----创建用户
shell脚本一天一练----创建用户#!/bin/bash # ************************************* # * 功能: Shell脚本模板 # * 作者: 刘丹玉 # * 联系: v649352141@163.com # * 版本: 2025-04-30 # ************************************* # 练习题 # 需求 # 创建10个用户,并给他们设置随机密码,密码记录到一个文件里,文件名为userinfo.txt # 用户从user_00 到 user_09 # 密码要求:包含大小写字母以及数字,密码长度为15位 # 先查看/tmp/userinfo.txt文件是否存在,存在的话先删除,以免影响到本次脚本执行结果 if [ -f /tmp/userinfo.txt ] then rm -f /tmp/userinfo.txt fi # 借助seq生成从00到09、10个数的队列 for i in $(seq -w 0 09) do p=$(openssl rand -base64 15 | tr -dc 'a-zA-Z0-9' | head -c 15) # 添加用户,并给该用户设置密码 useradd user_${i} && echo "${p}" | passwd --stdin user_${i} echo "user_${i} ${p}" >> /tmp/userinfo.txt done ### 关键知识点总结: ### 1) openssl rand -base64 15:生成 15 字节的随机数据,并以 Base64 编码输出。 ### tr -dc 'a-zA-Z0-9':过滤输出,只保留大小写字母和数字。 ### head -c 15:截取前 15 个字符。 ### 2) seq可以生成序列,用法: seq 1 5; seq 5; seq 1 2 10; seq 10 -2 1;seq -w 1 10; ### ### 3) passwd --stdin username[root@Rocky9-12 ~]#bash 0430-01.sh Changing password for user user_00. passwd: all authentication tokens updated successfully. Changing password for user user_01. passwd: all authentication tokens updated successfully. Changing password for user user_02. passwd: all authentication tokens updated successfully. Changing password for user user_03. passwd: all authentication tokens updated successfully. Changing password for user user_04. passwd: all authentication tokens updated successfully. Changing password for user user_05. passwd: all authentication tokens updated successfully. Changing password for user user_06. passwd: all authentication tokens updated successfully. Changing password for user user_07. passwd: all authentication tokens updated successfully. Changing password for user user_08. passwd: all authentication tokens updated successfully. Changing password for user user_09. passwd: all authentication tokens updated successfully.endl
2025年04月30日
26 阅读
0 评论
0 点赞
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日
26 阅读
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 # 设置本机ip和密码 read -s -p "请输入本机的密码:" secret echo # 换行,让后续输出从新行开始 # 检查密码是否为空 if [ -z "$secret" ]; then echo "错误:密码不能为空!" >&2 exit 1 fi # 可选:使用密码进行后续操作 echo "密码已设置,进行后续操作..." 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 &>/dev/null && { echo "未安装 expect,正在尝试安装..."; yum -y install expect &>/dev/null || { echo "错误:expect 安装失败,请检查网络连接或权限" >&2; exit 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 "$secret\r" } timeout { puts "连接 127.0.0.1 超时,推送失败。" exit 1 } eof { if { [regexp -nocase "Permission denied" \$expect_out(buffer)] } { puts "认证失败: $ip" exit 1 } else { puts "密钥推送成功: $ip" exit 0 } } } 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 { [regexp -nocase "Permission denied" \$expect_out(buffer)] } { puts "认证失败: $ip" exit 1 } else { puts "密钥推送成功: $ip" exit 0 } } } 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[root@Rocky9-12 ~]# bash ssh_expect.sh 请输入本机的密码: 密码已设置,进行后续操作... 清空 ip_up.txt 文件 生成 SSH 密钥对 检查 ip.txt 文件是否存在 判断是否安装expect package expect is not installed 将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:123456#!/bin/bash # 错误处理:如果命令执行失败,脚本将终止 set -e echo "生成并清空 ip_del.txt 文件" > ip_del.txt > ip_success.txt echo "检查 ip_up.txt 文件是否存在" if [ ! -f "ip_up.txt" ]; then echo "ip_up.txt 文件不存在,请检查。" exit 1 fi # 读取文件内容到数组 hosts=() while IFS= read -r line; do hosts+=("$line") done < ip_up.txt # 检查文件内容格式 for line in "${hosts[@]}"; do remote_ip=$(echo "$line" | cut -d' ' -f1) pass=$(echo "$line" | cut -d' ' -f2) if [ -z "$remote_ip" ] || [ -z "$pass" ]; then echo "ip_up.txt 文件格式错误:$line" exit 1 fi done # 使用数组执行实际操作 all_success=true sleep 1 for line in "${hosts[@]}"; do remote_ip=$(echo "$line" | cut -d' ' -f1) pass=$(echo "$line" | cut -d' ' -f2) # 使用 expect 实现 秘钥快速删除 /usr/bin/expect <<-END &>/dev/null set timeout 10 spawn ssh -o StrictHostKeyChecking=no root@$remote_ip "rm -rf ~/.ssh/*" expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } timeout { puts "连接 $remote_ip 超时,删除失败。" exit 1 } eof { if { [exp_status] != 0 } { puts "删除 $remote_ip 密钥对失败。" exit 1 } } } expect eof END # 检查 expect 命令的退出状态 if [ $? -ne 0 ]; then all_success=false echo "$remote_ip 删除失败" >> ip_del.txt else echo "$remote_ip 删除成功" >> ip_success.txt echo "$remote_ip 删除成功" fi done wait if [ "$all_success" = true ]; ; then # 删除本机密钥对 rm -rf ~/.ssh echo "秘钥对成功删除" else echo "部分秘钥对成功删除失败,请检查。" fi echo "删除结果统计:" echo "成功: $(wc -l < ip_success.txt) 台主机" echo "失败: $(wc -l < ip_del.txt) 台主机" echo "endl"注意:必须执行两次才可以 [root@Rocky9-12 ~]# bash ssh_del.sh 生成并清空 ip_del.txt 文件 检查 ip_up.txt 文件是否存在 [root@Rocky9-12 ~]# bash ssh_del.sh 生成并清空 ip_del.txt 文件 检查 ip_up.txt 文件是否存在 10.0.0.12 删除成功 10.0.0.13 删除成功 10.0.0.14 删除成功 10.0.0.15 删除成功 10.0.0.16 删除成功 10.0.0.17 删除成功 10.0.0.18 删除成功 10.0.0.19 删除成功 10.0.0.20 删除成功 秘钥对成功删除 删除结果统计: 成功: 9 台主机 失败: 0 台主机 endlendl
2025年04月28日
34 阅读
0 评论
0 点赞
1
2
3
4
...
15