我想从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
我需要这个打开的终端在后台运行,如何实现?
答案 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。 瞧!不需要复杂的后台终端内容。