linux shell编程

Linux shell编程

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

一、常用功能

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.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 的行,所以只要输出中存在非零行,就会被判断为两张图片不同。

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

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 内容的具体过程和细节涉及一些底层操作。下面是大致的工作流程:

  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. 在脚本中使用以下代码进行读取密码并自动输入:

bash 复制代码
#!/bin/bash

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

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

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

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

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

相关推荐
FoldWinCard3 小时前
D5 Linux 网络及端口命令
linux·运维·服务器
零涂毕业设计4 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
tedcloud1234 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
霸道流氓气质4 小时前
KMS 密钥管理服务(Key Management Service)原理与实践
linux·服务器·数据库
SakitamaX4 小时前
LVS(Linux Virtual Server)概念详解
linux·运维·lvs
小张同学a.4 小时前
Linux系统管理
linux·运维
阿龙的工作记录5 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
代码村新手5 小时前
Linux的基本指令
linux·运维·服务器
hkj88086 小时前
Ubuntu 切换java版本
java·linux·ubuntu
撩得Android一次心动7 小时前
Linux编程笔记3【个人用】
linux·笔记