我有以下 Vagrant 文件:
Vagrant.configure("2") do |config|
config.vm.box = "laravel/homestead"
config.vm.provision "shell", inline: <<-SHELL
printf "\n\nClientAliveInterval 3\nClientAliveCountMax 2" >> /etc/ssh/sshd_config
service ssh restart
SHELL
end
它运行得很好,但是当我查看/etc/ssh/sshd_config
我所做的更改的内容时却不见了。但是当我printf "\n\nClientAliveInterval 3\nClientAliveCountMax 2" >> /etc/ssh/sshd_config
通过 CLI(好吧,通过sudo bash
)进行操作时,它运行得很好。
我正在运行 Vagrant 2.2.7 和 Hyper-V,以及 Windows 10 版本 1909。
知道为什么 Vagrant 文件没有写入该文件吗?
答案1
尝试按照以下方式操作:
sh -c "printf '\n\nClientAliveInterval 3\nClientAliveCountMax 2' >> /etc/ssh/sshd_config";
如果这不起作用,请像这样以 sudo 形式运行它:
sudo sh -c "printf '\n\nClientAliveInterval 3\nClientAliveCountMax 2' >> /etc/ssh/sshd_config";
我的理解是,它将sh -c
把双引号中的字符串作为命令运行。至于为什么没有它就不能运行sh -c
……不知道。但也许你可以使用你的配置,然后像 sudo 一样运行相同的命令,如下所示:
sudo printf "\n\nClientAliveInterval 3\nClientAliveCountMax 2" >> /etc/ssh/sshd_config
sudo service ssh restart
如果所有这些方法仍然不起作用,那么更大的问题可能是你试图使用“定界符”格式。我建议这样做:
$script = <<-SHELL
printf "\n\nClientAliveInterval 3\nClientAliveCountMax 2" >> /etc/ssh/sshd_config
service ssh restart
SHELL
Vagrant.configure("2") do |config|
config.vm.box = "laravel/homestead"
config.vm.provision "shell", inline: $script
end
或者你也可以这样做:
Vagrant.configure("2") do |config|
config.vm.box = "laravel/homestead"
config.vm.provision "shell",
inline: "printf '\n\nClientAliveInterval 3\nClientAliveCountMax 2' >> /etc/ssh/sshd_config' && service ssh restart"
end
阅读内联脚本的 shell 配置过程请点击此处在官方 Vagrant 文档中。