Shell
在 ssh 到遠端主機之後,在 EOF 中使用的 grep 會給出輸出“沒有這樣的文件或目錄”
設想:
我有一個腳本可以連接到遠端主機並從日誌文件中 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 不會注意到$NF
在awk
程序中使用的。與其嘗試通過 來在遠端主機上執行複雜的命令,不如
ssh
使用它ssh
來獲取數據,然後在該數據上本地執行命令:ssh username@remotehost cat /user/log/file.log | awk -F ' ' '/keyword/ { print $NF }'
我也稍微簡化了你的管道,將遞歸 (?!) 結合起來,
grep
以便awk
命令awk
在包含 substring 的行上列印最後一個以空格分隔的欄位keyword
。另請注意,如果您只想輸出該變數的內容(
echo
在某些情況下可能會在列印之前另外修改其給出的數據),那麼將輸出分配給變數是沒有意義的。我還刪除了tee -a
似乎沒有做太多的呼叫。