是否可以通過 ssh 從本地執行的腳本內部將 HEREDOC 發送到遠端主機?
我基本上想在機器 A 上執行一個腳本,該腳本將通過 SSH 連接到機器 B,在 B 上執行命令,並將輸出返回到機器 A。
因此,如果可能的話,我希望創建一個 csh 腳本來執行此操作。
例如,此答案中的此解決方案可從命令行執行:
ssh user@host << 'ENDSSH' ls -l ENDSSH
我可以驗證它是在遠端而不是本地執行 ls 。
但是,我希望能夠在本地執行的 csh 腳本中的反引號中執行此操作。那可能嗎?
我知道可以通過 SSH 登錄並執行遠端腳本,但我的情況並非如此。
我還聽說可以通過 SSH 發送本地儲存的第二個腳本(我也沒有想到),但我喜歡將所有命令都包含在原始腳本中的想法,因此是 HEREDOC。
我知道這是一個非常特殊的問題,但如果有辦法,知道如何做會很酷。
不起作用的東西
1)
`ssh user@host<<'ENDSSH'` `echo "ls -l"` `echo "ENDSSH"`
這給出了錯誤:
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
然後它在
ls -l
本地執行,然後它嘗試在ENDSSH
本地執行,當然由於找不到命令而失敗。2)
`ssh user@host<<'ENDSSH'` echo "ls -l" echo "ENDSSH"
與上面相同的問題,除了它只顯示
ls -l
和ENDSSH
作為文本。有道理……因為 HEREDOC 部分失敗了。3) 3-5 並不是我所問的,但仍然試圖讓基本案例工作。
`ssh user@host ls-l`
這返回
total: Command not found.
是的,我不知道它來自哪裡。4)
`cat ./test.csh | ssh user@host`
也返回與嘗試 #1 相同的結果
5)
`cat ./test.csh | ssh -t user@host`
與#1 和 4 相同。
我開始從 stackoverflow/Ubuntu/serverfault 等中耗盡其他解決方案。大多數人詢問如何從命令行遠端執行他們的腳本,而不是如何從本地執行的腳本遠端執行命令。
編輯
好吧,我想我已經解決了部分問題。以上面的案例 3 為例,發生的事情是
ls -l
在本地執行,然後輸出的第一部分作為命令通過 SSH 發送。我注意到這一點是因為我嘗試
ssh user@host $CMD
了,$CMD
設置為"whoami"
. 輸出是username: Command not found
,然後我意識到total
是來自 ls 輸出。不過,仍然不確定如何解決這個問題
如果您將要執行的整個命令包裝在反引號中,您很可能會得到正確的解決方案。關於變數和其他插值元素的評估存在一些問題,但我暫時將它們放在一邊。
但是,我不完全確定您為什麼想要反引號中的任何內容。您的問題說您想遠端執行本地腳本。你的第一個例子就是這樣做的。
ssh -q user@host << ENDSSH hostname ls -l id ENDSSH
也許您想將遠端執行的輸出放入一個變數中?它沒有在問題的任何地方說,但你會這樣做(
bash
)result=$(ssh user@host <<'ENDSSH' hostname id ENDSSH ) ... echo "$result"
或者,既然你提到
csh
了,就像這樣set result = `ssh -q user@host` <<ENDSSH hostname id ENDSSH ... echo "$result"
請注意,對於該
csh
變體,所有輸出行都連接在一起。我看到您報告了一個錯誤,
stty: standard input: Invalid argument.
這可能是因為您stty
在遠端伺服器上的登錄腳本中有一個命令。這應該包含在互動式 shell 的測試中。在bash
你會做這樣的事情:if test -n "$PS1" then # Interactive setup here stty ... fi