servers.txt
我在不同的服务器上有一个文件,其中包含服务器列表:
server1.mydomain.com
server2.mydomain.com
server3.mydomain.com
我想首先下载这个txt文件,ping这些服务器并将ping结果输出到文件中。我想每 x 秒无限循环地执行此操作。
我有一个 VPS 登录,到目前为止我已经想出使用一个名为 的程序连接到 VPS putty.exe
。
我应该如何处理这个问题?我想我应该编写一个脚本并将服务器设置为每 x 秒运行一次或使用 while 循环。
答案1
好的,我相信我现在明白你的问题了。
在主机1上
让我们假设您已经通过viahost1
连接,在该主机上您将安装或(从包管理器中,它们应该在那里)。我建议,因为这对于初学者来说更容易一些。ssh
putty
screen
tmux
screen
此外,您需要能够登录host2
,因此host1
您需要设置一个ssh key
允许无需密码登录的帐户。要执行此操作,您需要运行:
ssh-keygen -f ~/.ssh/host1tohost2
它将要求输入密码,要自动执行脚本(无需手动输入密码),您应将其设置为空密码。 确保host1安全!由于这个密钥,任何控制的人host1
也可以获得控制权host2
(在用户权限允许的范围内)。
该命令将生成以下文件:
~/.ssh/host1tohost2
~/.ssh/host1tohost2.pub
您应复制~/.ssh/host1tohost2.pub
至host2
:
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
这允许从 登录 到 ,host1
而host2
无需交互式密码提示。
下一个,
让我们假设该文件servers.txt
位于。这个假设是必要的,因为我们将在 的脚本中使用它。/home/me/myservers/servers.txt
host2
path
host1
返回主机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/run
detach
putty
putty
detach
./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,因为没有主机错误)捕获到文件中。