我想回收一些磁盘空间,因为当我检查磁盘空间信息时它只有 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
答案1
该命令看起来您可能正在尝试/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 身份验证。