1

Мои настройки странные, и я не могу изменить их сейчас. У меня есть две машины:

  • local-machine: это мой рабочий стол с Ubuntu и Gnome
  • remote-machine: это одна виртуальная машина, на которой также работает Ubuntu, но без X

На обеих машинах у меня есть свои закрытые и открытые ключи SSH.

Мне нужно запустить SSH с remote-machine на local-machine и запустить gedit (на local-machine , по умолчанию $ DISPLAY), но открыть файл на remote-machine через SFTP. Что-то вроде этого:

myuser@remote-machine:~$ ssh local-machine "DISPLAY=:0.0 gedit sftp://remote-machine/some/file"

Команда выше не работает. Gedit показывает это сообщение:

Could not open the file sftp://remote-machine/some/file.
gedit cannot handle sftp: locations.

Обратите внимание, что:

  • /some/file существует на remote-machine .
  • Я могу без проблем использовать SSH с remote-machine на local-machine используя мой ключ SSH!
  • Я могу запустить команду DISPLAY=:0.0 gedit sftp://remote-machine/some/file в терминале на local-machine и gedit без проблем открывает файл на remote-machine - но на терминале, в котором я выполнил команду работает в режиме DISPLAY:0 (действительно, это gnome-terminal).
  • Я также пробовал опцию -t клиента SSH (для принудительного выделения псевдо-tty), но это не сработало.
  • Если я попытаюсь запустить DISPLAY=:0.0 gedit sftp://remote-machine/some/file на local-machine но под tty (например, в tty1 , нажав <Ctrl>+<Alt>+<F1>), то он не работает - я получаю ту же ошибку при запуске с remote-machine .

Я обнаружил, что если я передаю переменную окружения DBUS_SESSION_BUS_ADDRESS с правильным значением, это работает! Итак, если я сделаю что-то подобное:

myuser@local-machine:~$ env | grep DBUS_SESSION_BUS_ADDRESS > env.txt
myuser@local-machine:~$ scp env.txt remote-machine:

а потом:

myuser@remote-machine:~$ ssh local-machine "DISPLAY=:0.0 $(cat env.txt) gedit sftp://remote-machine/some/file"

оно работает! Проблема в том, что я не на local-machine поэтому я не могу получить правильное значение для этой переменной env. Есть ли другой способ сделать эту работу?

1 ответ1

1

Я нашел другой способ получения переменных среды вместо передачи всех переменных env: отправьте PID процесса, который начал сеанс SSH, с локального на удаленный компьютер, чтобы удаленный компьютер, чтобы мы могли получить все переменные среды из этого PID позже.

Когда я запускаю SSH с удаленного на локальный компьютер, я выполняю команду, чтобы получить среду из этого PID (используя /proc/<PID>/environ), а затем выполняю команду с этой средой. Обратите внимание, что это работает только с Linux (или операционными системами, имеющими /proc).

Это что-то вроде этого:

Посылает PID запуска bash на локальном компьютере в файл на удаленном компьютере:

user@local-machine:~$ ssh other-user@remote-machine "echo $$ > \$HOME/.local_bash_pid"

Создайте соединение:

user@local-machine:~$ ssh other-user@remote-machine

Запустите SSH на удаленном компьютере, чтобы выполнить команду на локальном компьютере:

other-user@remote-machine:~$ ssh user@local-machine "source <(cat /proc/$(cat $HOME/.local_bash_pid)/environ | tr '\0' ' ') && command-I-want-to-execute-on-that-environment"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .