在循环中调用ssh会破坏循环变量上下文(AIX 7.1上的ksh93)

时间:2018-01-09 19:31:32

标签: ksh aix

我发布此邮件以防其他人遇到此问题。我将向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

1 个答案:

答案 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