-1

即使 .csv 文件中有 2 个条目(行),为什么这个 while 循环只执行一次?
当没有文件/目录与表达式匹配时,字符串'ls:/root/ heapdump:没有这样的文件或目录'怎么会输出到控制台?

#!/bin/bash

INPUT=targets.csv

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while IFS=, read target user password path
do
    result=$(sshpass -p "$password" ssh "$user"@"$target" ls "$path"*heapdump*)

    if [ $? -ne 0 ]
    then
            echo "No Heap dumps detected."
    else
            echo "Found a Heap dump! Possible OOM issue detected"
    fi

done < $INPUT

.csv 内容..

rob@laptop:~/scripts$ cat targets.csv 
server.com,root,passw0rd,/root/
server.com,root,passw0rd,/root/

输出 ..

rob@laptop:~/scripts$ ./checkForHeapdump.sh 
ls: /root/*heapdump*: No such file or directory
No Heap dumps detected.
4

2 回答 2

0

ssh正在从标准输入读取,因此在第一次迭代期间它会吞噬 CSV 文件的其余部分。改成:

result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump*)

-n选项将标准输入重定向ssh/dev/null.

关于错误消息,这是您执行此操作时的正常错误输出:

ls filename-or-wildcard

并且没有匹配项。如果您不想看到,请重定向 stderr:

result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump* 2>/dev/null)
于 2013-04-16T00:03:06.760 回答
0

我猜您的 CSV 文件的最后一行不会以回车符终止。

发生这种情况时,read将填充变量,但没有回车终止该行,它将到达文件末尾,因此循环不会执行。

如果您无法确认最后一行将以回车结束,并且无法通过echo >> targets.csv在脚本开头添加一个来编辑文件,那么您可以检查循环后的变量以对其进行操作。为此,我将在循环结束时清除其中一个变量,这样您就可以简单地测试它是否是非零长度,以了解最后一个未处理的行。

于 2013-04-16T00:11:29.633 回答