基础 远程执行ssh命令

简单案例:非线程,基础循环版


<引子> 远程执行ssh命令模块

  • 客户
# windows 的测试命令
# dir:查看某一个文件夹下的子文件名与子文件夹名
# tasklist:查看运行的进程
# ipconfig:查看本顶网卡的ip信息

import subprocess
#  shell=True cmd把字符串转成程序命令
obj = subprocess.Popen('d2ir', shell = True,
                 stdout = subprocess.PIPE,  # 正确管道进入
                 stderr= subprocess.PIPE)  # 错误信息丢入错误管道
print('sudout>:', obj.stdout.read().decode('GBK'))  # Liunx用utf8  windows用gbk!!!  【正确管道】
print('stderr>:', obj.stderr.read().decode('GBK'))  # 【错误管道】

服务端


import socket

import subprocess  # 执行系统命令模块

obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 取socket对象,参数1:套接字类型INET 参数2:数据流类型 TCP协议
obj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 回收端口,防止设定端口被占用
obj.bind(('127.0.0.1', 8084))
obj.listen(5)  # 最大连接数
while True:  # 案例为循环基础版,并非并发版
    conn, ip= obj.accept()  # 等待客户进入
    print('用户接入:',ip)
    while True:
        try:
            cmd = conn.recv(1024)  # 最大字节数1024
            print('接收到用户指令',cmd)
            sub = subprocess.Popen(cmd.decode('GBK'), shell=True,  # windows必须用GBK  linux为utf-8
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            stdout=sub.stdout.read()
            stderr=sub.stderr.read()
            conn.send(stdout+stderr)
        except ConnectionResetError:  # windows系统 因为要报错,所以捕捉异常
            print('该客户断开已断开连接')
            break
    conn.close()
    print('关闭管道')
obj.close()

客户端

import socket

obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
obj.connect(('127.0.0.1', 8084))

while True:
    cmd = input('请输入指令>>>').strip()
    if not cmd:
        continue  # 如果输入的为空,直接跳过
    obj.send(cmd.encode('GBK'))  # windows必须用GBK
    data = obj.recv(1024)
    print(data.decode('GBK')) # windows必须用GBK

obj.close()

猜你喜欢

转载自blog.csdn.net/weixin_42329277/article/details/80565436