逐行处理文件在ksh中不起作用

时间:2018-03-15 00:19:17

标签: loops unix while-loop ksh do-while

这看起来很简单,但我不知道为什么如果我尝试对从文件中读取的数据进行任何处理,它不会超出第一行。

代码:

while IFS="" read -r line
do
 u=`echo $line | awk '{print $4}'`
 h=`echo $line | awk '{print $2}'|cut -f1 -d'.'`
 echo "$h : $u"
 ssh $h grep $u /etc/shadow
done < "/var/tmp/user_data"

user_data是一个文件,每个用户/系统有一行,如:

xxx unixhost01  xxx admin69 xxx... ....
xxx host xxx uid xxx... ...
    ...
    ...

当我运行此代码时,它只适用于第一行然后退出。 shell中的debug显示没有问题。当我在没有ssh操作/命令的情况下运行它时它会处理整个数据文件。

shell是ksh:

# ps
   PID TTY         TIME CMD
  1424 pts/138     0:00 ps
 18521 pts/138     0:02 ksh

执行它时只打印(第一行):

unixhost01 : admin69
admin69:$1$gFfcEQETGZAo6W0:17599:0:90:10:::

任何想法?

1 个答案:

答案 0 :(得分:1)

问题出在ssh本身,因为它消耗标准输入,所以下次你循环获取另一条线时,没有任何剩余。您可以通过将命令更改为:

来验证这一点
ssh $h cat

并看到它在第一个ssh会话期间输出了您的其余文件。

您可以通过至少两种方式解决此问题,第一种方法只需从标准输入断开您的ssh

ssh $h grep $u /etc/shadow </dev/null

第二个(如果您实际上希望与目标框进行交互,则需要)是对输入文件流使用不同的文件句柄:

while IFS="" read -u3 -r line ; do   # reads file #3
    blah blah blah
done 3</var/tmp/user_data            # sends data via file #3