Shell

在 ssh 到遠端主機之後,在 EOF 中使用的 grep 會給出輸出“沒有這樣的文件或目錄”

  • August 2, 2021

設想:

我有一個腳本可以連接到遠端主機並從日誌文件中 grep 特定關鍵字。如果不使用 EOF,ssh 就會被凍結,但是當使用 heredoc (EOF) 時,這個問題就消失了。我所有的命令都必須在 ssh 到遠端主機之後執行,因此它們在 EOF 塊內。

grep 命令給我的輸出是:‘沒有這樣的文件或目錄’,而我在終端上執行了相同的命令,它給出了所需的輸出。

下面是有問題的 grep 的一段程式碼:

ssh -q -T username@remotehost <<-EOF 2>&1 | tee -a
getValue=$(grep -R 'keyword' /user/log/file.log | awk -F ' ' '{print$NF}') )
echo "${getValue}"
EOF

Output: grep: /user/log/file.log : No such file or directory

SSH 工作正常,因為我列印了遠端主機並進一步交叉檢查了日誌路徑和 file.log。從設置的角度來看,一切就緒。通過網際網路進行了一些研發,但到目前為止沒有任何幫助。

您需要引用您的引號'EOF'以防止您的外殼在$本地解釋,即。嘗試在遠端命令之前在 shell 中執行 grep。

相比:

ssh username@remotehost << 'EOF'
echo "THIS IS $(hostname)"
EOF

ssh username@remotehost << EOF
echo "THIS IS $(hostname)"
EOF

您的問題來自於讓 shell 在本地而不是在遠端系統上擴展 here-document 中的命令替換。這樣做是因為未引用此處的文件。$NF出於同樣的原因,它還會將和作為 shell 變數擴展${getValue}為空字元串(除非這些 shell 變數具有先前的值)。shell 不會注意到$NFawk程序中使用的。

與其嘗試通過 來在遠端主機上執行複雜的命令,不如ssh使用它ssh來獲取數據,然後在該數據上本地執行命令:

ssh username@remotehost cat /user/log/file.log |
awk -F ' ' '/keyword/ { print $NF }'

我也稍微簡化了你的管道,將遞歸 (?!) 結合起來,grep以便awk命令awk在包含 substring 的行上列印最後一個以空格分隔的欄位keyword

另請注意,如果您只想輸出該變數的內容(echo在某些情況下可能會在列印之前另外修改其給出的數據),那麼將輸出分配給變數是沒有意義的。我還刪除了tee -a似乎沒有做太多的呼叫。

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