Linux shell编程
-
- 一、常用功能
-
-
- 比较图片差异
-
- 截屏
-
- 2.1 起X情况下(X window起桌面)
- 2.2 没有起X或没有X系统环境下
-
- 自动输入密码
-
一、常用功能
1. 比较图片差异
bash
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.png
和p2.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 的行,所以只要输出中存在非零行,就会被判断为两张图片不同。
如果你不希望输出差异值,可以将代码修改为以下形式:
bash
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截屏
bash
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 进行截屏.
bash
sudo apt install fbcat
sudo fbgrab screenshot.png
- 这会将 Framebuffer 的内容保存为 "screenshot.png" 文件。
命令执行后如有输出
bash
pnmtopng: 2 colors found
- 表示截屏结果中只包含了两种颜色。这可能是因为 Framebuffer 中的内容较为简单,只有很少的颜色变化,导致截图结果中只有两种颜色。
请注意,该方法可能需要在系统中安装额外的软件包,并且可能需要适当的权限才能执行。另外,截图的质量和效果可能会根据系统和硬件的不同而有所差异。
补充:
fbgrab
命令获取当前系统中的 Framebuffer 内容的具体过程和细节涉及一些底层操作。下面是大致的工作流程:
-
打开 Framebuffer 设备:
fbgrab
首先尝试打开 Framebuffer 设备文件(通常是/dev/fb0
)。这个设备文件代表了系统中的主要 Framebuffer 设备。 -
获取 Framebuffer 信息:
通过调用
ioctl
系统调用,fbgrab
会获取到关于 Framebuffer 的详细信息,包括分辨率、像素格式、每个像素的位数等。这些信息将帮助fbgrab
确定如何解析 Framebuffer 数据。 -
分配内存缓冲区:
fbgrab
根据 Framebuffer 的分辨率和像素格式,计算出需要的内存缓冲区大小,并分配足够的内存来存储 Framebuffer 的内容。 -
读取 Framebuffer 数据:
通过调用
read
系统调用,fbgrab
将 Framebuffer 的内容读取到之前分配的内存缓冲区中。 -
转换和编码:
一旦 Framebuffer 的内容被成功读取到内存缓冲区中,
fbgrab
将根据指定的输出格式(比如 PNG)对数据进行适当的转换和编码,以生成最终的图片数据。 -
保存为图片文件:
最后,
fbgrab
将生成的图片数据写入一个指定的文件中,这个文件就是你在命令中指定的输出文件(比如 "screenshot.png")。
总的来说,fbgrab
命令通过打开 Framebuffer 设备文件、读取数据、转换和编码数据,并将结果保存为图片文件的方式,获取当前系统中的 Framebuffer 内容。
需要注意的是,由于 fbgrab
涉及底层的操作,可能需要适当的权限才能执行。而且,不同系统和硬件的 Framebuffer 实现可能会有所不同,具体的细节也可能会有差异。
3. 自动输入密码
使用 read
命令和重定向来实现这个功能。具体操作如下:
-
在同目录下创建一个名为
password.txt
的文件,将密码写入该文件,然后保存。 -
在脚本中使用以下代码进行读取密码并自动输入:
bash
#!/bin/bash
# 读取密码文件
password=$(cat password.txt)
# 执行需要密码的命令,并将密码传递给命令
echo $password | sudo -S command
其中,cat password.txt
命令用于读取 password.txt
文件中的内容,并将其赋值给变量 password
。sudo -S command
命令则是执行需要密码的命令,并通过 -S
参数将密码从标准输入中传递给命令。
这样,当需要输入密码时,脚本会自动从 password.txt
文件中读取密码,并将其传递给命令。人无需长时间观察脚本运行状态,也无需手动输入密码。
注意:为了确保密码的安全性,建议在脚本运行完毕后删除 password.txt
文件,或者将文件权限设置为仅当前用户可读写。