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
相关产品推荐
相关产品推荐

