2015-12-13 70 views
0

我試圖運行一個bash腳本,ssh到遠程主機上並停止正在運行的單個docker容器。遠程主機上的Bash命令替換

#!/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到機器上,運行命令)一切都很好,但試圖藉助這樣做時,一個腳本我得到錯誤。我想我的命令替換語法是不正確的,我搜索並嘗試各種引號等,但無濟於事。

任何人都可以指出我要出錯的地方嗎?

+0

Heredocs執行其內容的參數擴展,因此您的'$(docker ps ...)'和'$ container'評估發生在代碼獲取到ssh的stdin之前。 –

回答

5

使用<<'EOF'(或<<\EOF - 引用只有第一個字符將具有相同的效果)啓動您的heredoc時,以防止其擴展在本地進行評估。


順便說一句,就個人而言,我會寫這個有點不同:

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

第一read消耗docker ps輸出的第一線;第二個只提取第一列 - 只使用bash內建。

+0

工作就像一個魅力查爾斯。非常感謝! – user1061799

+0

@ user1061799,很高興提供幫助。順便說一句,我已經爲腳本提出了替代形式進行了修改。但是,如果您仍然想使用'awk',則可以使用'awk'NR == 2 {print $ 1}''將兩個調用合併爲一行。 –

+0

這是更好的選擇。再次感謝Charles – user1061799