如何在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
相关产品推荐
相关产品推荐

