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

process file line by line does not work in ksh

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

代码:

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

user_data 是一个文件,每个 user/system 一行,例如:

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

当我 运行 这段代码时,它只在第一行有效然后退出。 shell 中的调试显示没有问题。当我 运行 它没有 ssh operation/command 它处理整个数据文件。

shell 是 ksh:

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

执行时仅打印(第一行):

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

有什么想法吗?

问题出在 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