[英]ssh tail with nested ls and head cannot access
我正在嘗試執行以下命令:
$ ssh root@10.10.10.50 "tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )"
ls: cannot access /var/log/alert_ARCDB.log: No such file or directory
tail: cannot follow `-' by name
注意當我分別登錄ssh然后執行時返回的錯誤
tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )"
見下面:
# ls -t /var/log/alert_ARCDB.log | head -n1
/var/log/alert_ARCDB.log
為什么會這樣以及如何解決它。 我試圖在一行中執行此操作,因為我不想創建腳本文件。
非常感謝
Shell參數擴展發生在命令執行之前 。
這是一個簡單的例子。 如果我輸入...
ls "$HOME"
... shell首先用$HOME
home路徑替換$HOME
,然后運行ls /home/larsks
。 ls
命令不知道命令行最初有$HOME
。
如果我們看看您的命令...
$ ssh root@10.10.10.50 "tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )"
...我們看到您處於完全相同的情況。 在執行ssh
之前,將擴展$(ls -t ...)
表達式。 換句話說,該命令正在運行您的本地系統。
您可以使用單引號禁止外殼擴展在本地系統上。 例如,運行:
echo '$HOME'
將產生:
$HOME
這樣就可以運行:
ssh root@10.10.10.50 'tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )'
但是這里還有另一個問題。 如果/var/log/alert_ARCDB.log
是文件 ,則您的命令沒有任何意義:在單個文件上調用ls -t
不會帶來任何好處。
如果alert-ARCDB.log
是目錄 ,那么您會遇到其他問題。 ls /some/directory
的結果是沒有任何目錄前綴的文件名列表。 如果我運行類似:
ls -t /tmp
我會得到類似的輸出
file1
file2
如果我這樣做:
tail $(ls -t /tmp | head -1)
我最終得到如下命令:
tail file1
那將失敗,因為當前目錄中沒有file1
。
一種方法是將要執行的命令傳遞給ssh。 一種簡單的實現方法是首先創建一個函數,該函數將回顯您要執行的命令:
remote_commands()
{
echo 'cd /var/log/alert_ARCDB.log'
echo 'tail -F -n 1 "$(ls -t | head -n1 )"'
}
cd
將允許您使用ls
列出的相對路徑。 單引號確保所有內容均按原樣發送到遠程Shell,而不會發生本地擴展。
那你可以做
ssh root@10.10.10.50 bash < <(remote_commands)
假設alert_ARCDB.log
是目錄(否則我不確定為什么要在此之后添加head -n1
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.