You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python的Paramiko模块进入Docker容器并重启服务

问题根因

  • docker exec -it 中的 -it 参数用于分配交互式终端,而Paramiko的exec_command默认执行非交互式命令,加该参数会直接导致执行失败
  • 两条命令分开执行属于完全独立的执行上下文:第一条命令仅在宿主机触发了容器内的bash进程就结束了,第二条service opensips restart实际运行在宿主机环境,完全没有进入容器内部

修复方案

不需要单独进入容器bash再执行重启,直接将重启命令拼接在docker exec之后即可单条命令完成需求,正确命令为:docker exec opensips service opensips restart

修复后完整代码

import paramiko as pm
import warnings

def sshOpensips(ip):
    warnings.filterwarnings(action='ignore', module='.*paramiko.*')
    client = pm.SSHClient()
    # 单条命令完成容器内服务重启,无需分两次执行
    restart_command = "docker exec opensips service opensips restart"
    client.set_missing_host_key_policy(pm.AutoAddPolicy())
    pk = pm.RSAKey.from_private_key(open('/home/asad.javed/.ssh/y'))
    try:
        client.connect(ip, username='asad.javed', pkey=pk)
        print("Connection Established")
        stdin, stdout, stderr = client.exec_command(restart_command)
        # 可选:增加错误输出打印方便排查问题
        error_info = stderr.read().decode()
        if error_info:
            print(f"执行失败,错误信息:{error_info}")
        else:
            print("opensips服务重启成功")
    except pm.SSHException:
        print("Connection Failed")
    finally:
        # 确保连接无论是否异常都能关闭
        client.close()
    return True

扩展场景:容器内执行多条命令

如果需要在容器内连续执行多条命令,可以用bash -c包裹所有命令,示例如下:

docker exec opensips bash -c "service opensips stop; sleep 3; service opensips start; ps aux | grep opensips"

内容的提问来源于stack exchange,提问作者Asad Javed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:15:04