Linux shell编程

一、常用功能

1. 比较图片差异

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

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

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

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

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

sudo apt install fbcat
sudo fbgrab screenshot.png

命令执行后如有输出

pnmtopng: 2 colors found

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

补充:
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 文件,或者将文件权限设置为仅当前用户读写

原文地址:https://blog.csdn.net/qq_43724601/article/details/134523356

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28726.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注