【问题标题】:While loop exits after reading one line using ssh [duplicate]使用ssh读取一行后循环退出[重复]
【发布时间】:2015-12-05 18:39:12
【问题描述】:

您好,我将文件名与以下条目绑定:

testnode1 eth0
tetnode2  eth2

现在我正在编写一个 bash 脚本,使用 while 执行循环以将该条目放入变量中,然后将其用于以下命令:

ssh $serv ifconfig | grep $nic

问题是它在第一次读取“testnode1”后退出到早期它没有执行下一行“testnod2”

这是整个代码:

#!/bin/bash
cat bonding | while read line
do
    serv=$(echo $line | awk '{print $1}')
    nic=$(echo $line | awk '{print $2}')
    echo $serv
    ssh $serv ifconfig | grep $nic
done

输出:

testnode1
eth0      Link encap:Ethernet  HWaddr 00:0C:29:99:C0:CD 

预期输出

testnode1
eth0      Link encap:Ethernet  HWaddr 00:0C:29:99:C0:CD  
testnode2
eth2      Link encap:Ethernet  HWaddr 00:0A:30:40:QB:A1  

谁能指出我的错误,谢谢

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    那是因为ssh 从标准输入读取。由于您正在循环读取文件,ssh 会读取所有内容,并且在下一次迭代中,没有什么要读取的了。因此,循环在一次迭代后退出。

    你可以这样做:

    ssh "$serv ifconfig | grep $nic" </dev/null
    

    ssh -n $serv ifconfig | grep $nic
    

    来自ssh 手册:

     -n   
    

    从 /dev/null 重定向标准输入(实际上,阻止从标准输入读取)。这必须在 ssh 运行时使用 背景。一个常见的技巧是使用它来运行 X11 程序 远程机器。例如 ssh -n shadows.cs.hut.fi emacs & 将 在 shadows.cs.hut.fi 上启动一个 emacs,X11 连接将是 通过加密通道自动转发。 ssh 程序 将被置于后台。 (如果 ssh 需要,这不起作用 要求输入密码或密码;另请参见 -f 选项。)

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2014-02-11
      • 1970-01-01
      • 2019-08-19
      • 2017-04-26
      • 1970-01-01
      • 2016-04-29
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多