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

Linux云环境下Python subprocess调用kubectl exec无法以root执行命令求助

问题根因
  • 两个subprocess.Popen启动的是完全独立的子进程,不存在环境继承关系:第一个进程启动的kubectl容器shell会话,和第二个进程执行的命令完全无关,第二个进程的命令默认执行在本地主机的当前用户环境下,所以你测试ls返回的是本地文件列表,根本没有在容器内运行。
  • 你写的pk.wait、pk.terminate都没有加括号,属于引用方法而非执行方法,这两行代码没有任何实际作用,第一个启动的容器bash进程会一直挂在后台。
  • kubectl exec -it是启动交互式终端的参数,非交互式调用的时候不需要加-it,否则会出现tty相关报错。
  • 你手动执行kubectl exec进入容器默认是root用户,说明容器默认运行用户就是root,只要命令实际在容器内执行就会自动获得root权限,不需要额外做权限切换。
解决方法

方案1:直接将命令作为kubectl exec的参数执行(适合单条/多条简单命令)

直接把要在容器内执行的命令拼接在kubectl exec语句中,不需要单独启动bash进程再下发命令,适配Python2.7的示例代码如下:

import shlex
import subprocess

# 要在容器内执行的命令,替换为你实际要执行的启停进程命令
container_cmd = "ls"
# 拼接完整kubectl命令,注意--用来分隔kubectl参数和容器内命令
kubectl_cmd = "kubectl exec deploy/tss -c tss -- %s" % container_cmd
command_list = shlex.split(kubectl_cmd)

# 执行命令并获取输出
p = subprocess.Popen(command_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()

# 输出结果
if p.returncode == 0:
    print("命令执行成功,输出:")
    print(stdout)
else:
    print("命令执行失败,错误信息:")
    print(stderr)

如果要执行多条命令,可以把命令用bash -c包裹,注意特殊字符转义:

container_cmd = "ls && systemctl stop xxx && systemctl start xxx"
kubectl_cmd = "kubectl exec deploy/tss -c tss -- bash -c '%s'" % container_cmd.replace("'", "'\\''")

方案2:通过stdin向容器bash进程下发多条命令(适合复杂多命令场景)

如果需要批量执行多条命令,可以启动一个持久的bash进程,通过stdin写入命令,适配Python2.7的示例代码如下:

import shlex
import subprocess

kubectl_cmd = "kubectl exec deploy/tss -c tss -- bash"
command_list = shlex.split(kubectl_cmd)

# 启动容器bash进程,绑定stdin/stdout/stderr
p = subprocess.Popen(command_list, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 写入要执行的多条命令,最后加exit退出bash会话
commands = """
ls
ps aux | grep tss
systemctl restart tss
exit
"""
# Python2.7 写入命令并读取输出
p.stdin.write(commands)
p.stdin.close()
stdout = p.stdout.read()
stderr = p.stderr.read()
p.wait()

print("执行输出:", stdout)
print("错误信息:", stderr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:06:05