You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现多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的步骤逻辑与命令

修改脚本步骤顺序,确保全程无交互:

  1. 复制待传输文件、crontab配置到对应目录
  2. 无交互生成SSH密钥:
    ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
    
    -N ""指定空密钥密码,-f固定密钥路径,避免交互提示
  3. 用上述sshpass+ssh-copy-id方式传输公钥到VM B
  4. 预存VM B主机密钥(可选,生产环境用)
  5. 执行无交互SCP测试:
    scp -o StrictHostKeyChecking=no /test/file/path vm-b-user@vm-b-ip:/tmp/
    
  6. 配置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,提问作者黃奕翔

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:55:28