LINUX.ORG.RU

Посылка команды по telnet

 ,


0

1

Есть некоторый сервис (mobile из пакета osmocombb) висит на 4247 порту, управляется интерактивно с помощью telnet при помощи набора внутренних команд. Вопрос, как из сторонней самописной программы заставить этот сервис исполнить одну из своих внутренних команд? Я так понимаю, самый простой способ - это воспользоваться этим самым telnet. Только как отказаться от интерактивности, как послать одиночную команду?

★★★

как послать одиночную команду?

Ну вот у меня запущен MPD на 6600 порту.

echo 'pause' | nc localhost 6600 -q 1
OK MPD 0.18.0
OK

И он ставит паузу.

Если надо прямо из программы, то юзай send(2).

Extraterrestrial ★★★★★
()
Последнее исправление: Extraterrestrial (всего исправлений: 1)
Ответ на: комментарий от wakuwaku

Опять таки вопрос, каким сокетом пользоваться, потоковый, дейтаграмным ?

LIKAN ★★★
() автор топика
Ответ на: комментарий от Deleted

Просто делается это в рамках сишного приложения, хотелось бы на си, чтоб костыли не городить.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Прошу прощения, не обратил внимание на тег, по которому сюда, собственно, и пришел.

Гугли «linux socket client», найдешь кучу примеров.

Deleted
()
Ответ на: комментарий от LIKAN

http://www.cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/tcp-client.c

Тут пример установки соединения, замени argv[1] на строку с айпишником и пиши команду. Если ответ не ожидается, то можно просто закрыть shutdown(SHUT_WR) и холостой read(), чтобы дождаться закрытия с той стороны, потом close() для освобождения сокета. Иначе парси ответ и смотри чо как. Если ты на гну/юниксе, то проще через system+nc, как выше писали.

Также man inet_addr/inet_pton.

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 1)
Ответ на: комментарий от Extraterrestrial

Так, а что за опция -q, а то у меня вот такая вот ерундень происходит

$ echo 'call 1 89150383327' | nc localhost 4247 -q 1
nc: ???????? ???? -- <<q>>
Try `nc --help' for more information.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Filter: tcp.srcport==4247 || tcp.dstport==4247

Decode as: Transport->TELNET

anonymous
()
Ответ на: комментарий от LIKAN

записываешь как telnet общается с сервисом, затем записываешь как твоя программа общается с сервисом, сравниваешь, думаешь, меняешь код, повторяешь все с начала.

anonymous
()
Ответ на: комментарий от ubuntuawp

Expect через system отказывается работать. system делает /bin/sh -c команда. Так вот если я из консоли делаю

expect expefile
То все работает, а вот если
/bin/sh -c "expect expect.sh"
То необходимая команда не выполняется, хотя видно, что какие-то огрызки текста из порта идут.

LIKAN ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Мне вот интересно, а почему это тогда называется протоколом telnet. Зачем называть протоколом просто общение с помощью сокетов?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Дык, telnet — это и есть незашифрованное общение с помощью сокетов по выделенному порту. Короче же сказать "телнет", нежели "незашифрованное ..."

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Так, окей, а как telnet сервер определяет, сколько ему нужно считать из сокета, в ведь он не знает длину сообщения, которое я ему отправил.

LIKAN ★★★
() автор топика
Ответ на: комментарий от ubuntuawp

А чем отличается $expect expect.sh из консоли от system («expect expect.sh») и от system('/usr/local/bin/script.sh'). Первое работает всегда, второе работает раз через раз, притом видно, что программа с telnet сервером пообщалась, но это общение не всегда заканчивается нужным р-татом. А вот если просто из консоли expect запускать, то все ок работает.

LIKAN ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Эмм, а можно поинтересоваться, как это организовать? Те есть чтение всего подряд? Обычно в recvfrom указывают сколько кокретно хотят считать из сокета?

LIKAN ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Если будут приходить какие-то команды, длиной больше чем buflen, то делать придется в цикле. Как тогда определить, что мы уже получили команду целиком, и её надо выполнить? Как разделить команды между собой? По \n ?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Нет там никаких проблем. Заполняй себе буфер до нужного разделителя и обрабатывай. Я по '\n' разделяю, например.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от LIKAN

почему это тогда называется протоколом telnet

Потому, что там есть ещё команды и опции.

no-such-file ★★★★★
()

Послать второй командой какой-нибудь disconnect?

orm-i-auga ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.