Откройте терминал и выполните команду внутри docker, используя python - PullRequest
0 голосов
/ 17 марта 2020

Я хочу запустить как sh команду перенаправления портов (которая должна открываться в новом окне терминала или эквивалентной) из контейнера docker. У меня есть python скрипт , который отлично справляется с этой задачей в моей локальной 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 голосов
/ 18 марта 2020

Итак, вместо того, чтобы открыть терминал, я запустил его в фоновом режиме, используя подпроцесс, как предложено @dstromberg. Сначала я хотел использовать терминальный подход, потому что соединение S SH требовало ответа да / нет для добавления отпечатков пальцев, а затем и пароля. В конце концов, соединение S SH не использовало порт по умолчанию.

Однако все это возможно с использованием подпроцесса. Сначала вам нужно установить 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)

А затем сделайте свое дело, а затем, когда вы захотите убить переадресацию портов:

proc.kill()

Поскольку kill () не работает иногда , вы также можете попробовать:

import signal
import os

p_id = os.getpgid(proc.pid)
os.killpg(p_id, signal.SIGTERM)

Что касается опции -4 в S SH, она заставляет IPv4. И вуаля! Нет необходимости в сложном фоновом терминале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...