Я работал со старым шлюзом GSM, в документации показано, как подключиться к устройству через telnet для отправки SMS-сообщений. Мой план состоял в том, чтобы написать сценарий ожидания на моем CentOS-сервере, который мог бы отправлять простые сообщения оповещений, когда это необходимо.Telnet управляет характером поведения в CentOS vs Windows
Когда я проверил это я подключен к устройству PorTECH с помощью Telnet-клиент для Windows, я должен был ввести следующие команды:
module1
#The following command tells the device to echo back received commands to the telnet client
ate1
at+cmgf=1
at+cmgs="07XXXXXXXXX"
> Message to be sent
Ctrl-Z
В любой момент после выбора Module1 вас можно нажать ctrl-x, чтобы освободить модуль1, это отлично работает.
Ctrl-Z используется здесь для отправки сообщения, которое вы напечатали.
Я написал ожидать сценарий для обработки этой серии событий, но когда дело дошло до отправки Ctrl-Z сообщения (Я использовал \ 032, и это показывает^Z в окне терминала, когда я запускаю скрипт) ничего не произошло.
Я был немного озадачен, поэтому загрузил telnet в CentOS и сам прошел через этапы. Я заметил, что когда я нажал ctrl-x, чтобы освободить модуль, я должен был вернуть карету для наблюдения за этой командой, поэтому я попытался добавить это к моему сценарию (это не помогло). Я также попытался запустить все команды, упомянутые выше, для отправки SMS-сообщения, когда он пришел к той части, где я нажимаю ctrl-z, чтобы отправить сообщение после его ввода, даже если я следую за вводом ctrl-z с возвратом каретки не наблюдалось.
Я также пытался запустить telnet с флагом -8 (я не мог пройти мимо приглашения на вход) и флагом -7, который позволил мне войти в систему, но не преодолел проблему с помощью ctrl-z ввод в конце.
Я также попытался загрузить telnet, запустив «toggle localchars», а затем попытался пройти шаги, которые дали мне тот же результат с ctrl-z.
Я также видел сообщение, предлагающее попробовать «переключить параметры» и «переключить термины», которые могут помочь диагностировать проблему, но я не уверен, на что я смотрю, когда у меня есть эти параметры, после жму Ctrl-Z:
^ZSENT IAC SUSP
SENT DO TIMING MARK
Я не уверен, что это будет означать, или как проверить, насколько она отличается от работы телнет Windows. Может ли кто-нибудь сообщить, почему этот вход имел бы другой эффект от нажатия ctrl-z в сеансе telnet Windows?
EDIT
Из того, что я могу сказать, программа Microsoft telnet посылает те же восьмеричные значения на сервер телнет как программа CentOS telnet, так что я действительно не понимаю, почему острые Ctrl-Z работает в Windows, телнет , но не работает в telnet telnet ...из совета Zathrus в #centos Irc канал Я также попытался отправки Ctrl-V перед моим Ctrl-Z (как в сценарии и простой телнет), и это не помогло ...
ДАЛЕЕ EDIT
Я делал некоторое рытье на этом сегодня, я побежал Wireshark на моей машине Windows, и обнаружили, что Windows, посылает пакет с «данными: \ 032», как и ожидалось, но когда я захватить трафик с ТСРйитр сеанса telnet на моей машине CentOS отправляет «Suspend Current Process» вместе с «Make Timing Mark».
Запуск сценария, который я написал вместо ручного подключения к telnet, по-видимому, отправляет ту же информацию, независимо от того, что я отправляю литерал \ 032 выражение, которое оно переводится как «приостанавливать текущий процесс», в том же пакете I также получите символы \ r \ n, отправленные в конце моего ожидания.
Просто для ясности, вот сценарий я использую для отправки сообщений:
#!/usr/bin/expect
# Test script for SMS sends automatically via expect & telnet
#Set a sensible timeout
set timeout 20
#Our target device
set target 10.0.0.114
#set username and password info for SMS sending
set user voip
set pword 1234
#spawn the telnet session
spawn telnet $target
#Set up the expects fo the login process
expect "username:"
send "$user\n"
expect "password:"
send "$pword\n"
#I've only put a SIM in module1 so far
expect "]"
#check state1 for free, make sure it isn't in use already, exit if returns none
send "state1\n"
expect {
"free" { send "module1\n" }
"none" { send "logout\n" }
}
expect "got!! press 'ctrl-x' to release module 1." { send "ate1\n" }
expect "0" { send "at+cmgf=1\n" }
expect "0" { send "at+cmgs=\"07XXXXXXXXX\"\ntesting\032\015\012\n" }
#this should be the ctrl-z input as per http://www.unix-manuals.com/refs/misc/ascii-table.html
#send "\032"
interact
Я также попытался запустить захват после собираюсь в телнет и подачи команды тумблера localchars перед открытием соединения на шлюз GSM этот захват также показывает, что переданные данные являются «Suspend Current Process», а затем «Do Timing Mark»
Есть ли что-нибудь еще, что я могу сделать, чтобы отправить литерала \ 032 выражение и не интерпретировать его ?
ДАЛЕЕ EDIT:
Вот перехваченные пакеты из сессий для Windows и Linux Telnet
Это шестигранной захвачена для телнет сессии Windows, пакет показан в Wireshark, как «Данные: \ 032 "
0000 00 03 7e 00 44 4f 30 85 a9 0e a6 52 08 00 45 00 ..~.DO0....R..E.
0010 00 29 3d 0b 40 00 80 06 b1 32 0a 00 f8 1f 0a 00 .)[email protected]
0020 00 72 10 02 00 17 cf 41 a8 01 b0 3e 52 22 50 18 .r.....A...>R"P.
0030 f9 1d 06 5f 00 00 1a ..._...
Это шестигранной захвачена для телнет сессии Linux, которая показывает в Wireshark, как„Приостановить текущий процесс“, а затем„Do Timing Mark“:
0000 00 03 7e 00 44 4f 00 16 35 37 74 22 08 00 45 10 ..~.DO..57t"..E.
0010 00 2d 08 43 40 00 40 06 13 c6 0a 00 0a 41 0a 00 [email protected]@......A..
0020 00 72 b1 46 00 17 b8 b3 01 36 a9 22 f2 7e 50 18 .r.F.....6.".~P.
0030 39 08 1e d2 00 00 ff ed ff fd 06 9..........
Привет, спасибо за ответ, я обновил свой вопрос, команда ate1 заставит устройство повторять все обратно на сеанс telnet, чтобы вы знали, когда что-то было отправлено на него. Я могу предоставить материалы/ответы, если это поможет.Я заметил, что когда я нажимаю ctrl-x или ctrl-z в telnet windows, он сразу принимает его и не нуждается в возврате. Но в Linux ему нужно было вернуть его на сервер telnet. Я попробую добавить эти восьмеричные в свой скрипт, хотя и посмотреть, поможет ли это. – Rumbles
Я попытался добавить оба CF + LF, но это не помогло – Rumbles
@ Rumbles ofc, предоставляя ** полный ** в/и вывод (каждый с отличием помеченный) помогает отладить проблему! Если возможно, попробуйте переключить терминалы в необработанный режим (поэтому автоматически отображаются управляющие символы) – Florian