您的位置:首页 > 编程语言 > Python开发

Python:通过Socket让远程电脑执行某些命令

2017-09-02 16:00 459 查看
注意,本文是py2。py3可能略有不同。

没得办法,公司用的是py2……

需求。

电脑A想向电脑B、C、D发送指令,然后B、C、D响应指令,执行一些操作。

想法:写一个socket server端,部署在B、C、D上。

然后控制机A,利用socket client向B、C、D发指令,

之后,B、C、D接收响应并执行。

但是,当被控制的机器开启socket server以后,

任意一台机器都可以向它发指令让它响应,

很恐怖啊……

想法:加个白名单,凡是不在白名单列表中的IP,就过滤掉它们的指令。

最后,被控制的电脑还要打开端口,因为有个防火墙!!!!!!!!!

当控制机A发送quit的时候,受控机B、C、D退出socket server。

注意1:'quit' == msg 还是 '"quit"' == msg,到时候可以测试一下。可能不会成功。

注意2:绑定IP一定要绑定cmd中查询到的IP,不要绑定localhost,否则不会成功。

注意3:一定要开启防火墙的端口。不然,无法访问。

注意4:cmd的ping,只能ping IP,不能ping端口。ping是网络层的,port是传输层的。

Socket Server

#-*- coding: utf-8 -*-
import socket
import os
import threading
from urllib import unquote
import ctypes
import datetime

local_ip = '192.168.36.252' # 配置socket server绑定的本地IP
local_port = 43218 # 配置socket server绑定的本地端口

print 'server starting...'

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((local_ip, local_port))
server.listen(5)

# 只响应白名单中的计算机发来的任务
# admin_filter的key()
admin_filter = {}
admin_filter['192.168.36.252'] = {'exe'}
admin_filter['192.168.33.113'] = {'exe'}
admin_filter['127.0.0.1'] = {'exe'}

def exe_prog(msg):

# 路径由空格,加上引号就好了 -_-!!!!!
#    os.system(u"\"C:\Program Files (x86)\TTPlayer\TTPlayer.exe\"".encode("gbk"))
os.system(msg)
# os.system("C:\ProgramData\Anaconda3\envs\py2\python.exe F:\\source_files\\quant\\remote_pc_control\\exe_calc.py")

while 1:

conn, addr = server.accept()
msg = unquote(conn.recv(1024).decode('utf-8'))

peer_name = conn.getpeername()
sock_name = conn.getsockname()

# peer_name是个tuple,peer_name[0]是ip,peer_name[1]是端口号
now_dt = str(datetime.datetime.now())

print u'%s, visitor: %s:%s'%(now_dt, peer_name[0],peer_name[1]) # , sock_name

# 所谓的白名单,管理员权限验证
if peer_name[0] in admin_filter.keys():
# print msg, 'quit'==msg, u'quit'==msg, u'quit'==str(msg), 'quit' == str(msg)
if '"quit"' == msg: # 可能是 'quit' 可能是 '"quit"' …… 自己检验一下
conn.close()
exit(0)

t = threading.Thread(target=exe_prog,args=(msg,))
t.start()

# conn.send('server: I received '+msg)

Socket Client

#-*- coding: utf-8 -*-
import socket
from urllib import quote

def send_cmd(instr):

try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.33.113', 43218))
client.settimeout(5)
client.sendall(quote(instr).encode('utf-8'))

except Exception as e:
print e
finally:
client.close()

msg = u"python.exe c:\\users\\admin\\desktop\\test.py"
send_cmd('notepad')


防火墙

控制面板\系统和安全\Windows 防火墙

点击高级设置

入站规则

添加一个入站规则。开启一个端口,TCP。

开机自动启动

写一个bat文件,然后把bat文件扔到“启动”文件夹里面,就可以开机启动了。

在我的电脑上,这个“启动”文件夹的位置是:

C:\Users\qcy\AppData\Documents and Settings\All Users\「开始」菜单\程序\启动

BAT文件这样写。

先进到某个路径,然后启动xxx

@echo off

F:

F:\source_files\quant\remote_pc_control

start C:\ProgramData\Anaconda3\envs\py2\python.exe sock_server.py

exit

隐藏窗口

最后,如果想让被控制机没有cmd那个黑窗口,可参考以前的文章,

Review:Python:运行时隐藏窗口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息