Capturando Captura de tela do aplicativo de terminal via script de shell?

4

Problema

Execute iftop por 5 segundos, capture a captura de tela e salve-a em um arquivo.

iftop é um belo programa para visualizar o tráfego de rede, mas não possui um modo em lote no qual eu possa executá-lo por alguns segundos e capturar a saída em um arquivo.

Então minha ideia é

  • use comandos como screen para criar uma exibição virtual e executar iftop nela.
  • procure por qualquer ferramenta ( screendump ) para tirar uma captura de tela do screen .

Alguma idéia de como eu vou com isso?

    
por Satish 26.09.2013 / 13:27

3 respostas

1

Eu não acho que você conseguirá fazer isso com screen a menos que a saída seja realmente renderizada em uma janela, o que provavelmente anula o ponto de usar a tela. No entanto, a janela não precisa estar em primeiro plano.

A suíte ImageMagick contém um utilitário chamado import que você pode usar para isso. Se import --help lhe der "comando não encontrado", instale o pacote imagemagick, ele estará disponível em qualquer distribuição linux.

import precisa do nome da janela. iftop é uma interface de terminal, portanto, para ter certeza de usar o nome correto, você terá que configurar o título do terminal GUI em que ele roda. Como você faz isso depende de qual terminal da GUI você usa. Por exemplo, eu prefiro o Terminal XFCE, que seria:

Terminal -T Iftop -e iftop

Abre um novo terminal executando iftop com o título "Iftop". Uma captura de tela pode ser tirada:

import -window Iftop ss.jpg

Se você for fazer isso a cada cinco segundos, provavelmente desejará abrir a janela executando um script para poder reutilizar o mesmo terminal:

count=0;
while ((1)); do
    iftop &
    pid=$!
    sleep 1  # make sure iftop is up
    count=$(($count+1))
    import -window Iftop iftop_sshot$count.jpg
    kill $pid
    sleep 5
done

Se o script for "iftopSShot.sh", você iniciará este Terminal -T Iftop -e iftopSShot.sh - exceto que provavelmente você não está usando Terminal . A maioria dos terminais GUI do Linux está associada a DEs específicos, embora sejam aplicativos independentes que podem ser usados independentemente. Acredito que o nome do terminal padrão no KDE seja Konsole e siga as convenções -T e -e ; para o GNOME é provavelmente gnome-terminal (isso pode ter mudado) e parece usar -t e não -T .

Cuidado import por padrão toca o sino, o que vai ficar irritante, mas existe uma opção -silent .

    
por 26.09.2013 / 15:32
0

Algumas ideias:

  1. Você pode usar este script a partir deste título intitulado: Ferramenta de captura de tela para capturas de tela repetitivas .

    #!/bin/bash
    # Screenshot tool for TIMS.
    #
    # -------------------------
    #
    # By regj 2012.05
    #
    # -------------------------
    #
    # Check for config file create if needed with sane defaults then exit.
    if [ ! -f $HOME/.scrotter ]; then
        echo "Creating scrotter config file ${HOME}/.scrotter"
        echo "scrotfldrbase=${HOME}/Desktop/scrots" > $HOME/.scrotter
        echo "fontsize=14" >> $HOME/.scrotter 
        echo "fillcolor=white" >> $HOME/.scrotter 
        echo "whiteterm=yes" >> $HOME/.scrotter
        echo "subw=130" >> $HOME/.scrotter
        echo "subh=5" >> $HOME/.scrotter
        echo "fontpath=/usr/share/fonts/dejavu/DejaVuSansMono.ttf" >> $HOME/.scrotter
        if [ $? = 0 ] ; then
            echo -e "Config file succesfully created. Adjust values if needed in ~/.scrotter.\nIf you use a black term background set whiteterm to no."
            echo "Current values:"
            cat $HOME/.scrotter
            echo "Rerun scrotter with --server-id if initial run"
            exit 0
        else
            echo "Something went wrong"
            exit 1
        fi
    fi
    
    # Source config file
    source $HOME/.scrotter
    
    # convert functions for white or black terminal
    conv_black () {
    convert -pointsize $fontsize \
        -font $fontpath \
        -fill $fillcolor \
        -draw "text ${xyplace} \"$(date "+%Y.%m.%d %H:%M"|sed -e ' s/\"/\\"/g' )\"" \
        $scrotfldr/$srvid-$count.png $scrotfldr/$srvid-$count.png 
    }
    
    conv_white () {
    convert -pointsize $fontsize \
            -font $fontpath \
            -fill $fillcolor \
        -stroke black \
        -strokewidth 1 \
            -draw "text ${xyplace} \"$(date "+%Y.%m.%d %H:%M"|sed -e ' s/\"/\\"/g' )\"" \
            $scrotfldr/$srvid-$count.png $scrotfldr/$srvid-$count.png
    }
    
    
    # Options
    case $1 in
    
    --server-id) echo "Setting srvid" ; echo $2 > /tmp/${USER}-scrot-srvid ; exit 0;;
    --reset-count) echo "0" > /tmp/$USER-scrot-count ; exit 0;;
    --clean-up) rm -f $scrotfldr/*.png ; rm -f /tmp/${USER}-scrot-* ; exit 0 ;;
    --help) echo "Options are:
            --server-id: Set servername used in test.
            --reset-count: Reset counter for enumerating png's.
            --clean-up: Delete png's in current serverfolder and reset counters and serverid.
            --help: This info." 
            exit 0;;
    
    # Uncomment below if you want to remove everything in your scrot folder with this script
    #--clean-all) if [ -z $scrotfldrbase ]; then 
    #       echo "Exiting .." ; exit 1
    #        fi 
    #       echo "NB: $scrotfldrbase will be removed recursively!"  
    #       rm -rI $scrotfldrbase/*  
    #       rm -f /tmp/${USER}-scrot-*
    #       exit 0 ;;
    
    esac
    
    # Check if serverid is defined, use if yes
    if [ -s /tmp/${USER}-scrot-srvid ]; then
        srvid=$(cat /tmp/${USER}-scrot-srvid)
        scrotfldr=$HOME/Desktop/scrots/$srvid
    else
        echo "Please set server id with --server-id option. # scrotter --server-id <servername>"
        exit 1
    fi
    
    # Check if root, exit if yes.
    if [ $(id -u) = 0 ]; then
        echo "Do not run as root!"
        exit 1
    fi
    
    # Create count file
    if [ ! -f /tmp/${USER}-scrot-count ]; then
        echo "0" > /tmp/$USER-scrot-count
    fi
    
    # Create Screenshot folder if not present
    if [ ! -d $scrotfldr ];  then
        mkdir -p $scrotfldr
    fi
    
    # Get active window ID
    activewin=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | grep "window id" )
    activewinid=${activewin:40}
    
    # Get geometry of window
    geowinw=$(xwininfo -id ${activewinid} | awk '/Width/ {print $2}')
    geowinh=$(xwininfo -id ${activewinid} | awk '/Height/ {print $2}')
    
    # Define X,Y placment of date text
    xyplace="$(($geowinw - $subw)),$(($geowinh - $subh))"
    
    # Get current count
    count=$(cat /tmp/${USER}-scrot-count)
    
    # Take screenshot
    import -window "$activewinid" $scrotfldr/$srvid-$count.png
    
    # Insert date stamp into screenshot use xyplace variable to adjust placement
    if [ $whiteterm = yes ] ; then
        conv_white
    else
        conv_black
    fi
    
    # Increment counter
    echo $(($count+1)) > /tmp/$USER-scrot-count
    

    Coloque o texto acima em um arquivo chamado scrotter e torne-o executável. Quando você o executa pela primeira vez:

    $ ./scotter
    Creating scrotter config file /home/saml/.scrotter
    Config file succesfully created. Adjust values if needed in ~/.scrotter.
    If you use a black term background set whiteterm to no.
    Current values:
    scrotfldrbase=/home/saml/Desktop/scrots
    fontsize=14
    fillcolor=white
    whiteterm=yes
    subw=130
    subh=5
    fontpath=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
    Rerun scrotter with --server-id if initial run
    

    Executando uma segunda vez você terá o uso:

    $ ./scrotter 
    Please set server id with --server-id option. # scrotter --server-id <servername>
    

    Agora execute-o com --server-id blah e comece a tirar screenshots:

    $ ./scrotter --server-id blah
    $ ./scrotter
    

    Ele tirará screenshots da janela ativa. Isso seria modificado em uma estrutura de loop ou modificado diretamente!

  2. Você pode usar o comando import para fazer uma captura de tela e envolvê-la em qualquer tipo de loop desejado (por, whilte, etc.) dependendo de suas necessidades. Este aritcla, Capturas de tela de timelapse , tem tudo que você precisa, eu não acho que você queira fazer o script rodar a partir de um cron mas todo o resto parece ser aplicável.

    Por exemplo:

    # takes screenshot
    $ import -window root -display :0 -crop 958x490+20+128 "savedfiles/screenshot_$(date +%d%m%y-%H.%M).png"
    
    # makes a video out of a bunch of them
    $ mencoder "mf://screamshots/*.png" -mf fps=10 -o test.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800
    
por 26.09.2013 / 15:40
0

screen pode registrar em um arquivo:

-L tells screen to turn on automatic output logging for the windows.

ou faça uma cópia da tela atual em um arquivo:

hardcopy [-h] [file]

   Writes out the currently displayed image to the file file, or,
   if no filename is specified, to hardcopy.n in the  default directory,
   where  n  is the number of the current window.  This either appends
   or overwrites the file if it exists. See below.  If the option -h
   is specified, dump also the contents of the scrollback buffer.

Se você tiver uma sessão de tela em execução, poderá salvar seu conteúdo atual com este comando:

screen -X hardcopy

Para salvar em 100 arquivos separados, 1 a cada 10 segundos:

for c in {1..100}; do screen -X hardcopy /my/dir/screen-$c; sleep 10; done
    
por 09.01.2018 / 13:17