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

如何在Vagrant虚拟机间传输文件?已遇scp公钥权限问题

解决Vagrant虚拟机批量公钥部署与文件传输问题

批量部署SSH公钥到Vagrant虚拟机

方法1:用shell脚本结合Vagrant命令自动化

不用手动记虚拟机IP和端口,写个脚本批量处理运行中的虚拟机:

# 遍历所有运行中的Vagrant虚拟机
for vm in $(vagrant status | grep running | awk '{print $1}'); do
  # 自动获取虚拟机的SSH地址、端口,执行ssh-copy-id
  ssh-copy-id -i ~/.ssh/id_rsa.pub \
    $(vagrant ssh-config $vm | awk '/HostName/ {print $2}') \
    -p $(vagrant ssh-config $vm | awk '/Port/ {print $2}') \
    -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
done
  • vagrant status过滤出正在运行的虚拟机名称
  • vagrant ssh-config自动提取IP、端口,不用手动输入
  • 最后的-o参数跳过首次连接的主机密钥确认提示

方法2:修改Vagrantfile,启动时自动注入公钥

如果是新建虚拟机,直接在配置文件里加逻辑,启动时自动把本地公钥写入虚拟机的授权列表:

Vagrant.configure("2") do |config|
  # 示例:配置两台虚拟机
  ["vm1", "vm2"].each do |vm_name|
    config.vm.define vm_name do |vm|
      # 设置静态IP(替换成你的配置)
      vm.vm.network "private_network", ip: "192.168.56.10#{vm_name[-1]}"
      # 复制本地公钥到虚拟机临时目录
      vm.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "/tmp/id_rsa.pub"
      # 执行shell命令写入授权文件并修正权限
      vm.vm.provision "shell", inline: <<-SHELL
        mkdir -p ~/.ssh
        cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
        chmod 600 ~/.ssh/authorized_keys
        chmod 700 ~/.ssh
        rm /tmp/id_rsa.pub
      SHELL
    end
  end
end

执行vagrant up或vagrant provision,公钥会自动部署完成。

公钥部署后的文件传输方案

用rsync替代scp(高效支持批量)

公钥配置好后,rsync比scp更适合批量传输,尤其是目录同步:

# 单台虚拟机传输文件
rsync -avz /本地文件路径 vagrant@192.168.56.101:/虚拟机目标路径

# 批量传输到所有运行中的虚拟机
for vm_ip in 192.168.56.101 192.168.56.102; do
  rsync -avz /本地文件路径 vagrant@$vm_ip:/虚拟机目标路径
done

如果不想记IP,依旧可以借助Vagrant的参数自动获取:

for vm in $(vagrant status | grep running | awk '{print $1}'); do
  rsync -avz /本地文件路径 \
    $(vagrant ssh-config $vm | awk '/User/ {print $2}')@$(vagrant ssh-config $vm | awk '/HostName/ {print $2}'):/虚拟机目标路径 \
    -e "ssh -p $(vagrant ssh-config $vm | awk '/Port/ {print $2}')"
done

用Vagrant的file provision直接同步

如果是虚拟机初始化阶段需要传输文件,直接在Vagrantfile里添加provision:

config.vm.provision "file", source: "/本地文件/目录路径", destination: "/虚拟机目标路径"

执行vagrant provision就能自动完成文件同步,适合初始化场景。


内容的提问来源于stack exchange,提问作者Caveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:12:46