跨服务器/用户收集 Cron Tab 条目

Posted

技术标签:

【中文标题】跨服务器/用户收集 Cron Tab 条目【英文标题】:Collecting Cron Tab entries across servers/users 【发布时间】:2015-06-15 03:29:26 【问题描述】:

为此苦苦挣扎了几天。正在尝试创建以空格分隔的 $host $useraccount $crontab 条目列表。

我尝试了几种不同的方法。每个结局都以不同程度的灾难告终,我最接近的是这个,有人指出我缺少的明显的东西。

#!/usr/bin/bash
#Global Crontab Inventory for Scripts
#
outputfile="/localpath/cronoutput.txt"
LPARLIST=/pathto/LPAR.txt

while read LPAR; 
do
    ping -c 1 $LPAR > /dev/null
    if [ $? -eq 0 ]; then
        for user in $(ssh -n $LPAR /opt/freeware/bin/ls /var/spool/cron/crontabs);
        do
            while read line;
            do
                echo "$LPAR $user $line"
            done <"$(ssh -n "$LPAR" /opt/freeware/bin/tail -n +29 /var/spool/cron/crontabs/$user)"
        done
    fi
done <$LPARLIST

它似乎在抱怨试图将尾部的输出作为命令执行。

./crons.sh:第 11 行:(几页裁剪的 cron 条目):文件名太长

./crons.sh: line 11: : 没有这样的文件或目录

./crons.sh:第 11 行:#

【问题讨论】:

【参考方案1】:

这对我有用。

#!/bin/bash
#Global Crontab Inventory for Scripts
#
outputfile="/localpath/cronoutput.txt"
LPARLIST=LPAR.txt

cat $LPARLIST |
while read LPAR; 
do
    ping -c 1 $LPAR > /dev/null
    if [ $? -eq 0 ]; then
    for user in $(ssh -n root@$LPAR ls /var/spool/cron/crontabs);
    do
        ssh -n "root@$LPAR" tail -n +29 /var/spool/cron/crontabs/$user |
        while read line;
        do
            echo "$LPAR $user $line"
        done
    done
    fi
done

我更喜欢cat xxx | while ...,而不是像你那样重定向输入。理论上应该是一样的。我没有发现任何特别的错误,也没有真正改变任何东西——只是重新排列了你所拥有的。

cat xxx | while ... 技术的优点是您可以在 cat 和 while 之间插入命令。在这种情况下,我不会使用 tail -n +29 ,因为您猜测前 29 行是垃圾,但这可能不是真的。相反,我只会对文件进行 cat 处理,然后 egrep 以散列 # 开头的行。再次,....是的,猫是多余的,但谁真正在乎。添加和删​​除东西更通用,更容易。

我没有安装/opt 软件包,除非绝对必要,否则我不会依赖它们。您正在增加依赖性。所以我只使用了本地的“ls”和“tail”。我还添加了一个明确的root@,但您不需要它。它只是简化了我的测试。

也许 ls 溢出了。试试这个:

#!/bin/bash
#Global Crontab Inventory for Scripts
#
outputfile="/localpath/cronoutput.txt"
LPARLIST=LPAR.txt

cat $LPARLIST |
while read LPAR; 
do
ping -c 1 $LPAR > /dev/null
if [ $? -eq 0 ]; then
ssh -n root@$LPAR ls /var/spool/cron/crontabs |
while read user
do
    ssh -n "root@$LPAR" tail -n +29 /var/spool/cron/crontabs/$user |
    while read line;
    do
    echo "$LPAR $user $line"
    done
done
fi
done

希望这会有所帮助...

【讨论】:

同样的错误,它似乎试图将整行作为命令执行,它似乎永远不会使用 echo 命令进入 while 循环。不过,我确实喜欢猫。另外我知道前 29 行是垃圾,因为这些都是由同一个 nim/mksysb 构建的 aix 映像。所以它们都是相同的。我想要注释掉的脚本,因为我也在尝试获取可能准备好退休并且安装腐烂留下的清单。

以上是关于跨服务器/用户收集 Cron Tab 条目的主要内容,如果未能解决你的问题,请参考以下文章

js 跨浏览器tab页通信

为啥跨域 HEAD 请求需要预检?

Android 应用程序 - 跨多个设备同步 SQLite 数据库

如何跨多个微服务提供用户身份?

在 PHP 中跨服务器传输会话

跨多个选项卡填充的唯一实验室条目