Skip to content

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行)进行返回