¿Cómo tomar una captura de pantalla de una GUI basada en X11 desde un terminal de texto (como tty1)?

11

Intenté usar DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importes parte de la suite ImageMagick), pero eso solo muestra una pantalla en negro.

Quiero hacer esto porque quería automatizar la apertura de una aplicación y tomar capturas de pantalla en diferentes idiomas, y para cambiar los idiomas, necesito reiniciar lightdm. por lo tanto, ejecute en un tty para que su script continúe ejecutándose ...

Yatharth Agarwal
fuente

Respuestas:

10

Además de las respuestas existentes, para mostrar la captura de pantalla en ASCII en el terminal:

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

(Requiere x11-appspara xwd, imagemagickpara converty jp2a.)

Niklas
fuente
No es exactamente relevante, pero además genial.
Yatharth Agarwal
1
xwd -root -display :0 | convert - jpg:- > screenshot.jpg
gregn3
2
Las versiones modernas de ImageMagick a menudo no pueden inferir el xwdformato de los números mágicos, por lo que es mejor especificar el formato de entrada explícitamente: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass
Para mí: xwd -name "$win_name" | convert xwd:- /tmp/"$win_name".pngdondewin_name=$(xwininfo -tree -root | grep 'The Window Name Im Looking For' | awk -F\" '{print $2}')
Avio
5

Esto es lo que funcionó para mí.

chvt 7
DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png
chvt 1
Yatharth Agarwal
fuente
5

Intenta usar el obturador

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

Importar no funcionará porque la ventana raíz no está en uso. La composición la "omite" (cada ventana se representa en su propio búfer y luego se multiplexa en la pantalla, en lugar de la forma anterior, donde se representaron todas en la ventana "raíz").

Además, debe asegurarse de que el VTY esté activo antes de tomar la captura de pantalla. Así por ejemplo,

#!/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
fuente
No, sigue dando una pantalla en negro :(
Yatharth Agarwal
¿Estás en la sesión X (en un monitor) cuando haces esto? Lo intenté y funcionó bastante bien. Deberá iniciar sesión y tener la sesión X en el VTY activo.
coteyr
Quiero que se ejecute un script en el tty para poder hacer esto.
Yatharth Agarwal
Sí, pero cambia a la sesión X antes de tomar la captura de pantalla. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(Aviso guión totalmente falso).
coteyr
También para asegurarse de que estaban hablando lo mismo que quieres VT0 (o algo así) no una captura de pantalla de una consola de texto. Entonces, está ejecutando el script desde un TTY que intenta capturar la pantalla X (VTY) ¿Es eso correcto?
coteyr
0

Sentarse en la misma computadora y hacerlo desde una terminal virtual diferente a la que ejecuta el servidor X no funciona.

Aquí se explica: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Citar:

P-108: Uso Linux Virtual Terminals (VT) para implementar 'Cambio rápido de usuario' entre sesiones de usuarios (por ejemplo, Betty está en Ctrl-Alt-F7, Bobby está en Ctrl-Alt-F8 y Sid está en Ctrl-Alt -F1: usan esas teclas para cambiar entre sus sesiones.) ¿Cómo es que la vista en un visor VNC que se conecta a x11vnc es completamente negra, no se actualiza o los píxeles se estropean a menos que la sesión X x11vnc esté conectada? TV activa?

Esto parece tener que ver con cómo las aplicaciones (el servidor X procesa en este caso) deben "jugar bien" si no están en el VT activo (a veces llamado VC para consola virtual). Es decir, no deberían leer desde el teclado o mouse o administrar la pantalla de video a menos que tengan el VT activo. Dado que parece que la llamada XGetImage () finalmente debe recuperar los datos del framebuffer del propio hardware de video, tendría sentido que el sondeo de x11vnc no funcionara a menos que la sesión X tuviera control activo del VT.

No parece haber una manera fácil de solucionar esto. Incluso xwd (1) no funciona en este caso (pruébelo). Debería hacerse algo en un nivel inferior, por ejemplo, en el servidor XFree86 / Xorg X. Además, el uso de Shadow Framebuffer (una copia del video framebuffer se mantiene en la memoria principal) no parece solucionar el problema (última comprobación de 2007.)

Si no hay nadie sentado en la estación de trabajo y solo desea cambiar de forma remota el VT al que está asociado con su sesión X (para que x11vnc pueda sondearlo correctamente), puede usar el comando chvt (1), por ejemplo, "chvt 7" para VT # 7.

Golar Ramblar
fuente