Wie mache ich einen Screenshot einer X11-basierten Benutzeroberfläche von einem Textterminal (wie z. B. tty1)?

11

Ich habe es versucht DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importist Teil der ImageMagick-Suite), aber das zeigt nur einen schwarzen Bildschirm an.

Ich möchte dies tun, um das Öffnen einer App und das Erstellen von Screenshots in verschiedenen Sprachen zu automatisieren. Um die Sprache zu ändern, muss ich lightdm neu starten. Führen Sie daher eine tty aus, damit Ihr Skript weiterhin ausgeführt wird ...

Yatharth Agarwal
quelle

Antworten:

10

Zusätzlich zu den vorhandenen Antworten, um den Screenshot in ASCII im Terminal anzuzeigen:

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

(Benötigt x11-appsfür xwd, imagemagickfür convertund jp2a.)

Niklas
quelle
Nicht gerade relevant, aber coole Ergänzung.
Yatharth Agarwal
1
xwd -root -display :0 | convert - jpg:- > screenshot.jpg
Gregn3
2
Moderne ImageMagick- Versionen können das xwdFormat oft nicht aus magischen Zahlen ableiten , daher ist es besser, das Eingabeformat explizit anzugeben: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass
Für mich: xwd -name "$win_name" | convert xwd:- /tmp/"$win_name".pngwowin_name=$(xwininfo -tree -root | grep 'The Window Name Im Looking For' | awk -F\" '{print $2}')
Avio
6

Hier ist eine Lösung xwd, die in fast allen Xorg-Installationen verfügbar ist:

 xwd -root -out screenshot.xwd

Die screenshot.xwdDatei kann mit GIMP geöffnet werden:

Weitere Informationen finden Sie unter http://www.x.org/wiki/UserDocumentation/GettingStarted/ .

rendon
quelle
5

Folgendes hat bei mir funktioniert.

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

Versuchen Sie es mit einem Verschluss

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

Der Import funktioniert nicht, da das Stammfenster nicht verwendet wird. Das Zusammensetzen "umgeht" es (jedes Fenster wird in einem eigenen Puffer gerendert und dann auf die Anzeige gemultiplext, anstatt auf die alte Weise, wo sie alle im "Root" -Fenster gerendert wurden).

Außerdem müssen Sie sicherstellen, dass die VTY aktiv ist, bevor Sie den Screenshot aufnehmen. So zum Beispiel

#!/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
quelle
Nein, immer noch einen schwarzen Bildschirm :(
Yatharth Agarwal
Befinden Sie sich dabei in der X-Sitzung (auf einem Monitor)? Ich habe es gerade versucht und es hat ganz gut funktioniert. Sie müssen angemeldet sein und die X-Sitzung in der aktiven VTY haben.
Coteyr
Ich möchte, dass ein im tty gestartetes Skript dies ermöglicht.
Yatharth Agarwal
Ja, aber wechseln Sie zur X-Sitzung, bevor Sie den Screenshot machen. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(Beachten Sie völlig falsches Skript).
Coteyr
Auch nur um sicherzugehen, dass Sie das gleiche sprechen, was Sie wollen, VT0 (oder etwas), kein Screenshot einer Textkonsole. Sie führen das Skript also von einem TTY aus, der versucht, Screenshot X (VTY) zu erstellen. Ist das korrekt?
Coteyr
0

Das Sitzen auf demselben Computer und von einem anderen virtuellen Terminal als dem X-Server aus funktioniert nicht.

Es wird dort erklärt: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Zitat:

F-108: Ich verwende Linux Virtual Terminals (VTs), um 'Fast User Switching' zwischen Benutzersitzungen zu implementieren (z. B. Betty ist auf Strg-Alt-F7, Bobby ist auf Strg-Alt-F8 und Sid ist auf Strg-Alt -F1: Sie verwenden diese Tastenanschläge, um zwischen ihren Sitzungen zu wechseln.) Wie kommt es, dass die Ansicht in einem VNC-Viewer, der eine Verbindung zu x11vnc herstellt, entweder vollständig schwarz ist, nicht aktualisiert wird oder Pixel durcheinander geraten, es sei denn, die X-Sitzung, an die x11vnc angehängt ist, befindet sich in der aktive VT?

Dies scheint damit zu tun zu haben, wie Anwendungen (in diesem Fall die X-Server-Prozesse) "gut abgespielt" werden müssen, wenn sie sich nicht auf der aktiven VT befinden (manchmal als VC für virtuelle Konsole bezeichnet). Das heißt, sie sollten nicht von der Tastatur lesen oder Maus oder verwalten Sie die Videoanzeige, es sei denn, sie haben die aktive VT. Angesichts der Tatsache, dass der XGetImage () -Aufruf letztendlich die Framebuffer-Daten von der Videohardware selbst abrufen muss, wäre es sinnvoll, dass die Abfrage von x11vnc nur funktioniert, wenn die X-Sitzung die aktive Kontrolle über die VT hat.

Es scheint keine einfache Möglichkeit zu geben, dies zu umgehen. Selbst xwd (1) funktioniert in diesem Fall nicht (versuchen Sie es). Es müsste etwas auf einer niedrigeren Ebene getan werden, beispielsweise auf dem XFree86 / Xorg X-Server. Die Verwendung des Schatten-Framebuffers (eine Kopie des Video-Framebuffers wird im Hauptspeicher gespeichert) scheint das Problem nicht zu beheben (zuletzt überprüft 2007.)

Wenn niemand an der Workstation sitzt und Sie die VT nur aus der Ferne auf die mit Ihrer X-Sitzung verknüpfte VT umschalten möchten (damit x11vnc sie korrekt abfragen kann), können Sie den Befehl chvt (1) verwenden, z. B. "chvt 7". für VT # 7.

Golar Ramblar
quelle