linux shell编程

Linux shell编程

    • 一、常用功能
      • 1. 比较图片差异
      • 2. 截屏
        • 2.1 起X情况下(X window起桌面)
        • 2.2 没有起X或没有X系统环境下
      • 3. 自动输入密码

一、常用功能

1. 比较图片差异

if compare -metric AE p1.png p2.png null: 2>&1 | grep -v "0$"; then
    echo "两张图片不同"
else
    echo "两张图片相同"
fi
  • compare -metric AE p1.png p2.png null: 2>&1:这部分代码使用 ImageMagick 的 compare 命令来比较两张图片 p1.pngp2.png 的差异。其中,-metric AE 表示使用绝对误差(Absolute Error)作为度量标准。null: 是一个特殊的输出文件名,用于将结果输出到空设备,而不产生实际输出。2>&1 将错误输出重定向到标准输出,这样可以捕获错误信息。
  • | grep -v "0$":使用管道将 compare 命令的输出传递给 grep 命令进行过滤。-v 参数表示只输出不匹配模式的行,“0$” 是一个正则表达式,表示以 0 结尾的行。所以这个部分的作用是删除输出中值为 0 的行。
  • then echo "两张图片不同":如果 compare 命令的输出中存在非零的行(即两张图片不同),则输出 “两张图片不同”。
  • else echo "图片相同":如果 compare 命令的输出中不存在非零的行(即两张图片相同),则输出 “图片相同”。
  • fi:表示条件语句的结束。

至于为什么除了图片是否相同的提示外还会输出数字,这是因为 compare 命令使用 -metric AE 参数时,会计算出两张图片的差异值,并将其作为输出之一。如果两张图片完全相同,则差异值为 0。而这段代码通过 grep -v "0$" 过滤掉了差异值为 0 的行,所以只要输出中存在非零行,就会被判断为两张图片不同。

如果你不希望输出差异值,可以将代码修改为以下形式:

if compare -metric AE p1.png p2.png null: 2>&1 | grep -v "0$" > /dev/null; then
    echo "两张图片不同"
else
    echo "两张图片相同"
fi

这样,通过将 grep 命令的输出重定向到 /dev/null,就不会显示差异值了。

2. 截屏

2.1 起X情况下(X window起桌面)

可使用import截屏

import -window root screenshot.png
  • import:这是ImageMagick软件包中的一个命令,用于从屏幕或窗口中截图。

  • -window root:这是import命令的一个选项,指定要截取的窗口。在这种情况下,"root"表示截取整个屏幕。

  • screen.png:这是截图保存的文件名。你可以根据需要更改文件名或路径。

请注意,为了运行该命令,你需要系统中已经安装了ImageMagick软件包。如果你在自己的计算机上运行该命令,请确保已正确安装ImageMagick,并且在命令行环境中可用。

import 和 convert 命令隶属于 ImageMagick 软件包。你可以通过运行以下命令来安装 ImageMagick 软件包

Debian/Ubuntu:sudo apt-get install imagemagick
CentOS/RHEL:sudo yum install ImageMagick
Arch Linux:sudo pacman -S imagemagick
2.2 没有起X或没有X系统环境下

进行截屏操作可以通过 Framebuffer 来实现。使用 fbgrab 命令来对 Framebuffer 进行截屏.

sudo apt install fbcat
sudo fbgrab screenshot.png
  • 这会将 Framebuffer 的内容保存为 “screenshot.png” 文件。

命令执行后如有输出

pnmtopng: 2 colors found
  • 表示截屏结果中只包含了两种颜色。这可能是因为 Framebuffer 中的内容较为简单,只有很少的颜色变化,导致截图结果中只有两种颜色。

请注意,该方法可能需要在系统中安装额外的软件包,并且可能需要适当的权限才能执行。另外,截图的质量和效果可能会根据系统和硬件的不同而有所差异。

补充:
fbgrab 命令获取当前系统中的 Framebuffer 内容的具体过程和细节涉及一些底层操作。下面是大致的工作流程:

  1. 打开 Framebuffer 设备:
    fbgrab 首先尝试打开 Framebuffer 设备文件(通常是 /dev/fb0)。这个设备文件代表了系统中的主要 Framebuffer 设备。

  2. 获取 Framebuffer 信息:
    通过调用 ioctl 系统调用,fbgrab 会获取到关于 Framebuffer 的详细信息,包括分辨率、像素格式、每个像素的位数等。这些信息将帮助 fbgrab 确定如何解析 Framebuffer 数据。

  3. 分配内存缓冲区:
    fbgrab 根据 Framebuffer 的分辨率和像素格式,计算出需要的内存缓冲区大小,并分配足够的内存来存储 Framebuffer 的内容。

  4. 读取 Framebuffer 数据:
    通过调用 read 系统调用,fbgrab 将 Framebuffer 的内容读取到之前分配的内存缓冲区中。

  5. 转换和编码:
    一旦 Framebuffer 的内容被成功读取到内存缓冲区中,fbgrab 将根据指定的输出格式(比如 PNG)对数据进行适当的转换和编码,以生成最终的图片数据。

  6. 保存为图片文件:
    最后,fbgrab 将生成的图片数据写入一个指定的文件中,这个文件就是你在命令中指定的输出文件(比如 “screenshot.png”)。

总的来说,fbgrab 命令通过打开 Framebuffer 设备文件、读取数据、转换和编码数据,并将结果保存为图片文件的方式,获取当前系统中的 Framebuffer 内容。

需要注意的是,由于 fbgrab 涉及底层的操作,可能需要适当的权限才能执行。而且,不同系统和硬件的 Framebuffer 实现可能会有所不同,具体的细节也可能会有差异。

3. 自动输入密码

使用 read 命令和重定向来实现这个功能。具体操作如下:

  1. 在同目录下创建一个名为 password.txt 的文件,将密码写入该文件,然后保存。

  2. 在脚本中使用以下代码进行读取密码并自动输入:

#!/bin/bash

# 读取密码文件
password=$(cat password.txt)

# 执行需要密码的命令,并将密码传递给命令
echo $password | sudo -S command

其中,cat password.txt 命令用于读取 password.txt 文件中的内容,并将其赋值给变量 passwordsudo -S command 命令则是执行需要密码的命令,并通过 -S 参数将密码从标准输入中传递给命令。

这样,当需要输入密码时,脚本会自动从 password.txt 文件中读取密码,并将其传递给命令。人无需长时间观察脚本运行状态,也无需手动输入密码。

注意:为了确保密码的安全性,建议在脚本运行完毕后删除 password.txt 文件,或者将文件权限设置为仅当前用户可读写。

你可能感兴趣的:(linux)