Автоматический выход из команды Telnet обратно в приглашение без вмешательства человека ^] quit close код выхода 1

Я запускаю команду telnet на хосте для данного порта (который открыт), она возвращает 0 (успех).

Чтобы попробовать telnet вручную, я набираю следующую команду, затем нажимаю control+bracket, т.е. ^], затем нажимаю клавишу Enter, затем получаю приглашение telnet>, где, если я набираю close или quit, он возвращается к приглашению $ и видит выход статус последней команды показывает 0 для (успех), поскольку порт 2878 открыт (согласно выходным данным команды telnet).

[vagrant@myvagrant /tmp] $ telnet `hostname` 2878
Trying 127.0.0.1...
Connected to myvagrant.
Escape character is '^]'.
^]

telnet> close
Connection closed.
[vagrant@myvagrant /tmp] $ echo $?
0

Теперь я хотел выполнить ту же операцию без какого-либо вмешательства человека, то есть я не хочу вручную давать ^] и нажимать клавишу Enter, чтобы перейти к подсказке telnet>, а затем ввести команду telnet close (или quit), чтобы, наконец, вернуться к $ быстрый.

Для этого я попытался использовать параметр команды echo -e и указать ^], \n (для символа новой строки, то есть клавиши Enter) и команды close (для приглашения telnet>, чтобы вернуться к приглашению $). Это сработало, как и ожидалось, но для статуса выхода последней команды echo $? я получаю 1 (вместо 0). Почему?

[vagrant@myvagrant /tmp] $ echo -e "^]\nclose" | telnet `hostname` 2878
Trying 127.0.0.1...
Connected to myvagrant.
Escape character is '^]'.
Connection closed by foreign host.
[vagrant@myvagrant /tmp] $ 
[vagrant@myvagrant /tmp] $ echo $?
1
[vagrant@myvagrant /tmp] $ 

или также попробовал метод here-doc, но не уверен, почему он возвращает 1 (в качестве кода выхода) для действительного открытого порта.

[vagrant@myvagrant /tmp] $ telnet `hostname` 2878 <<GIGA
> echo ^]
> echo close
> GIGA
Trying 127.0.0.1...
Connected to myvagrant.
Escape character is '^]'.
Connection closed by foreign host.
[vagrant@myvagrant ~/aks/always-latest-ws-sunny] $ echo $?
1
[vagrant@myvagrant ~/aks/always-latest-ws-sunny] $

Как я могу автоматически выйти из telnet, если порт открыт и получить 0 в качестве кода выхода? Если есть способ перехватить вывод предыдущей команды, возможно, я смогу выполнить grep строку «Connection Closed by Foreign Host.», чтобы пометить ее как успешную (0).


person AKS    schedule 05.01.2017    source источник


Ответы (5)


Небольшое улучшение ответа, предоставленного Мэтью выше, которое позволяет вам использовать его внутри сценариев оболочки:

$ echo -e '\x1dclose\x0d' | telnet google.com 80
Connected to google.com.
Escape character is '^]'.

telnet> close
Connection closed.
$ echo $?
0
person Maxim Akhmedov    schedule 25.01.2019
comment
Ответ Мэтью не работает для меня. Этот работает. Я до сих пор удивляюсь, почему. - person Vishal; 20.06.2019
comment
Работай для меня красиво! - person Nam G VU; 09.01.2020
comment
@Максим Ахмедов Красиво!! - person AKS; 21.04.2020

╭─ ~
╰» echo "^]close^M" | telnet localhost 22; echo $?
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

telnet> close
Connection closed.
0

Чтобы ввести символы ^] и ^M, нажмите ctrl+v ctrt+] и ctrl+v ctrl+m соответственно.

person Matthew    schedule 11.08.2018

Вот чистый способ сделать это

echo -n | telnet `hostname` 2878

Для получения дополнительной информации об этом поведении см. этот ">ссылка

person k_vishwanath    schedule 28.03.2020

Вам может понадобиться другой пакет Linux, например expect, чтобы добиться того, чего вы хотите.

person Chiu    schedule 05.01.2017
comment
Да, ожидать - это проблема. путь. Expect — это инструмент для автоматизации интерактивных приложений по сценарию. Следуя сценарию, Expect знает, чего можно ожидать от программы и каким должен быть правильный ответ. - person Roadowl; 05.01.2017

person    schedule
comment
Нет, мне не очень нравится это решение, но оно работает, так как я использовал как минимум 2-3 операции. - person AKS; 06.01.2017