打开终端并使用python在docker内部运行命令

时间:2020-03-17 19:15:56

标签: python bash docker

我想从Docker容器中运行ssh端口转发命令(应在新的终端窗口或等效窗口中打开)。我有一个python script,可以在我的本地ubuntu上做到完美。

import os
command = "ssh -4 -N -L 322:localhost:322 toing@localhost -p 654"
os.system("gnome-terminal -e 'bash -c \"" + command + ";bash\"'")

但是,当我在Docker容器中尝试此命令时,出现以下错误:

选项“ -e”已被弃用,并可能在更高版本的gnome-terminal中删除。

使用“-”终止选项,并在命令行之后执行。

无法连接到辅助功能总线:无法连接到套接字/ tmp / dbus-XETYD1whMB:连接被拒绝

无法加载模块“ canberra-gtk-module”

无法加载模块“ canberra-gtk-module”

我正在使用以下命令运行docker映像(该显示确实用于脚本中的另一个进程):

docker run -it  -e DISPLAY=$DISPLAY  -v /tmp/.X11-unix:/tmp/.X11-unix -p 8090:8090 xxxxxxx

我还尝试在容器运行时在容器内的python终端内运行相同的命令,但得到以下响应:

>>> os.system("gnome-terminal -e 'bash -c \"" + command + ";bash\"'")
# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
# Use “-- ” to terminate the options and put the command line to execute after it.
# Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-XETYD1whMB: Connection refused
# Failed to load module "canberra-gtk-module"
# Failed to load module "canberra-gtk-module"
# Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: Failed to execute child process “dbus-launch” (No such file or directory)
256

我需要这个打开的终端在后台运行,如何实现?

1 个答案:

答案 0 :(得分:0)

因此,我没有打开终端,而是使用@dstromberg建议的子进程在后台运行它。 我最初想使用终端方法,因为SSH连接要求是/否添加指纹,然后再输入密码。毕竟,SSH连接没有使用默认端口。

但是,使用子过程都可以实现。 首先,您需要使用{p1}安装

sshpass

然后,

sudo apt-get install sshpass

然后做您的工作,然后在您想终止端口转发时:

import subprocess
command = ['sshpass', '-p', 'imnottellingyou', 'ssh', '-oStrictHostKeyChecking=accept-new',  '-4', '-N', '-L',  '55:localhost:55', 'toing@localhost', '-p', '654',]
proc = subprocess.Popen(command, close_fds=True)
# now do whatever you want (the code, please)

由于kill()无效sometimes,您也可以尝试:

proc.kill()

对于SSH中的-4选项,它将强制使用IPv4。 瞧!不需要复杂的后台终端内容。