Kdysi dávno,
DISPLAY=:0.0 totem /path/to/movie.avi
po připojení ssh na plochu z mého notebooku by se totem přehrál movie.avi
na mé ploše.
Nyní zobrazuje chybu:
No protocol specified Cannot open display:
Přeinstaloval jsem Debian Squeeze, když byl stabilní na obou počítačích, a myslím, že jsem porušil konfiguraci.
Tohle jsem googlil a za život nemůžu přijít na to, co mám dělat.
(VLC má rozhraní HTTP, které funguje, ale není tak pohodlné jako ssh.)
Stejný problém nastává, když se to pokouším spustit z úlohy cron.
Přijatá odpověď:
(Přizpůsobeno z Linuxu:wmctrl nemůže otevřít zobrazení, když je relace zahájena přes ssh+screen)
ZOBRAZENÍ a AUTORITA
Program X potřebuje dvě informace, aby se mohl připojit k displeji X.
-
Vyžaduje adresu displeje, která je obvykle
:0
když jste přihlášeni místně nebo:10
,:11
, atd., když jste přihlášeni vzdáleně (ale počet se může změnit v závislosti na tom, kolik X připojení je aktivních). Adresa displeje je normálně uvedena vDISPLAY
proměnná prostředí. -
Vyžaduje heslo pro zobrazení. Hesla pro zobrazení X se nazývají magické soubory cookie . Magic cookies nejsou specifikovány přímo:jsou vždy uloženy v X autoritních souborech, které jsou sbírkou záznamů ve tvaru „zobrazit
:42
má cookie123456
“. Soubor autority X je normálně označen vXAUTHORITY
proměnná prostředí. Pokud$XAUTHORITY
není nastaveno, programy používají~/.Xauthority
.
Pokoušíte se jednat s okny zobrazenými na ploše. Pokud jste jedinou osobou, která používá svůj stolní počítač, je velmi pravděpodobné, že zobrazovaný název je :0
. Najít umístění souboru autority X je těžší, protože s gdm, jak je nastaveno pod Debian squeeze nebo Ubuntu 10.04, je v souboru s náhodně generovaným názvem. (Předtím jste neměli žádný problém, protože dřívější verze gdm používaly výchozí nastavení, tj. soubory cookie uložené v ~/.Xauthority
.)
Získání hodnot proměnných
Zde je několik způsobů, jak získat hodnoty DISPLAY
a XAUTHORITY
:
-
Relaci obrazovky můžete systematicky spouštět z vašeho počítače, třeba automaticky ve vašich přihlašovacích skriptech (z
~/.profile
; ale proveďte to pouze v případě, že se přihlašujete pod X:otestujte, zdaDISPLAY
je nastavena na hodnotu začínající:
(to by mělo zahrnovat všechny případy, se kterými se pravděpodobně setkáte)). V~/.profile
:case $DISPLAY in :*) screen -S local -d -m;; esac
Poté v relaci ssh:
screen -d -r local
-
Můžete také uložit hodnoty
DISPLAY
aXAUTHORITY
v souboru a vyvolat hodnoty. V~/.profile
:case $DISPLAY in :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;; esac
V relaci ssh:
. ~/.local-display-setup.sh screen
-
Mohli byste zjistit hodnoty
DISPLAY
aXAUTHORITY
z běžícího procesu. To je těžší automatizovat. Musíte zjistit PID procesu, který je připojen k displeji, na kterém chcete pracovat, a poté získat proměnné prostředí z/proc/$pid/environ
(eval export $(</proc/$pid/environ tr \0 \n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Kopírování souborů cookie
Dalším přístupem (podle návrhu Arrowmastera) je nepokoušet se získat hodnotu $XAUTHORITY
v relaci ssh, ale místo toho, aby relace X zkopírovala soubory cookie do ~/.Xauthority
. Protože se soubory cookie generují pokaždé, když se přihlásíte, není problém, pokud v ~/.Xauthority
ponecháte zastaralé hodnoty .
Pokud je váš domovský adresář přístupný přes NFS nebo jiný síťový souborový systém, který umožňuje vzdáleným správcům zobrazit jeho obsah, může dojít k bezpečnostnímu problému. Stále se budou muset nějak připojit k vašemu počítači, pokud jste nepovolili připojení X TCP (Debian je má ve výchozím nastavení vypnuté). Takže pro většinu lidí to buď neplatí (žádné NFS), nebo to není problém (žádná připojení X TCP).
Chcete-li zkopírovat soubory cookie, když se přihlásíte do relace X počítače, přidejte následující řádky do ~/.xprofile
nebo ~/.profile
(nebo nějaký jiný skript, který se přečte, když se přihlásíte):
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
¹ V zásadě to postrádá správné citace, ale v tomto konkrétním případě $DISPLAY
a $XAUTHORITY
nebude obsahovat žádný metaznak shellu.