我正在编写一个脚本来读取输入文件,该文件包含约1000行主机信息。脚本ssh连接到每个主机,cd连接到远程主机的日志目录,并保存最新的每日日志文件。然后,我将cat日志文件重定向到本地,以进行一些模式匹配和统计。
我的程序的简化结构是while循环,如下所示:
while read host
do
ssh -n name@$host "cd TO LOG DIR AND cat THE LATEST LOGFILE" | matchPattern
done << EOA
$(awk -F, '{print &7}' $FILEIN)
EOA
其中matchPattern是用于匹配模式并进行统计的函数。
现在我有两个问题:
1)如何远程查找最新的每日日志文件?最新的日志文件名与xxxx2012-05-02.log匹配并且是最新创建的,是否可以远程执行ls并找到与xxxx2012-05-02.log文件名匹配的文件?(我可以在本地进行此操作但被卡住将其附加到ssh命令时)我可以想到的另一种方法是
cat 'ls -t | head -1' or
cat $(ls -t | head -1)
但是,如果我将此附加到ssh,它将列出我本地最新创建的文件名,我们可以将其设置为远程变量,以便cat找到正确的文件吗?
2)由于有近1000台主机,我想知道我是否可以并行执行此操作(例如一次执行20 ssh并在前20个完成后执行下20个ssh),将&附加到每个ssh似乎不足以完成它。
任何想法将不胜感激!
跟进:
大家好,我终于找到了一种cr脚的方法来解决第一个问题:
ssh -n name@$host "cd $logDir; cat *$logName" | matchPattern
其中$ logName是“今天的date.log”(2012-05-02.log)。问题是我只能在双引号中使用局部变量。由于我的日志文件以2012-05-02.log结尾,并且没有其他文件以该后缀结尾,因此我只是在远程计算机上盲目地执行
cat *2012-05-02.log
,它将为我提供所需的文件。 最佳答案
对于第一个问题,
ssh -n name@$host 'cat $(ls -t /path/to/log/dir/*.log | head -n 1)'
应该管用。注意远程命令周围的单引号。
对于第二个问题,请将所有
ssh | matchPattern | analyse
内容包装到其自己的函数中,然后通过outstanding=0
while read host
do
sshMatchPatternStuff &
outstanding=$((outstanding + 1))
if [ $outstanding -ge 20 ] ; then
wait
outstanding=$((outstanding - 1))
fi
done << EOA
$(awk -F, '{print &7}' $FILEIN)
EOA
while [ $outstanding -gt 0 ] ; do
wait
outstanding=$((outstanding - 1))
done
(我假设您正在使用
bash
。)最好将
ssh | matchPattern | analyse
内容分成自己的脚本,然后使用xargs
的并行变体来调用它。关于linux - 在shell脚本中并行运行ssh并设置远程变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10418103/