Bash脚本自动化实战:如何实现免人机交互命令执行

1次阅读
没有评论

共计 1795 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

运维工程师的痛点:那些烦人的交互提示

每次部署服务时,总会遇到各种需要人工干预的提示:

Bash 脚本自动化实战:如何实现免人机交互命令执行

  • SSH 登录突然弹出Are you sure you want to continue connecting (yes/no)?
  • MySQL 客户端要求反复输入密码
  • apt-get install冷不丁来个Do you want to continue? [Y/n]

这些交互提示就像高速路上的减速带,让自动化脚本变得支离破碎。更糟的是,当你在凌晨 3 点处理故障时,脚本卡在某个提示符前等待输入的场景简直让人崩溃。

三大破局方案实战

方案一:Expect 工具 – 终端对话专家

Expect 就像个会读心术的助手,能预测程序输出并自动响应。安装只需:

sudo apt-get install expect  # Debian 系
sudo yum install expect      # RHEL 系

经典 SSH 自动登录示例(带异常处理):

#!/usr/bin/expect
set timeout 30
set host "192.168.1.100"
set user "admin"
set password "your_secure_pwd"

spawn ssh $user@$host
expect {
    "yes/no" { 
        send "yes\r"
        exp_continue 
    }
    "password:" {send "$password\r"}
    timeout {
        puts "Connection timed out"
        exit 1
    }
}
interact  # 交回控制权

关键点说明:

  1. set timeout 30 防止无限等待
  2. exp_continue 继续匹配后续模式
  3. interact 让用户接管会话

方案二:Here Document – 输入重定向利器

当需要向命令传递多行输入时,EOF 大法最简单:

mysql -u root -p <<'EOF'
SHOW DATABASES;
CREATE USER 'dev'@'%' IDENTIFIED BY 'Passw0rd!';
GRANT ALL ON *.* TO 'dev'@'%';
EOF

注意单引号包裹的 'EOF' 可以防止变量展开,双引号包裹的 "EOF" 则允许变量替换。

方案三:环境变量 – 静默模式开关

许多命令都有隐藏的静默参数:

# 禁止 apt-get 的交互提示
export DEBIAN_FRONTEND=noninteractive
apt-get -y install nginx

# 让 ssh 忽略首次连接提示
export SSH_AUTH_SOCK=""  # 禁用 ssh-agent
echo "StrictHostKeyChecking no" >> ~/.ssh/config  # 慎用!

生产环境生存指南

密码安全三原则

  1. 永远不用sshpass(密码会出现在进程列表)
  2. 使用 expect 时通过环境变量传入密码:
    export SSHPASS="your_pwd"
    expect -c 'spawn ssh $env(SSH_USER)@host; expect"password:"; send"$env(SSHPASS)\r"'
  3. 考虑使用临时密钥对:
    ssh-keygen -t ed25519 -f /tmp/temp_key -N ""
    ssh-copy-id -i /tmp/temp_key user@host
    # 使用后立即删除

超时控制的艺术

timeout 30s your_command || {
    echo "Command timed out after 30 seconds"
    # 触发告警或重试逻辑
}

日志记录黄金组合

{echo "====== $(date) ======"
    /path/to/your_script.exp 2>&1
} | tee -a /var/log/auto_deploy.log

终极思考题

当安全审计要求 ” 不能存储任何形式的密码 ” 时,如何实现:
– 凌晨 3 点自动修复数据库
– 跨机房文件同步
– 批量服务器配置更新

提示:研究 Kerberos 票据系统和SSH 证书体系,比如:
kinit+klist组合拳
– 用 ssh-keygen -s 颁发短期证书

写在最后

最近用这些方法改造了公司的 CI/CD 流程,原本需要人工值守的部署过程现在完全自动化。最惊喜的是处理 MySQL 主从切换时,expect 脚本在故障转移时自动完成了 27 台服务器的配置更新,比手动操作快了足足 40 分钟。不过切记:自动化不是万能的,关键操作还是要有邮件确认的二次验证机制。

下次遇到交互提示时,不妨试试这些方法,让你的脚本真正 ” 自动 ” 起来。如果有更有趣的解决方案,欢迎在评论区分享!

正文完
 0
评论(没有评论)