Como abrir remotamente o gedit com o URL do SFTP no Gnome através do SSH?

1

Minha configuração é estranha e não posso alterá-la agora. Eu tenho duas máquinas:

  • local-machine : é o meu desktop que roda o Ubuntu com o Gnome
  • remote-machine : é uma máquina virtual, também rodando Ubuntu mas sem X

Em ambas as máquinas, tenho minhas chaves SSH privadas e públicas.

Eu preciso executar o SSH de remote-machine a local-machine e executar o gedit (em local-machine , sob o padrão $ DISPLAY), mas abrindo um arquivo em remote-machine throught SFTP. Algo parecido com isto:

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

O comando acima não funciona. O gedit mostra esta mensagem:

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

Observe que:

  • /some/file existe em remote-machine .
  • Eu posso SSH normalmente de remote-machine a local-machine usando minha chave SSH sem problemas!
  • Eu posso executar o comando DISPLAY=:0.0 gedit sftp://remote-machine/some/file em um terminal em local-machine e o gedit abre o arquivo em remote-machine sem nenhum problema - mas o terminal no qual eu executei o comando está rodando em DISPLAY: 0 (realmente, é gnome-terminal ).
  • Eu também tentei a opção -t do cliente SSH (para forçar a alocação do pseudo-tty), mas não funcionou.
  • Se eu tentar executar DISPLAY=:0.0 gedit sftp://remote-machine/some/file em local-machine , mas sob um tty (por exemplo, em tty1 , pressionando <Ctrl>+<Alt>+<F1> ), isso não funcionará - recebo o mesmo erro ao executar a partir de remote-machine .

Descobri que, se eu passar a variável de ambiente DBUS_SESSION_BUS_ADDRESS com um valor correto, funcionará! Então, se eu fizer algo assim:

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

e depois:

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

funciona! O problema é que eu não estou no local-machine , então não consigo obter o valor correto para essa variável env. Existe alguma outra maneira de fazer isso funcionar?

    
por Álvaro Justen 02.04.2012 / 06:08

1 resposta

1

Eu encontrei uma outra maneira de obter o ambiente vars em vez de passar o env inteiro: envie o PID do processo que iniciou a sessão SSH de local para remoto para a máquina remota, para que possamos obter todos os vars de ambiente desse PID posteriormente .

Quando executo o SSH da máquina remota para a local, executo um comando para obter o ambiente desse PID (usando /proc/<PID>/environ ) e, em seguida, executo o comando no mesmo ambiente. Observe que isso funciona apenas com o Linux (ou SOs que possuem /proc ).

É algo assim:

Envia o PID de execução do bash na máquina local para um arquivo no remoto:

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

Crie a conexão:

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

Execute o SSH no controle remoto para executar um comando no local:

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