我发布此邮件以防其他人遇到此问题。我将向IBM公开一个案例,如果有更新,我会报告。
当我使用文件时,我在AIX 7.1上遇到了问题(但在6.1上没有问题) 驱动循环(例如:cat myfile.txt |读取myvar时)。打电话给ssh 从循环内部导致循环在第一次迭代时过早退出。
在我的现实生活中,我并没有使用" ls"填充文件,但这样做可以更容易演示。
我已获得以下代码:
#!/usr/bin/ksh93
ssh LESAUN01 -l root "ls -1 c*" > file.list
echo "------------------------------------------"
cat file.list
echo "------------------------------------------"
echo ""
echo "Loop 1"
echo ""
cat file.list | while read file1
do
echo " File: $file1"
done
echo ""
echo "Loop 2"
echo ""
cat file.list | while read file2
do
echo " File: $file2"
ssh LESAUN01 -l root "ls -l $file2"
done
echo ""
echo "Done"
exit
当我从AIX 6.1 lpar运行它时,我得到了这些预期的结果
-----------------------------------------
client.txt
customer_handover.log
------------------------------------------
Loop 1
File: client.txt
File: customer_handover.log
Loop 2
File: client.txt
-rw-r--r-- 1 root root 91323 Feb 12 2015 client.txt
File: customer_handover.log
-rw------- 1 root root 27533 Aug 31 18:04 customer_handover.log
Done
在7.1上运行时,我得到了这个结果:
------------------------------------------
client.txt
customer_handover.log
------------------------------------------
Loop 1
File: client.txt
File: customer_handover.log
Loop 2
File: client.txt
-rw-r--r-- 1 root root 91323 Feb 12 2015 client.txt
Done
我的解决方案是从数组中提取循环而不是文件(在将文件加载到数组之后),这可以按预期工作。
这适用于6.1和7.1
#!/usr/bin/ksh93
ssh LESAUN01 -l root "ls -1 c*" > file.list
echo "------------------------------------------"
cat file.list
echo "------------------------------------------"
echo ""
echo "Loop"
echo ""
i=0
set -A file_array
cat file.list | while read line
do
file_array[ $i ]="$line"
(( i++ ))
done
for x in "${!file_array[@]}"
do
echo " File: ${file_array[$x]}"
ssh LESAUN01 -l root "ls -l ${file_array[$x]}"
done
echo ""
echo "Done"
exit
这给出了预期的结果。
------------------------------------------
client.txt
customer_handover.log
------------------------------------------
Loop
File: client.txt
-rw-r--r-- 1 root root 91323 Feb 12 2015 client.txt
File: customer_handover.log
-rw------- 1 root root 27533 Aug 31 18:04 customer_handover.log
Done
答案 0 :(得分:1)
cat file.list | while read file2
do
echo " File: $file2"
ssh LESAUN01 -l root "ls -l $file2"
done
cat file.list
的输出是循环内每个命令的标准输入。 ssh
从其标准输入读取,以便将流中继到远程进程,因此它消耗cat
输出。
一个简单的解决方法是重定向ssh的标准输入:
cat file.list | while read file2
do
echo " File: $file2"
ssh LESAUN01 -l root "ls -l $file2" < /dev/null
done