將主機添加到已知主機列表失敗
我想回收一些磁碟空間,因為當我檢查磁碟空間資訊時它只有 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 身份驗證。