2015-03-13 106 views
1

我需要一個以root身份連接到服務器的bash腳本的幫助,執行一些命令然後退出服務器。腳本中的SSH - 遠程服務器上沒有運行的命令

我試過這個腳本,但是當登錄登錄到服務器時執行的命令沒有運行!

#!/bin/bash 

sudo ssh -o ConnectTimeout=10 $1 'exit' 

if [ $? != 0 ]; then 
     echo "Could not connect to $1 , script stopped" 
     exit 
fi 

sudo ssh $1 

echo "SRV=`cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}'`" 
echo $SRV 
echo "puppetMaster=`host -t srv _x-puppet._tcp.$SRV | head -1 | awk '{print $8}' | cut -f1 -d"."`" 
echo $puppetMaster 
'exit' 
+0

順便說一句,ControlMaster設置可以做得更好 - 這樣,以後您可以使用一個持久的SSH連接同時用於測試和實際命令,而不是假設如果測試SSH連接起作用,那麼真正的一個會(並支付認證/連接/啓動成本兩次)。 – 2015-03-13 15:23:14

回答

1

我很驚訝沒有人建議heredoc呢。

sudo ssh "$1" <<'EOF' 
SRV=`cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}'` 
echo $SRV 
echo "puppetMaster=`host -t srv _x-puppet._tcp.$SRV | head -1 | awk '{print $8}' | cut -f1 -d"."`" 
echo $puppetMaster 
EOF 

直到開頭的行EOFssh的標準輸入,由遠程外殼被接收並運行該饋送一切從<<'EOF'

+0

謝謝!加工。 – 2015-03-13 15:27:58

+0

EOF後,當我試圖ssh到$ puppetMaster,但它不工作,因爲$ puppetMaster的值是空的!爲什麼?我該如何解決它? – 2015-03-13 16:39:08

+0

'puppetMaster'設置在** remote ** shell(在'ssh'連接的另一側運行,在'EOF'處退出)運行。本地shell對此一無所知。將變量從遠程shell收集到本地shell中以安全可靠的方式執行起來有些複雜;我建議問這是一個單獨的問題。 – 2015-03-13 16:42:15

1

腳本中ssh machine以下的命令不在機器上運行。一旦ssh退出,它們將在本地機器上運行。

要麼指定要作爲參數ssh運行的命令,要麼運行ssh並使其從標準輸入讀取命令,並將命令發送給它。

ssh machine ls 
# or 
echo ls | ssh machine 
0

你似乎有點困惑,什麼運行在哪裏。

ssh -o ConnectTimeout=10 $1 'exit' 

將連接到$ 1,運行退出並斷開連接。

ssh -o ConnectTimeout=10 $1 'echo hello world' 

將在服務器上打印hello world 然後斷開連接。

SSH $ 1

將打開一個shell遙控器上。在shell結束之後,以下命令將在本地運行。

echo "SRV=`cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}'`" 
echo $SRV 
echo "puppetMaster=`host -t srv _x-puppet._tcp.$SRV | head -1 | awk '{print $8}' | cut -f1 -d"."`" 
echo $puppetMaster 
'exit' 

你可能想要的是在遠程啓動bash,並轉發給你想要通過stdin給它的命令。

echo "my commands" | ssh $1 bash 

技術上講,你不需要這個慶典 - ssh將啓動慶典即使沒有它(但具有不同的RC文件)。

相關問題