使用ssh
子命令在vagrant
运行具有简单测试(如-e
)的命令或脚本行工作正常(例如
vagrant ssh -c 'if ! [ -e file.deb ] ; then wget http://a.b/file.deb; fi'
一旦涉及字符串比较和命令执行bash
引用,复杂性就会立即上升到天空。我试过了
- 字符串,但这似乎一般不起作用(转义的复杂性......在
bash
是不可接受的) 使用
cat <<EOF > file [code]EOF
习语将所有内容写入脚本文件中,例如vagrant ssh -c 'cat <<EOF > fetch.sh #!/bin/bash if [ "$(md5sum file.deb | cut -d " " -f 1)" != "d757d51819f8f945ae7715b532ab8d2e" ] ; then wget http://a/b/file.deb; fi EOF' vagrant ssh -c 'bash ./fetch.sh'
原因
./fetch.sh: line 1: syntax error near unexpected token `if'
cat EOF
成语的失败意味着用vagrant
创建的任何类型的脚本的失败(python
、groovy
等将遭受同样的bash
无法提供可用的字符串引用/根本可用)
有没有办法在vagrant
框中的测试中使用复杂语句执行脚本代码?我真的需要通过本地主机接口(使用 FTP 或类似的东西)传输脚本吗?
了解如何使用 SSH 在远程计算机上运行 shell 脚本? 可以使用以下方法连接到流浪者
ssh -p [port] -i [keyfile] vagrant@localhost 'bash -s' < script.sh
(从vagrant ssh-config
中检索[port]
和[keyfile]
)并将脚本代码放入script.sh
。
如果正在运行多个vagrant
实例(每个实例启动自己的 SSH 服务器),则端口可能会更改,因此您可能需要解析vagrant ssh-config
。