Python学习---远程执行命令

原则:发送一个接受一个

原理:发送执行命令的大小给客户端,客户端根据接受的大小判断是否全部接收了服务器sendall()发送的全部

利用send发送的全部数据都是bytes类型的,需要进行字符编码的转换,因为中文环境,所以需要转换GBK查看

客户端:

# 客户端
import socket

# family=AF_INET,   代表使用IPV4的IP协议
# type=SOCK_STREAM  代表使用TCP协议进行连接
client = socket.socket()
ip_addr = (‘127.0.0.1‘, 9999)
try:
    client.connect(ip_addr)
    exit_flag = True
    while exit_flag:
        # 发送一定要有接收
        inp = input(‘>>>:‘)
        if inp != ‘bye‘:
            client.send(bytes(inp, ‘utf-8‘))
            exit_flag = True
        else:
            client.send(bytes(inp, ‘utf-8‘))
            exit_flag = False
        result_len = int(str(client.recv(1024), encoding=‘utf-8‘)) # 接受服务器端发送的数据大小
        print(‘客户端接收的大小为:‘, result_len)
        data_size = bytes()
        while len(data_size) != result_len:
            info = client.recv(1024)    # 最大接收1024K数据,# 传送/接收的数据一定是byte类型
            data_size += info
        print(‘客户端:‘, str(data_size, ‘gbk‘)) # Win7系统就是GBK编码返回的数据
except Exception as e:
    print(‘客户端关闭连接‘, e)
finally:
    client.close()

服务端:

# 服务端
import socket
import subprocess
# family=AF_INET,   代表使用IPV4的IP协议
# type=SOCK_STREAM  代表使用TCP协议进行连接
server = socket.socket()  # 创建socket
ip_addr = (‘127.0.0.1‘, 9999)  # 1024之前的端口,默认是OS使用
server.bind(ip_addr)           # 要求必须是一个元组
server.listen(3)               # 开始监听传入连接。在拒绝连接之前,可以挂起的最大连接数量。
while True:
    conn, addr = server.accept() # 接受连接并返回(conn,address)
                                 # 其中conn是新的套接字对象[客户端],可以用来接收和发送数据。
                                 # address是连接客户端的地址。
    exit_flag = True
    while exit_flag:
        print(‘当前连接对象‘, addr)
        # 发送一定要有接收
        data = conn.recv(1024)
        print(‘服务器:‘, str(data, ‘utf-8‘))
        obj = subprocess.Popen(str(data, ‘utf-8‘), shell=True, stdout=subprocess.PIPE)
        cmd_result = obj.stdout.read()  # 编码用GBK,默认在当前文件所在的文件路径
        conn.sendall(bytes(str(len(cmd_result)), encoding=‘utf-8‘))   # 发送数据大小,int不能直接转换为bytes
        print(‘服务器发送的大小为:‘, len(cmd_result))  # 某种程度上解决了粘包现象
        conn.sendall(cmd_result)        # 发送全部的数据
server.close()

注意:  粘包现象: 在服务器端连续send()的时候,2个send直接会等待很短的时间,所以导致传递过去的len会报错,因为不能转换为int型,可以利用Time.sleep解决,也可以遵循一收一发的原则,发送一个以后在发送一次解决。

原文地址:https://www.cnblogs.com/ftl1012/p/9383739.html

时间: 2024-11-07 23:37:22

Python学习---远程执行命令的相关文章

python案例远程执行命令

------类似于cmd的功能,client执行命令,server发命令结果发送到client -----------server.py------------------- import subprocess#subprocess.Popen,主要用Popen这个类实现shell import socketsk=socket.socket()print(sk)address=('127.0.0.1',8003)sk.bind(address)sk.listen(3)print('waiting

python批量远程执行命令

#!/usr/bin/env python #Kiss Python ############## ##### ip.list ################################# #     172.16.13.118:root:centos:hostname:                                                       # #     172.16.5.114:root:centos:hostname:whoami:w:ifcon

通过python socket远程执行命令,并返回值

#!/usr/bin/env python#  TCP-Serverimport socketimport subprocesssk_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)sk_obj.bind(('127.0.0.1',8000))sk_obj.listen(5)while True:    conn,ipaddr = sk_obj.accept()    print ('connection from ip: %s' %

python之实现批量远程执行命令(堡垒机)

python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对python的django还没有了解,并且对于HTML和JS这类开发学习还没有涉及,所以我说我做些后台的实现,前端就交给我的同学做.不扯淡了,下面说下我做批量执行的思路. 用到的模块:paramiko 功能:很简单就是批量执行命令,类似于ansible,本来想用Fabric,但是想一想还是用paramiko,

python模块paramiko的上传下载和远程执行命令

#!/usr/bin/python # -*- coding: utf-8 -*- import paramiko,os,datetime server_ip = '192.168.1.123' server_user = 'root' server_passwd = '10241010' server_port = 22 #local_dir='C:\Python27' #remote_dir='/soft2/nba/' def ssh_connect(): ssh = paramiko.SS

python 实现ssh远程执行命令 上传下载文件

使用密码远程执行命令 [[email protected] script]# cat daramiko_ssh.py  #!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'gaogd' import paramiko import sys,os host = sys.argv[1] user = 'root' password = 'ddfasdsasda2015' cmd = sys.argv[2] s = paramiko.SSH

python 网络编程(远程执行命令与粘包)

远程执行命令 先来学习一个新模块 , 一会用到的.. 新模块: subprocess 执行系统命令 r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) subprocess.Popen(a,b,c,d) a: 要执行的系统命令(str) b: shell = True 表示确定我当前执行的命令为系统命令 c: 表示正确信息的输出管道 d: 表示错误信息的输出管道 下边直接上代码,

一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

作为一个后台程序猿,经常需要把一堆程序集(DLL)或者应用程序(EXE)复制到多个服务器上,实现程序的代码逻辑更新,用以测试新的功能或改动逻辑.这里给大家介绍一个自己实现的PowerShell脚本,方便大家替换DLL或者EXE到多个Windows机器上. 一.   脚本用途 用于方便复制多个文件到多个服务器上. 二.   脚本功能 脚本的主要功能如下: 支持通过最后修改时间过滤文件,设定时间之前的文件不进行复制操作(逻辑设计源于Rebuild代码后只替换新Build出来的有改动的文件): 支持多

day8-套接字sock 实现SSH远程执行命令功能

复习 #面向对象编程#类:#对象#实例化 :从一个类到产生一个对象的过程    #对象 = 类名()   #__init__初始化方法,是为了给一个具体的对象放一些初识的属性#在类中:    # 静态属性 直接定义在类中的属性,使用静态属性:类名.对象名都可以调用    # 动态属性 就是方法 就是定义在类中的函数 默认传一个self# class Person:#     money = 100# sister = Person()# father = Person()# Person.mon