我有一个shell脚本,如下所示:
echo "======> setting up firewall rules for $1 ..."
docker-machine ssh $1 \
echo "y" | sudo ufw --force enable \
&& sudo ufw default deny incoming \
&& sudo ufw allow 22/tcp \
&& sudo ufw allow 2376/tcp \
&& sudo ufw allow 2377/tcp \
&& sudo ufw allow 7946/tcp \
&& sudo ufw allow 7946/udp \
&& sudo ufw allow 4789/udp \
&& sudo ufw reload \
&& sudo systemctl restart docker
运行每个ufw命令后的日志信息说"跳过添加现有规则"尽管这是一个全新的例子。我能够手动ssh到Docker机器实例并运行相同的命令,没有任何问题。如何编写bash脚本以使用docker-machine自动设置ufw规则?
答案 0 :(得分:1)
docker-machine ssh
命令的行为与标准ssh
命令类似,即它接受远程运行的命令。
但是,在您的示例中, shell运算符(如|
和&&
优先),即它们终止docker-machine ssh
收到的命令/参数列表
解决此问题的一种方法是引用您希望docker-machine ssh
接收的命令列表,例如:
$ docker-machine ssh $1 \
'echo "y" | sudo ufw --force enable \
&& sudo ufw default deny incoming \
&& sudo ufw allow 22/tcp ... '
另一种选择是转义所有shell运算符(\|
和\&\&
,甚至是\(
,\{
,\;
等。