0
我知道那里有类似的问题,但是我遇到了这个具体示例的问题,并没有找到一个好的答案。我正在尝试为dar设置一个远程备份服务器,along these lines。我询问了一个separate question关于通过使用subprocess.Popen调用netcat来做到这一点,但我更愿意设置套接字并尽可能使用python执行所有管道。会有几个演出转移,所以我不能只是先读取所有的输入,然后传递它。python pipe子进程在套接字上的输入/输出
问题是服务器似乎没有读取数据。
此刻,我有下面的代码:
from socket import socket, AF_INET, SOCK_STREAM
import sys
import SocketServer
import subprocess
class DarHandler(SocketServer.BaseRequestHandler):
def handle(self):
print('entering handler')
data = self.request.recv(1024).strip()
print('got: ' + data)
if data == 'xform':
s = socket(AF_INET, SOCK_STREAM)
s.bind(('',0))
myaddr, myport = s.getsockname()
print('bound new socket to {0}:{1}'.format(myaddr, myport))
self.request.send(str(myport))
s.listen(1)
conn, remoteaddr = s.accept()
print('accepted connection from {0}:{1}'.format(*remoteaddr))
xform_input = conn.makefile('rb',0)
proc = subprocess.Popen(
['/usr/bin/dar_xform', '-s', '10k', '-', 'archives/sockbackup',],
stdin=xform_input
)
return_code = proc.wait()
print('dar_xform returned {0}'.format(return_code))
conn.close()
self.request.send(str(return_code))
else:
self.request.send('bad request')
print('send result, exiting handler')
server_address = ('localhost', 18010)
def server():
server = SocketServer.TCPServer(server_address, DarHandler)
print('listening')
server.serve_forever()
def client():
sock = socket(AF_INET, SOCK_STREAM)
print('connecting to server')
sock.connect(('localhost', 18010))
print('connected, sending request')
sock.send('xform')
print('waiting for response')
port = sock.recv(1024)
print('got: ' + port)
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', int(port)))
print('connected to dar_xform port')
dar_output = s.makefile('wb',0)
return_code = subprocess.call(
['/usr/bin/dar', '-B', 'config/test.dcf', '-c', '-',],
stdout=dar_output
)
print('dar returned {0}'.format(return_code))
s.close()
result = sock.recv(1024)
print('received: ' + result)
sock.close()
print('socket closed, exiting')
if __name__ == "__main__":
if sys.argv[1].startswith('serv'):
server()
else:
client()
我从服务器端输出以下,当我运行客户端:
listening entering handler got: xform bound new socket to 0.0.0.0:41658 accepted connection from 127.0.0.1:42440
然后,它只是坐在那里。同时,dar
客户端和客户端上运行的是停留等待服务器的响应:
connecting to server connected, sending request waiting for response got: 41300 connected to dar_xform port -------------------------------------------- 53 inode(s) saved with 0 hard link(s) recorded 0 inode(s) changed at the moment of the backup 0 inode(s) not saved (no inode/file change) 0 inode(s) failed to save (filesystem error) 1 inode(s) ignored (excluded by filters) 0 inode(s) recorded as deleted from reference backup -------------------------------------------- Total number of inodes considered: 54 -------------------------------------------- EA saved for 0 inode(s) -------------------------------------------- dar returned 0
好想法,但它仍然失败。我编辑了这个问题来包含它们。 –
这可能是一个愚蠢的问题,但是你确定'dar_xform'在'/ usr/bin'中吗? – larsks
是的。眼前的问题是一个缺少逗号,我通过将shell = True添加到Popen而被捕获。我看到它正在寻找通过连接两个字符串获得的'/ usr/bin/dar_xform-s'。 13对眼睛错过了那一个。我已经更新了这个问题。 –