在服务器列表上运行 ping 命令并输出到文件

在服务器列表上运行 ping 命令并输出到文件

servers.txt我在不同的服务器上有一个文件,其中包含服务器列表:

server1.mydomain.com
server2.mydomain.com
server3.mydomain.com

我想首先下载这个txt文件,ping这些服务器并将ping结果输出到文件中。我想每 x 秒无限循环地执行此操作。

我有一个 VPS 登录,到目前为止我已经想出使用一个名为 的程序连接到 VPS putty.exe

我应该如何处理这个问题?我想我应该编写一个脚本并将服务器设置为每 x 秒运行一次或使用 while 循环。

答案1

好的,我相信我现在明白你的问题了。

在主机1上

让我们假设您已经通过viahost1连接,在该主机上您将安装或(从包管理器中,它们应该在那里)。我建议,因为这对于初学者来说更容易一些。sshputtyscreentmuxscreen

此外,您需要能够登录host2,因此host1您需要设置一个ssh key允许无需密码登录的帐户。要执行此操作,您需要运行:

ssh-keygen -f ~/.ssh/host1tohost2

它将要求输入密码,要自动执行脚本(无需手动输入密码),您应将其设置为空密码。 确保host1安全!由于这个密钥,任何控制的人host1也可以获得控制权host2(在用户权限允许的范围内)。

该命令将生成以下文件:

~/.ssh/host1tohost2
~/.ssh/host1tohost2.pub

您应复制~/.ssh/host1tohost2.pubhost2

scp ~/.ssh/host1tohost2.pub me@host2:~

在 host2 上

在 host2 中创建~/.ssh并移动到那里,然后在该目录中host1tohost2.pub创建一个名为的文件:authorized_keys

mkdir -f ~/.ssh
mv ~/host1tohost2.pub ~/.ssh
cd ~/.ssh
cat host1tohost2.pub >> authorized_keys

这允许从 登录 到 ,host1host2无需交互式密码提示。

下一个,

让我们假设该文件servers.txt位于。这个假设是必要的,因为我们将在 的脚本中使用它。/home/me/myservers/servers.txthost2pathhost1

返回主机1

您需要的无限循环脚本是:

#!/bin/sh

X_SECONDS=6
LOGFILE=~/mypings.log

while ((1)); do
    # >$LOGFILE  # clear log file (see comments)
    ssh -i ~/.ssh/host1tohost2 me@host2 'cat /home/me/myservers/servers.txt' |
    while read x; do
        echo "ping to $x"
        ping -c1 $x >> $LOGFILE
    done
    sleep $X_SECONDS
done

我们假设该脚本保存到一个名为pingservers.sh.但暂时不要运行它,因为一旦关闭它就会停止putty。现在screen进入场景(你安装了它,对吧?)。跑步:

screen

显然没有任何改变。您现在处于通过inshell访问的环境中,如果您从该 shell 然后关闭,则该 shell 不会关闭一次(实际上,如果您只是关闭操作系统,它会解决问题并且无论如何都不会关闭 shell,但让我们做一个出于教育原因是适当的)。在分离之前是时候运行:socket/var/rundetachputtyputtydetach

./pingservers.sh

它将永远运行,并echo在写入日志文件时保留几条消息。

要分离,screen您需要输入Ctrl+A D(按住Ctrl、按下A、释放Ctrl并按下D)。您又回到了原来shell登录的状态putty,现在您可以关闭putty并喝杯咖啡了。

一旦您重新登录,host1该文件~/mypings.log将使用越来越多的 ping 进行更新(无需screen再次运行)。要检查实时更新的文件,您可以使用:

tail -f ~/mypings.log

arch linux wiki 有更多关于 ssh-keygen 和 ssh 密钥的有用信息,同样如此GNU 屏幕。这两篇文章都是这两个程序的极好的信息来源。

答案2

for i in `cat servers.txt` ; do ping -c1 $i 2>&1 | tee >> ping-output.txt; done

这会对文件中的每一行执行 ping(使用 i 作为存储值的变量并使用 $i 引用该变量)并将所有输出重定向到 [output] 文件。 2>&1 部分使用 tee 命令将 stdout(ping 结果)和 stderr(没有 ping,因为没有主机错误)捕获到文件中。

相关内容