循环EOF ssh -n无法创建文件

时间:2019-02-13 19:57:47

标签: bash ssh eof

希望这次不是重复的。我什么都没找到。

我的代码:

#!/bin/bash
FILE=/home/user/srv.txt
TICKET=task
while read LINE; do
    ssh -nT $LINE << 'EOF'
        touch info.txt
        hostname >> info.txt 
        ifconfig | grep inet | awk '$3 ~ "cast" {print $2}' >> info.txt
        grep -i ^server /etc/zabbix/zabbix_agentd.conf >> info.txt 
        echo "- Done -" >> info.txt
EOF
ssh -nT $LINE "cat info.txt" >> $TICKET.txt
done < $FILE #End

我的问题:

  • 如果我仅使用ssh $LINE,它将仅SSH到主机的第一行,并且还会显示错误Pseudo-terminal will not be allocated because stdin is not a terminal.
  • 使用ssh -T,修复上面的错误消息,它将创建文件info.txt
  • 使用ssh -nT,修复以下错误:ssh仅读取第一行,但出现错误消息cat: info.txt: No such file or directory。如果我对主机进行SSH,则可以确认主文件夹中没有info.txt文件。并使用ssh -T将这个文件保存在主文件夹中。

我尝试使用-t选项,也可以在这里使用EOF,但不使用... ...但没有运气

我想念什么吗? 谢谢你的帮助, 朱莉

1 个答案:

答案 0 :(得分:1)

您有两个问题。

  • 如果您在不使用-n的情况下调用ssh,则可能会消耗$ FILE输入(耗尽其标准输入)
  • 如果您使用-n调用ssh,它将不会读取其stdin,因此不会执行任何命令

但是,第一个ssh的输入已重定向为来自heredoc,因此不需要-n

如评论中所述,不需要第二个ssh调用。与其直接传递到info.txt,然后将其复制到本地文件中,不如直接将其输出到本地文件中:

while read LINE; do
    ssh -T $LINE >>$TICKET.txt <<'EOF'
        hostname 
        ifconfig | grep inet | awk '$3 ~ "cast" {print $2}'
        grep -i ^server /etc/zabbix/zabbix_agentd.conf
        echo "- Done -"
EOF
done <$FILE