単一のデバイスの場合は、低レベルのsocket
対話を処理するソリューションを使用する必要があります... pythonにはpexpect
、exscript、またはparamiko
(sshのみ)などのいくつかがあります...複数のデバイスであり、非同期通信が必要な場合は、 @zeekayの答えを使用してください(ただし、非同期プログラミングは、特にツイストを使用する場合は、まだ慣れていない場合は不快です)。
私はあなたがtelnetしてコマンドのリストを単一のデバイスに送信する方法で質問に答えました...
pexpectで死にかけているプロセスをキャッチする
上記の答えはコードを効率的にしますが、初心者が理解するのはより困難です...次のコードはより単純で、TCP / 23でTelnet接続を確立し、待機し*
、コマンドを送信し、コマンドに応答を送信しますでmydata1
..。
import pexpect as px
import sys
def send_this(child, retcode, COMMAND):
if retcode == 2:
child.sendline(COMMAND)
else:
raise RuntimeError, "Could not complete login, due to socket error"
def expect_this(child, EXPR, timeout = 10):
return child.expect([px.TIMEOUT, px.EOF, EXPR], timeout = timeout)
HOST = '192.168.49.49'
CMD1 = '1I'
PROMPT = '\*' #Note: you might not need the backslash
TIMEOUT = 10
child = px.spawn('telnet %s' % HOST)
retcode = expect_this(child, PROMPT)
send_this(child, retcode, CMD1)
retcode = expect_this(child, PROMPT)
mydata1 = child.before # mydata has the output from CMD1
解決策に関係なく、最も重要なことはタイムアウトを微調整することです。これにより、セルネットワークの長い遅延(私の経験では5秒を超えることもあります)を気にする必要がなくなります。
セルラー通信のもう1つの厄介な問題は、多くの消費者向けデバイスが移動中にIPアドレスを定期的に変更することです(dhcpに依存しているため)...これが発生した場合、TCPでできることはほとんどありません...静的アドレスがある場合、デバイスが新しいIPアドレスをプルすると接続が切断されます。