python控制服务器

本文介绍SSH协议的基本概念,包括其在安全传输、远程执行命令中的应用,以及如何在Win10中通过公钥和私钥进行安全登录。此外,详细讲解了Python中subprocess模块的使用,包括run()和Popen()方法,演示如何通过这些方法执行系统命令并获取输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSH
安全的shell secure shell
一种协议:传输,用户人认证,连接
连接服务器
加密传输,远程执行命令
win10 已经内置支持
使用公钥+私钥,安全登录

在这里插入图片描述
在终端中输入ssh-keygen 默认不输入密码自动生成公钥和私钥

在这里插入图片描述
将id_rsa.pub 放到linux服务器上
本地id_rsa.pub —>云端authorized_keys

vim ~/.ssh/authorized_keys

在本地终端使用如下命令

ssh root@192.168.1.105

第一次登陆等待确认即可连接
第二次及以后会自动连接

使用subprocess操作 命令

两个必回的方法

subprocess.run()
根据参数执行命令,返回completedProcess_instance
subprocess.Popen
下面是ipython语言

import os
os.system('pwd')

os.system(‘ls -l’)

cmd = "ls -l"
os.system(cmd)
import subprocess
subprocess.run('ls')
subprocess.run('pwd')
subprocess.run('df  -h')
subprocess.run(['df','-h'])
subprocess.run('df -h',shell=True)                                      
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   11G   27G  28% /
devtmpfs        911M     0  911M   0% /dev
tmpfs           920M     0  920M   0% /dev/shm
tmpfs           920M  400K  920M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
tmpfs           184M     0  184M   0% /run/user/0
Out[37]: CompletedProcess(args='df -h', returncode=0)

cp = subprocess.run(['df','-h'])
cp.stdout#无输出
cp.returncode#输出0
subprocess.Popen?
subprocess.Popen("ls")

In [47]: subprocess.Popen('ls')                                                  
1.txt				 gyz	     my      wmy
anaconda3			 hdvbncbhsc  python  这个是阿里云服务器
Anaconda3-5.3.1-Linux-x86_64.sh  index.jsp   tools
Out[47]: <subprocess.Popen at 0x7f5759e96cc0>
In [48]: subprocess.Popen(['ls','-l'])                                           
total 652364
-rw-r--r--  1 root root        48 Dec 31 17:52 1.txt
drwxr-xr-x 23 root root      4096 Dec 18 10:57 anaconda3
-rw-r--r--  1 root root 667976437 Nov 20 04:00 Anaconda3-5.3.1-Linux-x86_64.sh
drwxr-xr-x  2 root root      4096 Dec 27 13:38 gyz
-rw-r--r--  1 root root      1072 Dec 20 20:49 hdvbncbhsc
-rw-r--r--  1 root root        17 Nov  3 17:29 index.jsp
drwxr-xr-x  4 root root      4096 Dec 19 17:06 my
drwxr-xr-x  5 root root      4096 Jan 18 10:47 python
drwxr-xr-x  2 root root      4096 Nov  4 19:37 tools
drwxr-xr-x  2 root root      4096 Dec 31 16:47 wmy
-rw-r--r--  1 root root         0 Jan 28 12:02 这个是阿里云服务器
Out[48]: <subprocess.Popen at 0x7f575879e6a0>

cp.stdout
#无输出结果
In [50]: cp = subprocess.run(['df','-h'],stdout=subprocess.PIPE)                 

In [51]: cp.stdout                                                               
Out[51]: b'Filesystem      Size  Used Avail Use% Mounted on\n/dev/vda1        40G   11G   27G  28% /\ndevtmpfs        911M     0  911M   0% /dev\ntmpfs           920M     0  920M   0% /dev/shm\ntmpfs           920M  400K  920M   1% /run\ntmpfs           920M     0  920M   0% /sys/fs/cgroup\ntmpfs           184M     0  184M   0% /run/user/0\n'
cp = subprocess.run(['df','-h'], stdout=subprocess.PIPE, encoding='utf8')
cp.stdout
cp = subprocess.run(['ls','-l'], stdout=subprocess.PIPE, encoding='utf8')
cp.stdout
cp.stdout.splitlines()
In [52]: cp.stdout.splitlines()                                                  
Out[52]: 
[b'Filesystem      Size  Used Avail Use% Mounted on',
 b'/dev/vda1        40G   11G   27G  28% /',
 b'devtmpfs        911M     0  911M   0% /dev',
 b'tmpfs           920M     0  920M   0% /dev/shm',
 b'tmpfs           920M  400K  920M   1% /run',
 b'tmpfs           920M     0  920M   0% /sys/fs/cgroup',
 b'tmpfs           184M     0  184M   0% /run/user/0']



In [53]: cp = subprocess.run('ls -l', stdout=subprocess.PIPE, encoding='utf8', shell=True)                                                               
In [56]: cp.stdout.splitlines()                                                  
Out[56]: 
['total 652364',
 '-rw-r--r--  1 root root        48 Dec 31 17:52 1.txt',
 'drwxr-xr-x 23 root root      4096 Dec 18 10:57 anaconda3',
 '-rw-r--r--  1 root root 667976437 Nov 20 04:00 Anaconda3-5.3.1-Linux-x86_64.sh',
 'drwxr-xr-x  2 root root      4096 Dec 27 13:38 gyz',
 '-rw-r--r--  1 root root      1072 Dec 20 20:49 hdvbncbhsc',
 '-rw-r--r--  1 root root        17 Nov  3 17:29 index.jsp',
 'drwxr-xr-x  4 root root      4096 Dec 19 17:06 my',
 'drwxr-xr-x  5 root root      4096 Jan 18 10:47 python',
 'drwxr-xr-x  2 root root      4096 Nov  4 19:37 tools',
 'drwxr-xr-x  2 root root      4096 Dec 31 16:47 wmy',
 '-rw-r--r--  1 root root         0 Jan 28 12:02 这个是阿里云服务器']


check=True


In [63]: cp = subprocess.run('df -dsfh', stdout=subprocess.PIPE, encoding='utf8',
    ...:  shell=True, check=True)                                                
df: invalid option -- 'd'
Try 'df --help' for more information.
---------------------------------------------------------------------------
CalledProcessError                        Traceback (most recent call last)
<ipython-input-63-abf39d784c7e> in <module>
----> 1 cp = subprocess.run('df -dsfh', stdout=subprocess.PIPE, encoding='utf8', shell=True, check=True)

~/anaconda3/envs/gyz/lib/python3.7/subprocess.py in run(input, capture_output, timeout, check, *popenargs, **kwargs)
    479         if check and retcode:
    480             raise CalledProcessError(retcode, process.args,
--> 481                                      output=stdout, stderr=stderr)
    482     return CompletedProcess(process.args, retcode, stdout, stderr)
    483 

CalledProcessError: Command 'df -dsfh' returned non-zero exit status 1.

重点
如下的命令 在运行6之后紧接着运行7,再一次运行8的时候结果就已经丢失了

In [6]: proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE)              
In [7]: proc.stdout.read().decode('utf8')                                        
Out[7]: 'total 652364\n-rw-r--r--  1 root root        48 Dec 31 17:52 1.txt\ndrwxr-xr-x 23 root root      4096 Dec 18 10:57 anaconda3\n-rw-r--r--  1 root root 667976437 Nov 20 04:00 Anaconda3-5.3.1-Linux-x86_64.sh\ndrwxr-xr-x  2 root root      4096 Dec 27 13:38 gyz\n-rw-r--r--  1 root root      1072 Dec 20 20:49 hdvbncbhsc\n-rw-r--r--  1 root root        17 Nov  3 17:29 index.jsp\ndrwxr-xr-x  4 root root      4096 Dec 19 17:06 my\ndrwxr-xr-x  5 root root      4096 Jan 18 10:47 python\ndrwxr-xr-x  2 root root      4096 Nov  4 19:37 tools\ndrwxr-xr-x  2 root root      4096 Dec 31 16:47 wmy\n-rw-r--r--  1 root root         0 Jan 28 12:02 这个是阿里云服务器\n'

In [8]: proc.stdout.read().decode('utf8')                                                                                                                    
Out[8]: ' '


###  几个最重要的参数
###  三个选修方法
###  取得控制台结果
###  协程里的subprocess

paramiko连接服务器

### 实现远程控制服务器的串口通信 Python 提供了多种方式实现远程控制服务器的串口通信。主要可以通过串口通信模块(如 `pySerial`)结合远程连接工具(如 `paramiko`、`fabric`)来实现远程控制功能。以下是几种实现方法。 #### 使用 `pySerial` 进行本地串口通信 在本地环境中,可以通过 `pySerial` 模块与串口设备进行通信。例如,可以发送和接收串口数据,并对串口进行配置。 ```python import serial import time # 配置串口参数 port = "COM1" bps = 9600 timeout = 0.1 # 打开串口 ser = serial.Serial(port, bps, timeout=timeout) # 发送数据 def send_command(hex_command): try: command = bytes.fromhex(hex_command) length = ser.write(command) print("Send length:", length) except Exception as error: print("Error occurred:", error) # 接收数据 def receive_command(): data = ser.readline().hex().strip() if data: print("Received:", data) # 循环发送数据 while True: hex_command = '24 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 03 06 66 2A' send_command(hex_command) receive_command() time.sleep(10) ``` 该方法适用于本地串口通信,但无法直接用于远程控制[^3]。 #### 结合 `paramiko` 实现远程服务器串口通信 如果需要在远程服务器上执行串口通信任务,可以通过 `paramiko` 在远程服务器上运行串口通信脚本。例如,将串口通信脚本部署到远程服务器,并通过 SSH 协议执行脚本。 ```python import paramiko # 创建 SSH 客户端 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接远程服务器 ssh.connect(hostname='192.168.0.161', port=22, username='root', password='Safe@123') # 执行远程脚本 stdin, stdout, stderr = ssh.exec_command('python /path/to/serial_script.py') # 输出执行结果 print(stdout.read().decode()) # 关闭连接 ssh.close() ``` 通过这种方式,可以在远程服务器上运行串口通信脚本,从而实现远程控制功能[^1]。 #### 使用 `fabric` 简化远程操作 `fabric` 是一个基于 `paramiko` 的高层封装库,提供更简洁的接口用于远程操作。可以通过 `fabric` 执行远程服务器上的串口通信脚本。 ```python from fabric import Connection # 连接远程服务器 c = Connection(host='192.168.0.161', user='root', connect_kwargs={"password": "Safe@123"}) # 执行远程脚本 result = c.run('python /path/to/serial_script.py', hide=True) # 输出执行结果 print(result.stdout) ``` 此方法简化了远程操作流程,适合批量执行串口通信任务[^4]。 #### 串口通信的流控制 在串口通信中,流控制是一个重要的功能,用于管理数据传输的速度和方向。Python 的 `pySerial` 模块支持以下几种流控制方式: - 无流控制(None) - 硬件流控制(Hardware):使用硬件信号线(如 RTS/CTS)进行流控制 - 软件流控制(Software):使用特定的控制字符(如 XON/XOFF)进行流控制 可以通过设置 `rtscts`、`xonxoff` 参数实现流控制: ```python ser = serial.Serial(port, bps, timeout=timeout, rtscts=True) # 硬件流控制 ser = serial.Serial(port, bps, timeout=timeout, xonxoff=True) # 软件流控制 ``` 流控制可以有效避免数据丢失或混乱,提高通信的稳定性[^2]。 #### 安全性与密钥认证 在生产环境中,建议使用 SSH 密钥认证代替密码认证,以提高安全性。可以通过 `paramiko` 或 `fabric` 配置使用私钥文件进行连接。 ```python from fabric import Connection c = Connection( host='192.168.0.161', user='root', connect_kwargs={"key_filename": "/path/to/private_key"} ) ``` 此方式避免了在脚本中明文存储密码,提高了远程执行的安全性[^4]。 ### 相关问题 1. 如何使用 Python 实现远程服务器的串口数据采集与分析? 2. 如何通过 Python 实现远程串口设备的自动诊断与故障排查? 3. 如何在 Python 中实现远程串口通信的加密与数据安全传输? 4. 如何使用 Python 实现远程串口设备的多线程控制与管理? 5. 如何在 Python 中实现远程串口通信的实时监控与日志记录?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值