实现多VM通过install.sh自动免密SCP定时传输文件的方案
解决方案
1. 自动解决主机密钥验证失败问题
首次连接VM B时触发的Host key verification failed,是因为源VM未记录VM B的主机密钥,可通过两种方式自动化处理:
- 快速跳过验证(适合测试环境):在所有SSH/SCP命令中添加参数,强制跳过密钥检查:
# 示例:无交互执行SCP scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /local/file/path user@vm-b-ip:/remote/path - 安全预存主机密钥(生产环境推荐):提前获取VM B的主机公钥,写入源VM的
known_hosts文件,避免中间人攻击风险:# 替换为VM B的IP或主机名 ssh-keyscan -H vm-b-ip >> ~/.ssh/known_hosts
2. 自动化传输SSH公钥(消除密码输入)
原步骤6传输公钥时需要手动输入VM B密码,可借助sshpass工具实现无交互操作:
# 先在源VM安装sshpass(根据系统选择命令) apt-get install -y sshpass # Debian/Ubuntu系 # 或 yum install -y sshpass # RHEL/CentOS系 # 无交互将公钥追加到VM B的authorized_keys # 替换为VM B的密码、用户名和IP sshpass -p "vm-b-user-password" ssh-copy-id -o StrictHostKeyChecking=no vm-b-user@vm-b-ip
3. 调整install.sh的步骤逻辑与命令
修改脚本步骤顺序,确保全程无交互:
- 复制待传输文件、crontab配置到对应目录
- 无交互生成SSH密钥:
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa-N ""指定空密钥密码,-f固定密钥路径,避免交互提示 - 用上述
sshpass+ssh-copy-id方式传输公钥到VM B - 预存VM B主机密钥(可选,生产环境用)
- 执行无交互SCP测试:
scp -o StrictHostKeyChecking=no /test/file/path vm-b-user@vm-b-ip:/tmp/ - 配置crontab并重启服务:
crontab /path/to/your/crontab.conf # 根据系统选择重启命令 systemctl restart cron # Debian/Ubuntu # 或 systemctl restart crond # RHEL/CentOS
4. 关键权限检查(避免免密失效)
脚本中需添加权限修复命令,确保密钥目录和文件权限符合SSH要求:
# 源VM端权限设置 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa # VM B端权限设置(远程执行) sshpass -p "vm-b-user-password" ssh vm-b-user@vm-b-ip "chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys"
另外需确认VM B的sshd_config中已开启PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys,修改后重启sshd服务。
内容的提问来源于stack exchange,提问作者黃奕翔
相关产品推荐
相关产品推荐

