Loop EOF ssh -n не может создать файл - PullRequest
0 голосов
/ 13 февраля 2019

Надеюсь, на этот раз это не дубликат.Я ничего не нашел.

Мой код:

#!/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 голосов
/ 14 февраля 2019

У вас есть две проблемы.

  • Если вы вызываете ssh без -n, он может использовать вход $ FILE (он истощает свой стандартный ввод)
  • Если вы вызываете ssh с -n он не будет читать свой стандартный ввод, поэтому ни одна из команд не будет выполнена

Тем не менее, первый 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
...