如何使用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
相关产品推荐
相关产品推荐

