Xargs

將主機添加到已知主機列表失敗

  • March 19, 2021

我想回收一些磁碟空間,因為當我檢查磁碟空間資訊時它只有 7.5GB 的空間我通常會看到這條消息消耗了大部分磁碟,

Failed to add the host to the list of known hosts

我清除磁碟空間的命令是這樣的

cat machines.txt | xargs -I {} ssh {} bash -c "'sudo echo " " > /var/log/messages'"

我有一個文本,其中包含我的機器的 ip。我試圖弄清楚為什麼sudo echo " "命令對我不起作用。它給了我這個提示。

Failed to add the host to the list of known hosts (/home/agilos/.ssh/known_hosts).
Permission denied (publickey).
xargs: ssh: exited with status 255; aborting

該命令看起來您可能正在嘗試/var/log/messages一次銷毀多個主機上的目前內容。這看起來像是惡意黑客可能會為了掩蓋他們的踪跡而做的事情。

我假設一machines.txt開始應該是cat machines.txt。如果不是,那麼這意味著它machines.txt實際上是一個執行檔,並且您以一種設計為晦澀的方式命名文件;這是惡意黑客有時會做的另一件事,他們試圖將他們的工具隱藏在被黑客入侵的系統中。

因為您將數據通過管道傳輸到xargs,所以通過管道傳輸的數據代替了xargs流程的標準輸入流。預設情況下,子程序xargs將從中重定向其標準輸入,/dev/null以免干擾到xargs. 該ssh命令將檢測其標準輸入不是終端,並假定它在批處理模式下執行,即它將嘗試在不與使用者互動的情況下完成其工作。

xargs -I {} ...中的每一行執行一次命令行的剩餘部分machines.txt。錯誤消息可能由ssh針對 的第一行執行的命令輸出,或者在命令的一個實例遇到錯誤machines.txt之前,可能已經成功地靜默執行了許多行;ssh從輸出中,無法完全確定machines.txt發生錯誤時使用了哪一行。

第一條消息:

Failed to add the host to the list of known hosts (/home/agilos/.ssh/known_hosts).

是警告;SSH 正在嘗試將它連接到的每個新系統的公共主機密鑰記錄到known_hosts文件中,以便在以後的連接中檢查它,但這次它由於某種原因未能這樣做。實際的連接嘗試可能仍會繼續。

第二條消息:

Permission denied (publickey).

表示其中一台主機不接受您的 SSH 身份驗證密鑰。由於ssh命令在批處理模式下執行,它甚至不知道嘗試密碼驗證,因為批處理模式通常意味著命令在不允許與本地使用者互動的上下文中執行。因此,其中一次 SSH 連接嘗試失敗,因為它無法進行身份驗證。

第三條消息:

xargs: ssh: exited with status 255; aborting

來自xargs命令,因為它ssh根據管道數據的內容檢測到它正在執行的命令之一已退出並出現錯誤。任何時候發生連接錯誤,SSH 都會以狀態 255 退出;任何其他錯誤程式碼將是執行遠端命令的結果。

您正在嘗試sudo echo " " > /var/log/messages使用在多個主機上執行命令xargs,但命令本身不會執行您嘗試執行的操作:shell 將在執行命令之前首先設置重定向,因此使用此命令sudo行最終將僅執行echo " "具有 root 權限的部分,而重定向(該> /var/log/messages部分)將以您登錄的使用者身份執行……因此很可能根本無法執行任何操作。

如果您的實例具有適當的設置logrotate並允許在sudo沒有密碼提示的情況下執行,那麼您可能能夠在所有實例上執行額外的一輪日誌輪換,例如:

xargs -I {} ssh {} sudo /usr/sbin/logrotate /etc/logrotate.conf < machines.txt

這種方式也不需要棘手的引用內引用。

如果您確實需要截斷實際/var/log/messages的 ,“通過 sudo 重定向到具有 root 權限的文件”問題通常可以通過使用tee命令 withsudo來解決。所以你的命令行可能看起來像這樣:

xargs -I {} ssh {} bash -c "'echo " " | sudo tee /var/log/messages'" < machines.txt

但是您需要首先解決您的 SSH 身份驗證問題,為此,您需要知道哪個主機未能通過 SSH 密鑰身份驗證。另外,echo " "在第一條日誌行的開頭添加一個不必要的空格字元;最好只截斷使用/dev/null

xargs -I {} ssh {} bash -c "'sudo tee /var/log/messages </dev/null && hostname'" < machines.txt

這將輸出已成功截斷其日誌的每個系統的主機名,因此您將知道您machines.txt的哪個實例未通過 SSH 身份驗證。

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