即使.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.
答案 0 :(得分:0)
ssh
正在从标准输入读取,因此在第一次迭代期间它正在填充CSV文件的其余部分。改为:
result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump*)
-n
选项将ssh
stdin重定向到/dev/null
。
关于错误消息,这是您执行以下操作时的正常错误输出:
ls filename-or-wildcard
并且没有匹配。如果您不想看到,请重定向stderr:
result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump* 2>/dev/null)
答案 1 :(得分:0)
我猜你的CSV文件的最后一行没有以回车符结束。
当发生这种情况时,read
将填充变量但没有回车符来终止该行,它将转而到达文件的末尾,因此循环将不会执行。
如果您无法确认最后一行将以回车符终止,并且无法通过将echo >> targets.csv
放在脚本的开头添加一个来编辑文件,那么您可以在之后检查变量循环来对他们采取行动。要做到这一点,我会在循环结束时清除其中一个变量,这样你就可以简单地测试它是否为非零长度,以便知道有一条最终的未处理行。