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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环EOF ssh -n无法创建文件相关的知识,希望对你有一定的参考价值。

希望这次不是重复。我没找到任何东西。

我的代码:

#!/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没有'......'但没有运气

我错过了什么吗?谢谢你的帮助,朱莉

答案

你有两个问题。

  • 如果你在没有-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

以上是关于循环EOF ssh -n无法创建文件的主要内容,如果未能解决你的问题,请参考以下文章

python paramiko模块sftp异常:paramiko.ssh_exception.SSHException: EOF during negotiation

“此处文档”的 EOF 中的 Bash 脚本数组循环

为啥 fread 循环需要额外的 Ctrl+D 来用 glibc 发出 EOF 信号?

使用ED25519算法生成SSH密钥,解决git clone报错:early EOF fetch-pack: invalid index-pack output

有人可以解释我如何循环文本,直到输入EOF字符?还有如何使用向量?

git clone --early EOF