Самый простой способ медленно отправлять данные через соединение через сокет - PullRequest
0 голосов
/ 23 января 2011

Мне нужно периодически подключаться к серверу с клиента Linux и посылать некоторые команды, поэтому я написал такой скрипт:

#!/bin/sh
telnet theserver.somewhere.com 9999 <<EOF
command 1
command 2
command 3
EOF

Проблема в том, что мне нужно ждать между командами.Этот сценарий отправляет команды и слишком быстро отключается, что обнаруживает сервер, и сбрасывает команды.Это работает, если я открываю соединение из командной строки, а затем вставляю команды по одной, и это работает с нелокальных клиентов, но с локальных клиентов сценарий завершается ошибкой.Было бы достаточно просто сделать паузу на секунду или около того между каждой командой.

Я могу написать программу на C или Java, которая делает это, но каков самый простой способ?Обычные языки сценариев (Perl и Python) доступны, если они вам нужны.

Ответы [ 5 ]

3 голосов
/ 23 января 2011

Команды оболочки для одновременного отображения строки из файла в telnet:

cat commands.txt | 
    ( while read line; do echo $line; sleep 1; done ) |
    telnet theserver.somewhere.com 9999
2 голосов
/ 23 января 2011

сначала, если серверный код находится под вашим контролем, тогда я предлагаю вам исправить эту проблему на сервере, потому что нет реальной причины, по которой «слишком быстрое закрытие соединения» могло бы вызвать проблему.

затемЯ бы написал маленький и простой скрипт на Python:

#!/bin/python

import socket,time

s=socket.socket(socket.AF_INET)
s.connect(("theserver.somewhere.com",9999))
s.sendall("1")
time.sleep(1)
s.sendall("2")
time.sleep(1)
s.close()
1 голос
/ 23 января 2011
set s [socket $HOST $PORT]
fconfigure $s -buffering line
puts $s $command1
sleep $no_of_sec
puts $s $command2

Мой TCL немного ржавый, но я думаю, что это самый простой способ. Вы также можете использовать некоторые Tk, чтобы творить чудеса. http://www.tcl.tk/man/tcl/tutorial/tcltutorial.html

0 голосов
/ 24 января 2011

Это проблема, которую Expect должен был решить.

http://expect.sourceforge.net/

0 голосов
/ 23 января 2011

Вы пытались использовать команду Sleep? Я не уверен, что это сработает, так как он может попытаться выполнить эту команду на другом сервере, но стоит попробовать просто выполнить что-то вроде sleep 2, чтобы сделать паузу на несколько секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...