我正在编写一个脚本来读取输入文件,该文件包含约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/

10-16 23:55