簡體   English   中英

帶有嵌套ls和head的ssh尾部無法訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM