Shell脚本 - 循环/文件读取不起作用

时间:2016-11-11 05:08:40

标签: bash shell

我有一个要求应该解决以下几点。

  1. 我有一个包含IP地址列表的文件,我想逐行阅读。
  2. 对于每个IP,我需要使用SSH推送以下命令(所有都是Mikrotik设备)

       / radius add service=login address=172.16.0.1 secret=aaaa
      / user aaa set use-radius=yes
    
  3. 以下是我的代码。

    #!/bin/bash
    
    filename="branch"
    
    while IFS= read line; do
    
            echo ${line//}
            line1=${line//}
            ok='@'
            line3=$ok$line1
    
            sshpass -p abc123 ssh -o StrictHostKeyChecking=no admin$line3 / radius add service=login address=172.16.0.1 secret=aaaa
            sleep 3
            sshpass -p abc123 ssh -o StrictHostKeyChecking=no admin$line3 / user aaa set use-radius=yes
            sleep 3
            echo $line3
            echo $line
    done <"$filename"
    

    分支文本文件:

    192.168.100.1
    
    192.168.101.2
    
    192.168.200.1
    

    问题:我正在做什么改变虽然循环只运行一次。

    故障排除/观察: 没有SSH命令,如果我运行While循环来读取文件&#34;分支&#34;它工作正常。

1 个答案:

答案 0 :(得分:0)

问题是循环中的程序还读取标准输入的数据。这将消耗"$filename"中的第二行和后续行。 在循环的下一次迭代中,没有任何内容可供阅读,循环终止。

解决方案是识别读取stdin的命令,可能是sshpass并将其更改为单独留下stdin。赛勒斯的回答显示了ssh的一种方法。如果这不起作用,请尝试

sshpass [options and arguments here] < /dev/null

另一种解决方案是用while循环替换for。只要branch文件只包含IP地址,

就可以使用
 for ip in $(cat branch); do
    echo $ip
    ...
    sshpass ...
 done