2014-10-30 192 views
0

我需要運行通過ssh一個多bash命令,用盡所有可能的嘗試,但沒有運氣 -運行多bash命令不起作用

echo "3. All files found, creating remote directory on the server." 
ssh -t [email protected]$host bash -c "' 
       if [[ -d ~/_tmp ]]; then 
        rm -rf ~/_tmp/* 
       else 
        mkdir ~/_tmp 
       fi 
'" ; 

echo "4. Sending files ..." 
scp ${files[@]} [email protected]$host:~/_tmp/ ; 

這裏是輸出 -

[email protected]:/tmp$ ./remotecompile 
1. Please enter your id: 
user 
2. Please enter the names of the files that you want to compile 
    (Filenames *must* be space separated): 
test.txt 
3. All files found, creating remote directory on the server. 
Password: 
Unmatched '. 
Unmatched '. 
Connection to host.domain.com closed. 

請注意,我不想把每行2-3行的bash if-then-else-fi命令放到單獨的文件中。

什麼是正確的做法?

+1

順便說一句,你需要引用更多的SCP命令:'SCP 「$ {文件[@]}」 「$ ID @ $主持人:〜/ _TMP /」 ' - 不加引號,'$ {files [@]}'表現正好與'$ {files [*]}'相同,所有錯誤都與相同。 – 2014-10-30 23:46:49

回答

3

使用轉義的heredoc使其文字內容通過。 (如果沒有轉義,即僅使用<<EOF,shell擴展將在本地處理 - 如果您在遠程運行的代碼中使用了變量,則會生成更有趣的轉角情況)。

ssh "[email protected]$host" bash <<'EOF' 
if [[ -d ~/_tmp ]]; then 
    rm -rf ~/_tmp/* 
else 
    mkdir ~/_tmp 
fi 
EOF 

如果你想傳遞參數,在明確正確的方式這樣做會更有意思(因爲有殼解析參與的兩個單獨的層),但printf '%q'內置節省了一天:

args=("this is" "an array" "of things to pass" \ 
     "this next one is a literal asterisk" '*') 
printf -v args_str '%q ' "${args[@]}" 
ssh "[email protected]$host" bash -s "$args_str" <<'EOF' 
    echo "Demonstrating local argument processing:" 
    printf '%q\n' "[email protected]" 
    echo "The asterisk is $5" 
EOF 
1

這個工作對我來說:

ssh [hostname] '  
if [[ -d ~/_tmp ]]; then 
    rm -rf ~/_tmp 
else 
    mkdir ~/_tmp 
fi 
' 
+0

我同意這在這裏的情況下工作正常。另一方面,當遠程運行的代碼包含自己的單引號時,它會變得笨重。 – 2014-10-30 23:48:11

+0

還有另外一個問題,對於每次需要輸入密碼的每個ssh/scp,有什麼辦法可以避免嗎? – ramgorur 2014-10-30 23:53:34

+0

@ramgorur,在這種情況下,ControlMaster是你的朋友,如果你不想做正確的事情並使用RSA認證。 – 2014-10-30 23:54:34