这看起来很简单,但我不知道为什么如果我尝试对从文件中读取的数据进行任何处理,它不会超出第一行。
代码:
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:::
任何想法?
答案 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