gpt4 book ai didi

linux - 在 shell 脚本中并行运行 ssh 并设置远程变量

转载 作者:太空狗 更新时间:2023-10-29 12:20:33 28 4
gpt4 key购买 nike

我正在编写一个脚本来读取输入文件,其中包含约 1000 行主机信息。脚本 ssh 到每台主机,cd 到远程主机日志目录并 cat 最新 每日日志文件。然后我将 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 是匹配模式并进行统计的函数。

现在我有 2 个问题:

1) 如何远程查找最新每日日志文件? latest 日志文件名与 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 -n name@$host "cd $logDir; cat *$logName" | matchPattern

其中 $logName 是“今天的日期.log”(2012-05-02.log)。问题是我只能在双引号内使用 local 变量。由于我的日志文件以 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 |匹配模式 |分析 东西到它自己的函数中,然后通过

迭代它
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 | 分开可能会更好匹配模式 |将内容分析到它自己的脚本中,然后使用xargs的并行变体来调用它。

关于linux - 在 shell 脚本中并行运行 ssh 并设置远程变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418103/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com