通过 shell 脚本捕获终端应用程序的屏幕截图?

通过 shell 脚本捕获终端应用程序的屏幕截图?

问题

运行iftop5 秒,捕获屏幕截图并将其保存到文件中。

iftop是一个用于可视化网络流量的漂亮程序,但它没有批处理模式,我可以运行它几秒钟并将输出捕获到文件中。

所以我的想法是

  • screen使用诸如创建虚拟显示器并在其中运行之类的命令iftop
  • 寻找任何工具(screendump)来截取屏幕截图screen

我知道该怎么做吗?

答案1

我认为除非输出实际上在窗口中呈现,否则您将无法执行此操作,screen这可能会破坏使用屏幕的意义。但是,窗口不必位于前台。

图像魔术师套件包含一个名为import您可以用于此目的的实用程序。如果import --help出现“找不到命令”,请安装 imagemagick 软件包,它将在任何 Linux 发行版中可用。

import需要窗口的名称。iftop是一个终端界面,因此为了确保使用正确的名称,您必须设置它运行的 GUI 终端的标题。具体操作方式取决于您使用的 GUI 终端。例如,我更喜欢 XFCE 终端,它是:

Terminal -T Iftop -e iftop

打开一个iftop标题为“Iftop”的新终端。可以截取该内容的屏幕截图:

import -window Iftop ss.jpg

如果您打算每五秒执行一次此操作,您可能需要打开运行脚本的窗口,以便可以重用相同的终端:

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 上默认终端的名称是Konsole,它遵循-T-e约定;对于 GNOME 来说,它可能是gnome-terminal(这可能已经改变)并且它似乎使用-tand not -T

请注意import默认情况下会响铃,这会让人恼火,但有一个-silent选项。

答案2

screen可以记录到文件:

-L 告诉 screen 打开 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 -X hardcopy

要保存到 100 个单独的文件,每 10 秒 1 个:

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

答案3

在一个X环境:


动态设置终端标题:

在我们的脚本中,有一种使用 ansi 序列更改终端标题的方法:

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

通过窗口标题捕获 png:

现在我们可以使用确切的标题搜索窗口 idwmctrl并将该 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. 您可以使用 import 命令截取屏幕截图,然后根据您的需要将其包装在您喜欢的任何类型的循环中(for、whilte 等)。这篇文章,延时摄影截图,拥有您需要的一切,我认为您不想让脚本从 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
    

相关内容