쉘 스크립트를 통해 터미널 애플리케이션의 스크린샷을 캡처하시겠습니까?

쉘 스크립트를 통해 터미널 애플리케이션의 스크린샷을 캡처하시겠습니까?

질문

5초 동안 실행하고 iftop스크린샷을 캡쳐해 파일로 저장합니다.

iftop은 네트워크 트래픽을 시각화하는 멋진 프로그램이지만 몇 초 동안 실행하고 출력을 파일로 캡처할 수 있는 배치 모드가 없습니다.

그래서 내 생각은

  • screen가상 디스플레이 생성 및 실행과 같은 명령을 사용하십시오 iftop.
  • screendump스크린샷을 찍을 도구( )를 찾으세요 screen.

나는 무엇을 해야할지 알고 있나요?

답변1

출력이 실제로 창에서 렌더링되지 않는 한 이 작업을 수행할 수 없다고 생각합니다. screen그러면 화면을 사용하는 요점이 무산될 수 있습니다. 그러나 창이 전경에 있을 필요는 없습니다.

이것이미지 마술사이 제품군에는 import이 목적으로 사용할 수 있는 유틸리티가 포함되어 있습니다. "명령을 찾을 수 없음" 메시지 가 나타나면 import --helpimagemagick 패키지를 설치하세요. 모든 Linux 배포판에서 사용할 수 있습니다.

import창 이름이 필요합니다. iftop터미널 인터페이스이므로 올바른 이름이 사용되도록 하려면 실행 중인 GUI 터미널의 제목을 설정해야 합니다. 이를 수행하는 방법은 사용 중인 GUI 터미널에 따라 다릅니다. 예를 들어, 나는 다음과 같은 XFCE 터미널을 선호합니다:

Terminal -T Iftop -e iftop

iftop"Iftop"이라는 새 터미널 을 엽니다 . 이 콘텐츠의 스크린샷을 찍을 수 있습니다.

import -window Iftop ss.jpg

5초마다 이 작업을 수행할 계획이라면 동일한 터미널을 재사용할 수 있도록 스크립트가 실행 중인 창을 열어야 할 수 있습니다.

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

스크립트가 "iftopSShot.sh"인 경우 이를 시작합니다 Terminal -T Iftop -e iftopSShot.sh. 단, 그렇지 않을 수도 있습니다 Terminal. 대부분의 Linux GUI 터미널은 독립적으로 사용할 수 있는 독립 실행형 응용 프로그램이지만 특정 DE와 연결되어 있습니다. 나는 KDE의 기본 터미널 이름이 이라고 생각합니다 . 이는 GNOME의 경우 및 규칙을 Konsole따르며 (변경되었을 수 있음) and를 사용 하지 않는 것 같습니다 .-T-egnome-terminal-t-T

기본적으로 벨이 울리 는데 import, 이는 짜증스러울 수 있지만 옵션이 있습니다 -silent.

답변2

screen파일에 기록할 수 있음:

-L은 Windows의 자동 출력 로깅을 켜도록 화면에 지시합니다.

또는 현재 화면을 파일에 복사합니다.

하드카피 [-h] [파일]

   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.

screen 세션을 실행 중인 경우 다음 명령을 사용하여 현재 내용을 저장할 수 있습니다.

screen -X hardcopy

100개의 개별 파일을 10초마다 1개씩 저장하려면 다음을 수행하세요.

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

답변3

안에엑스환경:


터미널 제목을 동적으로 설정합니다.

우리 스크립트에는 ansi 시퀀스를 사용하여 터미널 제목을 변경하는 방법이 있습니다.

echo -e "\033]0;Term | myApp\007";

창 제목으로 png 캡처:

이제 정확한 제목을 사용하여 창 ID를 검색 wmctrl하고 해당 ID를 import유틸리티에 전달할 수 있습니다.

import -window $(wmctrl -l | grep -i 'Term | myApp' | awk '{print $1}') ~/Pictures/capture.png

GIF 만들기:

convert조정의 예로는 초당 5개의 캡처를 수행한 다음 2초 무한 루프를 사용하여 이를 gif로 변환하는 것입니다.

rm -f /tmp/*png && for i in {1..5}; do import -window $(wmctrl -l | grep -i 'Term | myApp' | awk '{print $1}') /tmp/$i.png && sleep 1; done && convert -delay 200 -loop 0 /tmp/*.png animation.gif

답변4

몇 가지 아이디어:

  1. 이 문서의 다음 제목의 스크립트를 사용할 수 있습니다.반복되는 스크린샷을 위한 캡처 도구.

    #!/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
    

    위의 내용을 이라는 파일에 넣고 scrotter실행 가능하게 만듭니다. 처음 실행하는 경우:

    $ ./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
    

    두 번째로 실행하면 사용량이 표시됩니다.

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

    이제 a를 사용하여 실행 --server-id blah하고 스크린샷 찍기를 시작하세요.

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

    활성 창의 스크린샷을 찍습니다. 이것을 루프 구조로 수정하거나 직접 수정해보세요!

  2. 가져오기 명령을 사용하여 스크린샷을 찍고 필요에 따라 원하는 루프(for, while 등)로 래핑할 수 있습니다. 이 기사는,타임랩스 사진 스크린샷, 필요한 모든 것이 있습니다. 스크립트가 cron에서 실행되는 것을 원하지 않을 것 같지만 다른 모든 것은 작동하는 것 같습니다.

    예를 들어:

    # 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
    

관련 정보