Paramiko
https://www.paramiko.org/
用于连接远程服务器并执行命令
安装
python
pip install paramiko
代码示例
python
import os
import paramiko
import traceback
def ssh_op(cmds, timeout=60):
'''ssh 连接 op 执行命令
多条命令之间都是独立的,没有上下文关系
'''
try:
key_filename = os.path.join(
os.path.dirname(os.path.realpath(__file__)), 'id_rsa', 'op')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(
'10.110.199.12', 22, 'op',
key_filename=key_filename, passphrase='123456',
timeout=timeout, banner_timeout=600
)
output = []
for cmd in cmds:
stdin, stdout, stderr = ssh.exec_command(cmd, timeout=timeout)
try:
output.append((stdout.read().decode(), stderr.read().decode()))
except Exception:
output.append((stdout.read(), stderr.read()))
ssh.close()
return output
except Exception as e:
if ssh:
ssh.close()
print(traceback.format_exc())
raise Exception(f'SSH 异常报错:{e}')
def run_cmds(ip, cmds, desc='命令描述', timeout=60):
"""通用运行命令"""
if not cmds:
return
cmd = 'ssh -o StrictHostKeyChecking=no {} "{}"'.format(ip, ';'.join(cmds))
print(cmd)
res = ssh_op([cmd], timeout)
return res
- 通过指定的公私钥来进行免密连接
常见问题
运行命令卡死问题
- 现象:在远程服务器上直接运行代码可正常结束;使用 paramiko 调用运行时出现卡死
- 原因:极有可能是命令运行时输出太多太大导致卡死
- 解决方案:将命令的标准输出与标准错误写入日志文件(
> xxx.log 2>&1
),然后仅取部分日志(比如最后100行)进行返回