Jak zrobić zrzut ekranu GUI opartego na X11 z terminala tekstowego (takiego jak tty1)?

11

Próbowałem użyć DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importjest częścią pakietu ImageMagick), ale wyświetla tylko czarny ekran.

Chcę to zrobić, ponieważ chciałem zautomatyzować otwieranie aplikacji i robienie zrzutów ekranu z niej w różnych językach, a także w celu zmiany języków, muszę ponownie uruchomić lightdm. dlatego uruchom tty, aby Twój skrypt kontynuował działanie ...

Yatharth Agarwal
źródło

Odpowiedzi:

10

Oprócz istniejących odpowiedzi, aby wyświetlić zrzut ekranu w ASCII w terminalu:

xwd -root -display :0 | convert - jpg:- | jp2a - --colors

(Wymaga x11-appsdla xwd, imagemagickdla converti jp2a.)

Niklas
źródło
Niezupełnie istotne, ale fajny dodatek.
Yatharth Agarwal
1
xwd -root -display :0 | convert - jpg:- > screenshot.jpg
gregn3
2
Nowoczesne wersje ImageMagick często nie mogą wywnioskować xwdformatu z magicznych liczb, dlatego lepiej jest wyraźnie określić format wejściowy: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass
Dla mnie: xwd -name "$win_name" | convert xwd:- /tmp/"$win_name".pnggdziewin_name=$(xwininfo -tree -root | grep 'The Window Name Im Looking For' | awk -F\" '{print $2}')
Avio
7

Oto rozwiązanie wykorzystujące xwd, które jest dostępne w prawie wszystkich instalacjach Xorg:

 xwd -root -out screenshot.xwd

screenshot.xwdPlik można otworzyć za pomocą programu GIMP:

Aby uzyskać więcej informacji, zobacz http://www.x.org/wiki/UserDocumentation/GettingStarted/ .

rendon
źródło
5

Oto, co dla mnie zadziałało.

chvt 7
DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png
chvt 1
Yatharth Agarwal
źródło
5

Spróbuj użyć migawki

DISPLAY=:0 shutter -f -e -n -o "$HOME/Pictures/screenshot.png"

Import nie działa, ponieważ okno główne nie jest używane. Komponowanie go „omija” (każde okno jest renderowane we własnym buforze, a następnie multipleksowane na ekran, zamiast w starym stylu, gdzie wszystkie były renderowane w oknie „root”).

Ponadto przed wykonaniem zrzutu ekranu upewnij się, że VTY jest aktywny. Na przykład

#!/bin/bash  
X :1 &  
export DISPLAY=:1  
sleep 10 # give time for X to start  
gedit &  
sleep 10 # give time for app to do something  
chvt 8  # ensure the X display is active  
shutter -f -e -n -o "$HOME/Pictures/screenshot.png" # screenshot  
killall xorg # terminate X
Coteyr
źródło
Nie, nadal daje czarny ekran :(
Yatharth Agarwal
Czy robisz to podczas sesji X (na monitorze)? Właśnie próbowałem i zadziałało całkiem nieźle. Musisz być zalogowany i mieć sesję X w aktywnym VTY.
coteyr
Chcę, aby skrypt uruchomiony w tty mógł to zrobić.
Yatharth Agarwal
Tak, ale czy przestawiasz się na sesję X przed zrobieniem zrzutu ekranu. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(zauważ całkowicie fałszywy skrypt).
coteyr
Również po to, aby upewnić się, że mówisz to samo, co chcesz VT0 (lub coś takiego), a nie zrzut ekranu konsoli tekstowej. Więc uruchamiasz skrypt z TTY próbującego wykonać zrzut ekranu X (VTY). Czy to jest poprawne?
coteyr
0

Siedzenie na tym samym komputerze i robienie tego z innego wirtualnego terminala niż uruchomiony serwer X nie działa.

Wyjaśniono tam: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Zacytować:

P-108: Używam terminali wirtualnych systemu Linux (VT) do implementacji „Szybkiego przełączania użytkowników” między sesjami użytkowników (np. Betty jest na Ctrl-Alt-F7, Bobby na Ctrl-Alt-F8, a Sid na Ctrl-Alt -F1: używają tych naciśnięć klawiszy, aby przełączać się między sesjami.) Dlaczego widok w przeglądarce VNC łączącej się z x11vnc jest albo całkowicie czarny, nie aktualizuje się, albo nie ma pomieszanych pikseli, chyba że dołączona jest sesja X x11vnc aktywny VT?

Wydaje się, że ma to związek z tym, jak aplikacje (w tym przypadku X-serwer) muszą „ładnie grać”, jeśli nie znajdują się na aktywnym VT (czasami nazywanym VC dla wirtualnej konsoli). Oznacza to, że nie powinny czytać z klawiatury lub myszy lub zarządzaj wyświetlaniem wideo, chyba że mają aktywne VT. Biorąc pod uwagę, że wydaje się, że wywołanie XGetImage () musi ostatecznie pobrać dane bufora ramki z samego sprzętu wideo, byłoby sensowne, że odpytywanie x11vnc nie zadziałałoby, chyba że sesja X miała aktywną kontrolę nad VT.

Wydaje się, że nie ma łatwego sposobu na obejście tego. Nawet xwd (1) nie działa w tym przypadku (spróbuj.) Coś musiałoby zostać zrobione na niższym poziomie, powiedzmy na serwerze XFree86 / Xorg X. Ponadto użycie Shadow Framebuffer (kopia bufora ramki wideo jest przechowywana w pamięci głównej) nie wydaje się rozwiązać problemu (ostatnio sprawdzone w 2007 r.).

Jeśli nikt nie siedzi na stacji roboczej i chcesz tylko zdalnie przełączyć VT na ten powiązany z twoją sesją X (aby x11vnc mógł poprawnie sondować), można użyć polecenia chvt (1), np. „Chvt 7” dla VT # 7.

Golar Ramblar
źródło