网站高端建设开发公司,王烨个人简历,建设通网站登录不进去,网页设计与制作课程心得Linux shell编程 一、常用功能1. 比较图片差异2. 截屏2.1 起X情况下#xff08;X window起桌面#xff09;2.2 没有起X或没有X系统环境下 3. 自动输入密码 一、常用功能
1. 比较图片差异
if compare -metric AE p1.png p2.png null: 21 | grep -v 0$;… Linux shell编程 一、常用功能1. 比较图片差异2. 截屏2.1 起X情况下X window起桌面2.2 没有起X或没有X系统环境下 3. 自动输入密码 一、常用功能
1. 比较图片差异
if compare -metric AE p1.png p2.png null: 21 | grep -v 0$; thenecho 两张图片不同
elseecho 两张图片相同
ficompare -metric AE p1.png p2.png null: 21这部分代码使用 ImageMagick 的 compare 命令来比较两张图片 p1.png 和 p2.png 的差异。其中-metric AE 表示使用绝对误差Absolute Error作为度量标准。null: 是一个特殊的输出文件名用于将结果输出到空设备而不产生实际输出。21 将错误输出重定向到标准输出这样可以捕获错误信息。| 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: 21 | grep -v 0$ /dev/null; thenecho 两张图片不同
elseecho 两张图片相同
fi这样通过将 grep 命令的输出重定向到 /dev/null就不会显示差异值了。
2. 截屏
2.1 起X情况下X window起桌面
可使用import截屏
import -window root screenshot.pngimport这是ImageMagick软件包中的一个命令用于从屏幕或窗口中截图。 -window root这是import命令的一个选项指定要截取的窗口。在这种情况下root表示截取整个屏幕。 screen.png这是截图保存的文件名。你可以根据需要更改文件名或路径。
请注意为了运行该命令你需要系统中已经安装了ImageMagick软件包。如果你在自己的计算机上运行该命令请确保已正确安装ImageMagick并且在命令行环境中可用。
import 和 convert 命令隶属于 ImageMagick 软件包。你可以通过运行以下命令来安装 ImageMagick 软件包
Debian/Ubuntusudo apt-get install imagemagick
CentOS/RHELsudo yum install ImageMagick
Arch Linuxsudo pacman -S imagemagick2.2 没有起X或没有X系统环境下
进行截屏操作可以通过 Framebuffer 来实现。使用 fbgrab 命令来对 Framebuffer 进行截屏.
sudo apt install fbcat
sudo fbgrab screenshot.png这会将 Framebuffer 的内容保存为 “screenshot.png” 文件。
命令执行后如有输出
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 的文件将密码写入该文件然后保存。 在脚本中使用以下代码进行读取密码并自动输入
#!/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 文件或者将文件权限设置为仅当前用户可读写。