一尘不染

远程主机上的Bash命令替换

linux

我正在尝试运行一个SSH到远程主机上的bash脚本,并停止正在运行的单个docker容器。

#!/usr/bin/env bash

set -e

ssh <machine> <<EOF

container=$(docker ps | awk 'NR==2' | awk '{print $1;}')

docker stop $container

EOF

但是,出现以下错误:

stop.sh: line 4: docker: command not found

当我手动执行此操作(向计算机SSH,运行命令)时,一切都很好,但是当尝试通过脚本执行操作时,我得到了错误。我猜我的命令替换语法不正确,我已经搜索并尝试了各种引号等,但无济于事。

谁能指出我要去哪里了?


阅读 163

收藏
2020-06-03

共1个答案

一尘不染

在启动您的Heredoc时,请使用<<'EOF'(或<<\EOF-仅引用第一个字符将具有相同的效果),以​​防止对其扩展进行本地评估。


顺便说一句,就我个人而言,我会这样写:

#!/bin/sh -e
ssh "$1" bash <<'EOF'
{ read; read container _; } < <(docker ps)
docker stop "$container"
EOF

第一个read消耗docker ps输出的第一行;第二个消耗输出。第二个仅提取第一列-仅使用bash内置函数。

2020-06-03