2013-04-20 65 views
1

好吧,所以我最近發現了這裏的文檔提供標準輸入樣式行到交互式命令的神奇。然而,我試圖用SSH來在遠程服務器上執行一堆命令,但是我還需要在執行額外的命令之前輸入一些實際的輸入,以進一步混淆事項,我還需要獲得一些結果回;)結合管道和這裏的文件在SSH的外殼

這裏就是我想要的使用方法:

#!/bin/sh 
RESULT=$(find -type f "$PATH" | gzip | ssh "$HOST" <<- 'REMOTE_SYNC' 
    cat > "/tmp/.temp_file" 

    # Do something with /tmp/.temp_file 
REMOTE_SYNC 

這實際上是正確的?我遇到的部分問題是我需要在/ tmp中將數據傳輸到該文件,但我應該真正生成一個隨機命名的臨時文件,但我不知道該如何做到這一點,該名稱給一個變量(所以我可以回到它),並仍然發送標準輸入。

我也可能提取find | gzip部分到一個單獨的命令首先在本地運行,因爲gzip文件可能足夠小,以至於在準備好時發送它會導致短得多的SSH連接,然後在它生成時發送它,但它仍然沒有解決這樣一個事實:我需要能夠提供標準輸入和我的額外命令SSH。

+1

它看起來像你試圖重塑'rsync';您可能想使用它。 – msw 2013-04-20 20:30:25

回答

4

不,你不能這樣做。 heredoc和管道輸入都是爲stdin而競爭的,只有一個獲勝。看看這個例子:

echo test | cat << EOF 
TEST 
EOF 

這次打印是什麼? testTEST或兩者兼而有之?它打印TEST,所以heredoc獲勝(至少在bash中)。

反正你不需要這個。幸運的是,ssh需要一個command參數,該參數將被傳遞到遠程主機上的shell,因此您可以在此使用您的命令作爲字符串。因此,像這樣:

echo TEST | ssh [email protected] 'cat > tempfile; cat tempfile; rm tempfile' 

將工作(althoug它並沒有太大的意義),左側命令的輸出通過管道輸送ssh到遠程主機,並作爲標準輸入提供有。

如果您希望在通過ssh發送數據時對數據進行壓縮,則可以使用-C選項啓用壓縮。


編輯:

使用字符串中的換行符是完全正常的,所以這個工作太細:

echo TEST | ssh [email protected] ' 
    cat > tempfile 
    cat tempfile 
    rm tempfile 
' 

到定界符唯一的區別是,你有逃跑的報價。

如果你使用類似echo TEST | ssh [email protected] "$(<script.sh)"你可以寫的一切到一個文件...

+0

嗯,我希望仍然使用這裏的文檔,而不是試圖凝聚我的命令到字符串參數;我可能不得不嘗試通過stdin將數據和命令作爲單個流發送,因此我只需添加用於拆分它們並運行shell腳本的命令。雖然謝謝! – Haravikk 2013-04-21 19:06:21

+0

增加了一些例子。我不認爲在相同的輸入流上發送命令和輸入不是一個好主意...... – mata 2013-04-21 19:21:44