首页
📈统计
📬留言
💘关于
更多
💞友链
📺直播
🎠壁纸
Search
1
docker部署chromium
5 阅读
2
prometheus+alertmanager告警
2 阅读
3
minio部署以及使用挂载
2 阅读
4
typecho背景透明设置
2 阅读
5
httpd文件服务器
1 阅读
🎑Linux
centos
ubuntu
deepin
debian
🎉Typecho
🎻小程序
🍕生活
🍞其他
☸k8s
🤖监控配置
登录
Search
标签搜索
shell
脚本
文档
doc
存储
typecho
chromium
lazy-balancer
Typecho
累计撰写
57
篇文章
累计收到
37
条评论
首页
栏目
🎑Linux
centos
ubuntu
deepin
debian
🎉Typecho
🎻小程序
🍕生活
🍞其他
☸k8s
🤖监控配置
页面
📈统计
📬留言
💘关于
💞友链
📺直播
🎠壁纸
搜索到
7
篇与
的结果
2026-04-03
virsh脚本安装虚拟机
● 写好了自动化脚本安装虚拟机1、安装virtyum install -y qemu-kvm libvirt libvirt-client virt-install virt-viewer bridge-utils systemctl start libvirtd && systemctl enable libvirtd2、上传iso镜像到/data/iso上传iso镜像到服务器的 /data/iso/ 目录下3、mvstat脚本#!/usr/bin/env bash # 红色 red() { echo -e $'\033[0;31m'"$1"$'\033[0m' } # 黄色 yellow() { echo -e $'\033[0;33m'"$1"$'\033[0m' } # 用法: print_table "ID|名称|状态" <(paste id mvname mvstatus) print_table() { local headers="$1" local data_source="$2" # 生成id mvname mvstatus virsh list --all | awk 'NR>2 && NF>0 {print $1}' > /tmp/id virsh list --all | awk 'NR>2 && NF>0 {print $2}' > /tmp/vmname virsh list --all | awk 'NR>2 && NF>0 {print $3}' > /tmp/vmstatus # 计算字符串显示宽度(汉字占2宽,英文/数字占1宽) str_width() { local str="$1" echo -n "$str" | awk '{ width = 0 for (i = 1; i <= length($0); i++) { char = substr($0, i, 1) if (char ~ /[^\x00-\x7F]/) { width += 2 } else { width += 1 } } print width }' } # 左对齐并填充到目标宽度 align_left() { local str="$1" local target_width="$2" local current_width=$(str_width "$str") local spaces=$((target_width - current_width)) if [ $spaces -lt 0 ]; then spaces=0; fi printf "%s%*s" "$str" "$spaces" "" } # 生成横线 make_line() { local count=$1 printf '%*s' "$count" '' | tr ' ' '-' } # 收集数据 local data=("$headers") while IFS=$'\t' read -r line; do if [[ -n "$line" ]]; then data+=("$(echo "$line" | tr '\t' '|')") fi done < <(eval "$data_source" 2>/dev/null) # 获取列数 IFS='|' read -ra header_fields <<< "$headers" local col_count=${#header_fields[@]} # 计算每列最大宽度 declare -a max_width for ((col=0; col<col_count; col++)); do max_width[$col]=0 for line in "${data[@]}"; do IFS='|' read -ra fields <<< "$line" if [[ $col -lt ${#fields[@]} ]]; then local width=$(str_width "${fields[$col]}") [[ $width -gt ${max_width[$col]} ]] && max_width[$col]=$width fi done done # 打印表格分隔线 print_separator() { for col in "${!max_width[@]}"; do printf "+%s" "$(make_line $((max_width[$col] + 2)))" done echo "+" } # 打印数据行 print_data_row() { local -a fields=("$@") for col in "${!max_width[@]}"; do local field="${fields[$col]:-}" local pad=$((max_width[$col] - $(str_width "$field"))) printf "| %s%${pad}s " "$field" "" done echo "|" } # 输出表格 print_separator for line in "${data[@]}"; do IFS='|' read -ra fields <<< "$line" print_data_row "${fields[@]}" print_separator done } # 关机\开机\重启\删除\添加磁盘\卸载磁盘 DELTE_VM(){ QEMU_DIR="/data/virt-data" print_table "ID|名称|状态" "paste /tmp/id /tmp/vmname /tmp/vmstatus" read -r -p "请选择机器名称: " VIRTNAME if [ -z "${VIRTNAME}" ];then red "机器名称不能为空!" exit 1 else grep -w ${VIRTNAME} /tmp/vmname > /dev/null 2>&1 if [ $? -eq 0 ];then rm -rf /tmp/id /tmp/vmname /tmp/vmstatus else red "您选择的机器不存在!" exit 1 fi if [ "${VIRTNAME}" == "kzprd" ];then yellow "${VIRTNAME} 主机不让删除,确定删除请输入删除密码进行删除." yellow "密码提示: 123@" read -r -p "请输入密码: " PASSWORDS if [ "${PASSWORDS}" == "123@qwe~~" ];then yellow "选择的机器是: ${VIRTNAME}" else red "您输入的密码有误机器不删除,即将退出!" exit 1 fi else yellow "选择的机器是: ${VIRTNAME}" fi fi echo "1 关机" echo "2 开机" echo "3 重启" echo "4 删除" echo "5 添加磁盘" echo "6 卸载磁盘" read -r -p "请选择(1-3): " INPUTID if [ "${INPUTID}" == "1" ];then virsh destroy ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已关机" || red "机器关机失败${VIRTNAME}" elif [ "${INPUTID}" == "2" ];then virsh start ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已开机" || red "机器开机失败${VIRTNAME}" elif [ "${INPUTID}" == "3" ];then virsh reset ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已重启" || red "机器重启失败${VIRTNAME}" elif [ "${INPUTID}" == "4" ];then virsh destroy ${VIRTNAME} > /dev/null 2>&1 virsh undefine ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已删除" || red "机器删除失败${VIRTNAME}" rm -rf ${QEMU_DIR}/${VIRTNAME}.qcow2 > /dev/null 2>&1 && yellow "机器${VIRTNAME}.qcow2已删除" || red "机器${VIRTNAME}.qcow2删除失败" elif [ "${INPUTID}" == "5" ];then read -p "增加磁盘大小单位G: " DISKS case $DISKS in ''|*[!0-9]*) red "错误:请输入数字!" exit 1 ;; *) mkdir -p "${QEMU_DIR}/${VIRTNAME}" # 获取可用设备名和文件名 TARGET=$(get_next_target) DISK_PATH=$(get_next_filename) # 显示信息 yellow "准备添加数据盘:" echo " 设备名: ${TARGET}" echo " 磁盘文件: ${DISK_PATH}" echo " 大小: ${DISKS}G" # 创建磁盘 if qemu-img create -f qcow2 "${DISK_PATH}" ${DISKS}G > /dev/null 2>&1; then yellow "磁盘创建成功!" else red "磁盘创建失败!" exit 1 fi # 挂载磁盘 if virsh attach-disk ${VIRTNAME} "${DISK_PATH}" ${TARGET} --live --persistent --subdriver=qcow2 > /dev/null 2>&1; then yellow "磁盘挂载成功!" echo "" yellow "当前磁盘列表:" virsh domblklist ${VIRTNAME} else red "磁盘挂载失败!" exit 1 fi ;; esac elif [ "${INPUTID}" == "6" ];then # 获取数据盘列表(排除vda) DISKS=$(virsh domblklist ${VIRTNAME} 2>/dev/null | awk 'NR>2 && $1 != "vda" && $1 != "" {print $1}') if [ -z "$DISKS" ]; then red "没有可卸载的数据盘" exit 1 fi yellow "============= 请选择需要卸载的磁盘 =============" select DISK in $DISKS; do if [ -n "$DISK" ]; then yellow "准备卸载: $DISK" read -p "确认? (y/n): " confirm if [ "$confirm" = "y" ]; then # 先获取磁盘文件路径(在卸载前获取) DISK_PATH=$(virsh domblklist ${VIRTNAME} --details 2>/dev/null | awk -v d="$DISK" '$3==d {print $4}') # 卸载磁盘 if virsh detach-disk ${VIRTNAME} ${DISK} --live --persistent > /dev/null 2>&1; then yellow "✓ 磁盘 ${DISK} 卸载成功" # 删除对应的磁盘文件 if [ -n "$DISK_PATH" ] && [ -f "$DISK_PATH" ]; then rm -f "$DISK_PATH" yellow "✓ 磁盘文件已删除: ${DISK_PATH}" else yellow "磁盘文件不存在: ${DISK_PATH}" fi else red "✗ 磁盘 ${DISK} 卸载失败" fi fi break else red "无效选择" fi done virsh domblklist ${VIRTNAME} else red "请输入(1-6)正确的数字" exit 1 fi } # 获取已使用的设备名 get_next_target() { local used_targets=$(virsh domblklist ${VIRTNAME} --details 2>/dev/null | awk 'NR>2 {print $3}' | grep -E '^vd[a-z]+$') local letters=("b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z") for letter in "${letters[@]}"; do if ! echo "$used_targets" | grep -q "vd${letter}"; then echo "vd${letter}" return 0 fi done echo "vdb" } # 获取不重复的文件名 get_next_filename() { local base="${QEMU_DIR}/${VIRTNAME}/${VIRTNAME}_data.qcow2" local counter=1 local filename="$base" # 如果基础文件不存在,直接返回 if [ ! -f "$filename" ]; then echo "$filename" return 0 fi # 基础文件存在,尝试添加后缀 while [ -f "${QEMU_DIR}/${VIRTNAME}/${VIRTNAME}_data_${counter}.qcow2" ]; do ((counter++)) done echo "${QEMU_DIR}/${VIRTNAME}/${VIRTNAME}_data_${counter}.qcow2" } # 检查端口是否为数字且在范围内,且不冲突 validate_vnc_port() { local port="$1" # 1. 判断输入的必须是数字 if [[ ! "$port" =~ ^[0-9]+$ ]]; then echo "错误: 端口必须是数字!" return 1 fi # 2. 数字必须是5900-5999之间 if [[ "$port" -lt 5900 ]] || [[ "$port" -gt 5999 ]]; then echo "错误: 端口范围必须是 5900-5999 之间!" return 1 fi # 3. 选择的端口不能与本地已存在的端口冲突 if ss -tlnp 2>/dev/null | grep -q ":$port " || \ netstat -tlnp 2>/dev/null | grep -q ":$port " || \ lsof -i ":$port" 2>/dev/null | grep -q LISTEN; then echo "错误: 端口 $port 已被占用!" return 1 fi return 0 } # 创建iso,通过vnc访问安装机器 CREATE_ISO(){ read -r -p "请命名虚拟机名称: " VMNAMES if [ -z "${VMNAMES}" ];then red "虚拟机名称不能为空!" exit 1 else ISO_NAME=$(ls /data/iso/ | cat) if [ -z "$ISO_NAME" ]; then red "没有可用的镜像,请确保iso存放到了 /data/iso/ 目录下!!!" exit 1 fi echo "" yellow "请选择镜像" select ISO in $ISO_NAME; do if [ -n "$ISO" ]; then echo "选择的镜像是: $ISO" # 循环输入直到正确 while true; do read -r -p "请选择VNC端口 5900-5999: " VNCPORT if validate_vnc_port "$VNCPORT"; then yellow "✓ 端口 $VNCPORT 验证通过" break else red "端口已存在或不在5900-5999之间,请重新输入!" echo "" fi done read -p "确认? (y/n): " confirm if [ "$confirm" = "y" ]; then yellow "虚拟机 ${VMNAMES} 正在创建中..." virt-install \ --name ${VMNAMES} \ --memory 2048 \ --vcpus 1 \ --cdrom /data/iso/${ISO} \ --disk path=/data/virt-data/${VMNAMES}.qcow2,size=10 \ --network network=default \ --graphics vnc,listen=0.0.0.0,port=${VNCPORT} # 显示状态 yellow "=========================================" virsh list yellow "=========================================" yellow "查看日志: tail -f /var/log/libvirt/qemu/${VMNAMES}.log" yellow "进入控制台: virsh console ${VMNAMES}" yellow "nvc连接地址: 192.168.4.20:5999" else yellow "退出安装iso" fi break else red "无效选择" fi done fi } # 创建虚拟机 CREATE_VM(){ QEMU_FILE="/data/virt-data/kzprd.qcow2" QEMU_DIR="/data/virt-data" read -r -p "请输入您要创建的机器名称: " VMNAME if [ "${VMNAME}" == "" ];then red "机器名称不能为空!" exit 1 else yellow "正在创建机器 ${VMNAME}..." qemu-img create -f qcow2 -b ${QEMU_FILE} ${QEMU_DIR}/${VMNAME}.qcow2 qemu-img info ${QEMU_DIR}/${VMNAME}.qcow2 fi read -r -p "确定创建虚拟机?y/n: " YES if [ "${YES}" == "y" ];then virt-install \ --name ${VMNAME} \ --memory 2048 \ --vcpus 1 \ --disk path=${QEMU_DIR}/${VMNAME}.qcow2,format=qcow2 \ --import \ --network network=default \ --graphics vnc,listen=0.0.0.0,port=5902 \ --os-variant centos7.0 \ --noautoconsole else yellow "即将退出!" exit 0 fi } main(){ yellow "================================" yellow " 虚拟机管理器 v1.0.0" yellow "================================" echo "" echo " 1. ISO创建初始化机器" echo " 2. 创建虚拟机" echo " 3. 管理虚拟机" echo "" yellow "================================" read -r -p "请选择对应的数字(1-3): " STATVM if [ "${STATVM}" == "1" ];then CREATE_ISO elif [ "${STATVM}" == "2" ];then CREATE_VM elif [ "${STATVM}" == "3" ];then DELTE_VM else red "无效选择即将退出!" exit 1 fi } main4、执行mvstat脚本● 先选择1,安装iso,通过vnc连接安装iso镜像● 安装完成重启virsh虚拟机后,使用vnc连接开启虚拟机的ttyS0# virsh console使用,进入虚拟机执行命令 systemctl enable serial-getty@ttyS0.service systemctl start serial-getty@ttyS0.service# 让IP自动获取开启如下 vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes systemctl restart network
2026年04月03日
0 阅读
0 评论
0 点赞
2026-03-12
httpd配置美化apaxy
下载压缩包wget https://packages.emal.cc/package/softinstall/produce/httpd/apaxy.tar.gz解压压缩包tar -zxvf apaxy.tar.gz配置将解压的apaxy下面的 apaxy/apaxy/* copy到httpd共享目录下cp -ar apaxy/apaxy/* /data/package/ [ 14:26:34 root@t-01 /data/src ]$ ll apaxy/apaxy 总用量 16 -rw-r--r-- 1 root root 15992 3月 12 10:18 htaccess.txt drwxr-xr-x 3 root root 315 3月 12 10:18 theme修改配置sed -i 's/{FOLDERNAME}/\/package/g' /data/httpd/htaccess.txt sed -i 's/{FOLDERNAME}/\/package/g' /data/httpd/theme/footer.html sed -i 's/{FOLDERNAME}/\/package/g' /data/httpd/theme/header.html mv htaccess.txt .htaccesshttpd配置/etc/httpd/conf/httpd.conf 确保这个配置里面有“AllowOverride ALL”、”Require all granted“vim /etc/httpd/conf/httpd.conf Alias /package "/data/httpd/" <Directory "/data/httpd"> Options Indexes MultiViews FollowSymLinks AllowOverride ALL Order allow,deny Allow from all Require all granted # AuthType Basic # AuthName "Restricted Access" # AuthUserFile /etc/httpd/.htpasswd # Require valid-user </Directory>重启httpdsystemctl restart httpd页面查看
2026年03月12日
1 阅读
0 评论
0 点赞
2026-02-11
rsync-inotify
{anote icon="fa-download" href="https://packages.emal.cc/package/softinstall/doc/sh/rsync-inotify.sh" type="info" content="点击下载脚本"/}数据同步#!/usr/bin/env bash # 颜色定义 readonly COLOR_RED='\033[1;31m' readonly COLOR_GREEN='\033[1;32m' readonly COLOR_YELLOW='\033[1;33m' readonly COLOR_BLUE='\033[1;34m' readonly COLOR_MAGENTA='\033[1;35m' readonly COLOR_CYAN='\033[1;36m' readonly COLOR_RESET='\033[0m' # 日志函数 log_error() { echo -e "${COLOR_RED}[ERROR] $1${COLOR_RESET}" >&2; } log_warn() { echo -e "${COLOR_YELLOW}[WARN] $1${COLOR_RESET}"; } log_info() { echo -e "${COLOR_BLUE}[INFO] $1${COLOR_RESET}"; } log_success() { echo -e "${COLOR_GREEN}[SUCCESS] $1${COLOR_RESET}"; } check_directory() { local dir="$1" local create_if_not_exist="$2" # "true" 或 "false" # 如果目录为空,返回失败 if [[ -z "$dir" ]]; then return 1 fi # 检查目录是否存在 if [[ ! -d "$dir" ]]; then if [[ "$create_if_not_exist" == "true" ]]; then # 尝试创建目录 if mkdir -p "$dir" 2>/dev/null; then log_info "创建目录: $dir" return 0 else log_error "无法创建目录: $dir" return 1 fi else log_error "目录不存在: $dir" return 1 fi fi # 检查目录是否可写 if [[ ! -w "$dir" ]]; then log_error "目录不可写: $dir" return 1 fi return 0 } zdh(){ while true;do read -r -p "目的地主机IP: " IPADDRS if [[ "$IPADDRS" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]; then break else log_error "请输入正确IP地址!" fi done while true;do read -r -p "目的地主机ssh端口: " SSHPORTS if [[ "$SSHPORTS" =~ ^[0-9]+$ ]] && (( SSHPORTS >= 1 && SSHPORTS <= 65535 )); then break else log_error "请输入正确端口!" fi done while true;do read -r -p "${IPADDRS} 机器是否已配置免密登录? y/n: " SSHKEYGEN if [ "${SSHKEYGEN}" == "y" ];then if ssh -o BatchMode=yes -o ConnectTimeout="3" -o StrictHostKeyChecking=no -p "${SSHPORTS}" "${IPADDRS}" "echo 'SSH免密登录测试成功'" 2>/dev/null; then log_success "SSH免密登录已配置" break else log_warn "SSH免密登录未配置" log_info "ssh免密配置脚本下载: wget https://packages.emal.cc/package/softinstall/doc/sh/update_keygen.sh" log_info '请在备份主机生成公钥和私钥,命令: ssh-keygen -t rsa -b 4096 -o -a 100 -C "comment"' fi elif [ "${SSHKEYGEN}" == "n" ];then log_warn "请先配置免密登录!" log_info "ssh免密配置脚本下载: wget https://packages.emal.cc/package/softinstall/doc/sh/update_keygen.sh" log_info '请在备份主机生成公钥和私钥,命令: ssh-keygen -t rsa -b 4096 -o -a 100 -C "comment"' exit 0 else log_error "请输入正确的值 y/n" fi done while true; do read -r -p "备份主机目录: " SRCDATA # 检查目录是否存在 if check_directory "$SRCDATA" "false"; then # 检查目录是否为空 if [[ -z "$(ls -A "$SRCDATA" 2>/dev/null)" ]]; then log_warn "目录为空: $SRCDATA" read -r -p "是否继续使用空目录? [y/n]: " confirm if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then continue fi fi break else log_error "请重新输入有效的目录路径" fi done while true; do read -r -p "目的地主机目录: " DESTDATA # 尝试在远程主机上创建目录 log_info "检查远程主机目录..." if [[ "${SSHKEYGEN,,}" =~ ^(y|yes)$ ]]; then if ssh -p "$SSHPORTS" "$IPADDRS" \ "mkdir -p '$DESTDATA' && test -w '$DESTDATA'" 2>/dev/null; then log_success "远程目录可用: $DESTDATA" break else log_error "无法访问或创建远程目录: $DESTDATA" fi else # 如果不支持免密登录,只做基本验证 if [[ -n "$DESTDATA" ]]; then log_warn "由于未配置SSH免密登录,无法验证远程目录,请确保目录存在且可写" break else log_error "目录不能为空" fi fi done while true; do read -r -p "备份主机日志存放目录: " LOGSDIR if [ ! -f ${LOGSDIR} ];then touch ${LOGSDIR} > /dev/null 2>&1 if [ $? -eq 0 ];then log_success "${LOGSDIR} 日志文件已创建!" break else log_error "请正确得输入文件名称,不要输入不存在得路径!" fi else log_info "${LOGSDIR} 日志文件已创建!" read -r -p "是否使用已存在文件做为日志文件? y/n: " YESS if [ "${YESS}" == "y" ];then log_info "日志文件路径: ${LOGSDIR}" break elif [ "${YESS}" == "n" ];then continue else continue fi fi done } sd(){ # demo=1时,跳过下载软件包 demo=1 if [ "${demo}" == "1" ];then echo "相关软件包下载完成" else yum -y install rsync inotify-tools > /dev/null 2>&1 if [ $? -eq 0 ];then echo "相关软件包下载完成" else echo "相关软件包下载失败" exit 1 fi fi count=0 while [ $count -lt 1 ]; do HOSTIP=$(hostname -I |awk '{print $1}') sleep 2 echo "#####################################################" >> ${LOGSDIR} echo $(date '+%c') >> ${LOGSDIR} inotifywait -r -e modify,create,delete,move ${SRCDATA} >> ${LOGSDIR} & rsync -avz -e "ssh -p ${SSHPORTS}" ${SRCDATA} --exclude='/data/docker' --exclude='docker/' --exclude='**/containers/**' --exclude='*.log' --exclude='*-json.log' root@${IPADDRS}:${DESTDATA}/ >> ${LOGSDIR} & echo " " >> ${LOGSDIR} # 查看日志大小 dus=$(ls -lh ${LOGSDIR} |awk '{print $5}'|grep G|awk -F'M' '{print $1}') b=2 # 判断日志如果大于2个G,那么就删除日志 dateus=$(awk -v num1=${dus} -v num2=${b} 'BEGIN{print(num1>num2)?"0":"1"}') echo ${dateus} if [ ${dateus} -eq 0 ];then echo "" > ${LOGSDIR} else exit 0 fi count=$((count + 1)) done > /dev/null 2>&1 } main(){ zdh sd } main
2026年02月11日
0 阅读
0 评论
0 点赞
2026-02-04
crictl导入导出镜像
::(捂嘴笑) ::(滑稽)查看 containerd 镜像# 查看 k8s.io 命名空间的镜像 ctr -n=k8s.io images ls # 查看所有命名空间的镜像 ctr namespaces ls ctr -n=k8s.io images ls | grep tekton导出镜像# 导出单个镜像 ctr -n=k8s.io images export tekton.tar harbor.rdse.cloud.cnpc/cnpcrd/tekton:entrypoint-v0.43.2 # 导出并压缩 ctr -n=k8s.io images export - | gzip > tekton.tar.gz harbor.rdse.cloud.cnpc/cnpcrd/tekton:entrypoint-v0.43.2导入镜像# 导入镜像 ctr -n=k8s.io images import tekton.tar # 导入压缩的镜像 gunzip -c tekton.tar.gz | ctr -n=k8s.io images import -
2026年02月04日
0 阅读
0 评论
0 点赞
2026-01-23
批量ping脚本
批量ping脚本将ip地址存放到ip.txt文件中,然后执行ping.sh脚本#!/usr/bin/env bash some_function(){ ip=$(hostname -I | awk '{print $1}') echo "Local IP: $ip" > ./${ip}-ping.txt alls=$(cat ip.txt | wc -l) us=0 echo "Ping Test Progress ($alls targets):" echo "-----------------------------------" while IFS= read -r i do # 执行ping测试 if ping -c 1 -W 2 $i > /dev/null 2>&1; then result="✓" echo "ping $i success" >> ./${ip}-ping.txt else result="✗" echo "ping $i timeout" >> ./${ip}-ping.txt fi us=$((us + 1)) percent=$(( us * 100 / alls )) # 显示IP和结果 printf "\r[%3d%%] %-15s %s" "$percent" "$i" "$result" # 如果终端不支持Unicode,使用以下替代: # printf "\r[%3d%%] %-15s %s" "$percent" "$i" "$([ "$result" = "✓" ] && echo "OK" || echo "FAIL")" done < ./ip.txt echo # 换行 echo "-----------------------------------" # 显示统计结果 success_count=$(grep -c "success" ./${ip}-ping.txt 2>/dev/null || echo "0") timeout_count=$(grep -c "timeout" ./${ip}-ping.txt 2>/dev/null || echo "0") echo "Summary:" echo " Success: $success_count" echo " Timeout: $timeout_count" echo " Full results in: ./${ip}-ping.txt" } some_function执行输出
2026年01月23日
0 阅读
0 评论
0 点赞
2026-01-23
快速测速
网速测试#!/bin/bash # quick-speedtest.sh - 快速测速 echo "快速网络测速..." echo "正在安装speedtest-cli(如果未安装)..." # 一键安装和运行 if ! command -v speedtest-cli &> /dev/null; then sudo yum install -y epel-release sudo yum install -y python3-pip sudo pip3 install speedtest-cli fi echo "" echo "测试中,请稍候..." echo "" # 运行测速 speedtest-cli --simple echo "" echo "详细结果:" speedtest-cli --share
2026年01月23日
0 阅读
0 评论
0 点赞
1
2