簡體   English   中英

Python通過套接字發送命令

[英]Python sending command over a socket

我有點麻煩。 我想創建一個連接到服務器並使用子進程執行命令的簡單程序,然后將結果返回給客戶端。 它很簡單,但我不能讓它工作。 現在這就是我所擁有的:客戶:


import sys, socket, subprocess
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = sys.argv[1]
port = int(sys.argv[2])
socksize = 1024
conn.connect((host, port))
while True:
    shell = raw_input("$ ")
    conn.send(shell)
    data = conn.recv(socksize)
    #msglen = len(data)
    output = data
    iotype = subprocess.PIPE
    cmd = ['/bin/sh', '-c', shell]
    proc = subprocess.Popen(cmd, stdout=iotype).wait()
    stdout,stderr = proc.communicate()
    conn.send(stdout)
    print(output)
    if proc.returncode != 0:
        print("Error")

服務器:


import sys, socket, subprocess
host = ''               
port = 50106
socksize = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Server started on port: %s" %port)
s.listen(1)
print("Now listening...\n")
conn, addr = s.accept()
while True:
    print 'New connection from %s:%d' % (addr[0], addr[1])
    data = conn.recv(socksize)
    cmd = ['/bin/sh', '-c', data]
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE).wait()
    stdout,stderr = cmd.communicate()
    if not data:
        break
    elif data == 'killsrv':
        sys.exit()

威爾羅賓遜危險!

您是否真的希望以明文形式發送命令而無需通過網絡進行身份驗證? 這非常非常危險。

通過SSH與paramiko一起

好吧,我多次聽到這個答案。 我不想使用SSH我只是構建它以了解有關套接字的更多信息。 如果我想將命令發送到系統,我不打算實際使用它。 - 奧斯汀

我無法從你的問題中推斷出這種崇高的追求。 :-)

套接字模塊是posix庫上的一個薄層; 普通插座很乏味,很難做到。 截至今天(2014年),異步I / O和並發性並不是Python最強大的特征之一 - 3.4開始改變它,但是庫會滯后一段時間。 我的建議是花時間學習一些更高級的API,如Twisted( twistedmatrix.com/trac )。 如果您真的對低級別的東西感興趣,請參考項目源代碼。

好的。 關於如何使用扭曲這種類型的東西的任何想法? - 奧斯汀

請看twistedmatrix.com/documents/current/core/examples/#auto2

好吧,我能理解你的沮喪奧斯汀; 我在同一條船上。 然而,試驗和錯誤終於解決了。 希望你在尋找這個:

print "Command is:",command
op = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
if op:
    output=str(op.stdout.read())
    print "Output:",output
    conn.sendall(output)

else:
    error=str(op.stderr.read())
    print "Error:",error
    conn.sendall(error)

目前還不清楚為什么在客戶端和服務器中對同一命令使用subprocess.Popen() 這是我要嘗試做的概述(偽代碼):

客戶

while True:
    read command from user
    send command to server
    wait for and then read response from server
    print response to user

服務器

while True:
    wait for and then read command from client
    if command is "killsrv", exit
    execute command and capture output
    send output to client

您的代碼的問題是這一行(在客戶端和服務器中):

proc = subprocess.Popen(cmd, stdout=iotype).wait()
stdout,stderr = proc.communicate()

您正在調用Popen對象上的wait ,這意味着變量proc獲取一個int(由wait返回)而不是Popen對象。 你可以擺脫wait - 因為communicate在返回之前等待進程結束,而你還沒有檢查退出代碼,你不需要調用它。

然后,在您的客戶端中,我認為您甚至不需要子進程調用,除非您正在運行服務器正在發回的某個命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM