Ssh

是否可以通過 ssh 從本地執行的腳本內部將 HEREDOC 發送到遠端主機?

  • July 11, 2021

我基本上想在機器 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 -lENDSSH作為文本。有道理……因為 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

引用自:https://unix.stackexchange.com/questions/187960