远程命令执行 Python

0 投票
1 回答
947 浏览
提问于 2025-04-18 07:45

为了学习,我搭建了一个服务器,可以在Windows上执行远程命令——或者说,我尝试这么做。出于某种原因,命令行不认我发送的一些命令,但其他的却能正常工作。例如,当我发送命令 echo "Hello World!!!" 时,正如预期的那样,会弹出一个cmd窗口,显示“Hello World!!!”。这没问题。但是,当我发送命令 shutdown /s /t 30 时,它却给我显示了不正确的语法或关机命令的帮助信息。而当我发送命令 msg * "Hello World" 时,它告诉我“msg”不是一个被识别的内部或外部命令、可操作的程序或批处理文件。以下是我的服务器代码:

import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_address = ('', 4242)
sock.bind(server_address)

sock.listen(1)

connection, client_address = sock.accept()
print("Connection established with %s " % str(client_address))
while True:
    command = input("Enter a command: ")
    connection.send(bytes(command, 'UTF-8'))
    confirm = connection.recv(128)
    if confirm == "yes":
        print("[+] Command executed successfully.")
    else:
        print("[-] Command failed to execute!!!")

这是我的客户端代码:

import socket
import sys
import os

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_address = ('', 42042)
sock.bind(server_address)

sock.connect(('192.168.1.5', 4242))

while True:
    command = str(sock.recv(1024))
    try:
        os.system(command[2:]) # an odd thing, the commands somehow came out prefaced with "b'". Ideas?
        sock.send(bytes("yes", 'UTF-8'))
    except:
        sock.send(bytes("no", 'UTF-8'))

所以就是这样。只有一些命令出现问题让我感到很困惑。有没有人能给点建议?还有,那个“b'”是怎么回事?

1 个回答

0

str(sock.recv(1024)) 这种写法并不是把字节对象转换成字符串的正确方法,你应该使用 sock.recv(1024).decode('UTF-8') 这个方法。

你可以查看关于字节解码的文档,地址是 https://docs.python.org/3.4/library/stdtypes.html#bytes.decode

或者你也可以看看这个相关的问题 在Python 3中将字符串转换为字节的最佳方法是什么?

撰写回答