I have an X instance running on my server computer, and on occasion I connect to it remotely via TeamViewer. Once in a while TeamViewer crashes and I cannot restart it remotely. Is there a way to login to my running X instance through ssh, and restart TeamViewer remotely?
2 Answers
An X program needs two pieces of information in order to connect to an X display.
It needs the address of the display, which is typically
:0
when you're logged in locally or:10
,:11
, etc. when you're logged in remotely (but the number can change depending on how many X connections are active). The address of the display is normally indicated in theDISPLAY
environment variable.It needs the password for the display. X display passwords are called magic cookies. Magic cookies are not specified directly: they are always stored in X authority files, which are a collection of records of the form “display
:42
has cookie123456
”. The X authority file is normally indicated in theXAUTHORITY
environment variable. If$XAUTHORITY
is not set, programs use~/.Xauthority
.
You're trying to act on the windows that are displayed on your desktop. If you're the only person using your desktop machine, it's very likely that the display name is :0
. Finding the location of the X authority file is harder, because with gdm as set up under Debian squeeze or Ubuntu 10.04, it's in a file with a randomly generated name. (You had no problem before because earlier versions of gdm used the default setting, i.e. cookies stored in ~/.Xauthority
.)
If this is a one-shot, you can detect the values of DISPLAY
and XAUTHORITY
from a running process. This is awkward to automate. You have to figure out the PID of a process that's connected to the display you want to work on, then get the environment variables from /proc/$pid/environ
(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
).
A long-term, automatic solution is to copy cookies when you log into your desktop X session. Add the following lines to ~/.profile
(or some other script that is read when you log in):
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
Then you can run programs on your remote X display simply by setting DISPLAY
:
ssh foo.example.com 'DISPLAY=:0 restart teamviewer'
This answer is adapted from a more complete answer to a similar question on Unix Stack Exchange.
Probably the easiest way is to remotely (via SSH) start a vncserver on the relevant display. After that use SSH tunneling to connect a vnc client from your remote machine through the SSH connection to the VNC server.
-
I actually have been trying that, but VNC is not as reliable as TeamViewer and also it is much slower. For some reason, every time I started using VNC for actual work, it ended up crashing and I ended up losing all my work.– Can BalOct 11, 2011 at 23:36
-
-
I tried that as well. For some reason running TeamViewer in VNC crashes VNC right away. I don't have enough knowledge in VNC, so I thought figuring that out would be a harder task.– Can BalOct 16, 2011 at 20:18