shell 判断可执行文件

本文介绍如何使用bash脚本查找RPM包中的命令文件和服务。内容包括:如何列出RPM包中所有命令文件,如何排除非可执行文件,如何查找系统已安装RPM包的可执行文件,如何定位特定RPM包的可执行文件,以及如何判断命令是否由C语言编写。同时,提供了脚本示例,用于将可执行文件放入COMMANDS数组,服务放入SERVICES数组。

写一个脚本,找出rpm包里的所有的命令文件

你可以使用下面的 bash 脚本来获取 RPM 包中所有命令文件的列表:

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage: $0 <RPM package>"
  exit 1
fi

RPM_PACKAGE=$1

if [ ! -f $RPM_PACKAGE ]; then
  echo "Error: $RPM_PACKAGE does not exist."
  exit 1
fi

# Extract the contents of the RPM package to a temporary directory
TEMP_DIR=`mktemp -d`
rpm2cpio $RPM_PACKAGE | cpio -idmv $TEMP_DIR

# Search for all executable files in the temporary directory
find $TEMP_DIR -type f -executable | while read file; do
  # Skip files that are not in the standard PATH
  if [[ "$file" != "/usr/bin/"* ]] && [[ "$file" != "/usr/sbin/"* ]]; then
    continue
  fi
  echo $file
done

# Clean up the temporary directory
rm -rf $TEMP_DIR

脚本将输出 RPM 包中所有命令文件的列表,这些文件通常位于 /usr/bin/usr/sbin 目录下。

如果有的命令文件不在/usr/bin 或 /usr/sbin目录下,怎么办

如果 RPM 包中的命令文件不在 /usr/bin/usr/sbin 目录下,可以通过修改脚本来处理。

例如,如果命令文件存在于 /usr/local/bin 目录下,则可以更改脚本中的判断:

# Search for all executable files in the temporary directory
find $TEMP_DIR -type f -executable | while read file; do
  # Skip files that are not in the standard PATH
  if [[ "$file" != "/usr/bin/"* ]] && [[ "$file" != "/usr/sbin/"* ]] && [[ "$file" != "/usr/local/bin/"* ]]; then
    continue
  fi
  echo $file
done

RPM包里的二进制文件一定是可执行问价吗

不是所有 RPM 包中的二进制文件都是可执行文件。RPM 包可以包含各种类型的文件,其中包括二进制文件、配置文件、数据文件等。只有可执行文件才能作为命令使用,其他类型的文件通常不能直接执行。

因此,在寻找 RPM 包中的命令文件时,我们只需要查找可执行文件即可。可以使用下面的命令来查找可执行文件:

find $TEMP_DIR -type f -executable

这会列出临时目录(即 RPM 包的内容)中的所有可执行文件。

列出系统已安装rpm包的所有可执行文件

可以使用以下命令来列出系统已安装 RPM 包的所有可执行文件:

rpm -qlq $(rpm -qa) | grep 'bin/' | grep -v '/bin/$'

该命令的工作原理如下:

  1. 首先,使用 rpm -qa 命令列出所有已安装的 RPM 包。

  2. 然后,使用 rpm -qlq 命令查询每个 RPM 包的详细信息,并以列表的形式显示其中的文件。

  3. 接下来,使用 grep 命令仅列出路径中包含 "/bin/" 的文件,并使用 grep -v 命令排除以 "/bin/$" 结尾的文件。

最后,该命令将列出所有已安装 RPM 包中的可执行文件,其中包括命令文件。

为什么要排除以 "/bin/$" 结尾的文件

在 Unix 系统中,以 "/bin/$" 结尾的文件通常表示目录,而不是可执行文件。因此,我们使用 grep -v 命令排除以 "/bin/$" 结尾的文件,以避免将目录错误地列为可执行文件。

另外,需要注意的是,以 "/bin/$" 结尾的目录不一定是有效的目录,可能只是从 RPM 包中的文件列表中的一个副本。因此,如果不排除这些文件,可能会出现不必要的误导

怎么查找某rpm的可执行文件

可以使用以下命令来查找某个 RPM 包的可执行文件:

rpm -ql <package-name> | grep 'bin/' | grep -v '/bin/$'

该命令的工作原理如下:

  1. 使用 rpm -ql <package-name> 命令查询指定的 RPM 包的详细信息,并以列表的形式显示其中的文件。

  2. 然后,使用 grep 命令仅列出路径中包含 "/bin/" 的文件,并使用 grep -v 命令排除以 "/bin/$" 结尾的文件。

最后,该命令将列出指定 RPM 包中的所有可执行文件,其中包括命令文件。

find $TEMP_DIR -type f -executable,这个命令什么意思

这个命令是使用 "find" 命令在指定目录 $TEMP_DIR 中查找所有可执行文件的命令。

其中:

  • find 命令是 Unix 系统中常用的文件查找工具,用于在指定目录及其子目录中查找指定类型的文件。

  • $TEMP_DIR 是要搜索的目录的路径,例如 /tmp/var/tmp

  • -type f 选项指示 find 命令查找的是文件,而不是目录。

  • -executable 选项指示 find 命令查找的是可执行文件。

  • -exec 选项指示 find 命令将找到的每个文件作为参数执行指定的命令,在这个命令中,没有指定任何命令,因此该命令仅查找 $TEMP_DIR 中的可执行文件。

整个命令的作用是:在指定的 $TEMP_DIR 目录中查找所有可执行文件。

find $TEMP_DIR -type f -executable,使用该命令查找hl.rpm包的所有可执行文件

如果要使用该命令查找 hl.rpm 包中的所有可执行文件,请将 $TEMP_DIR 替换为 hl.rpm 包所在的目录路径:

find <path-to-hl.rpm-directory> -type f -executable

如果 hl.rpm 包在当前目录下,则可以使用以下命令:

find . -type f -executable

请注意,上面的命令仅查找可执行文件,但不保证这些文件在 hl.rpm 包中。如果需要确保查找的文件来自 hl.rpm 包,则需要使用其他命令,例如 rpm -ql hl.rpm | grep 'bin/' | grep -v '/bin/$'

ExecStart的值必须是命令吗

ExecStart 的值不必须是命令。它可以是任何可执行的内容,包括命令、脚本、程序、命令行参数等。 ExecStart 指定了 Systemd 单元启动时要执行的命令。因此,ExecStart 可以指定命令,也可以指定脚本、程序、命令行参数等。该值只需要是一个可以在命令行上执行的内容即可。

写一个脚本,功能是判断某命令是否是C语言所写的

您可以使用下面的脚本来判断某个命令是否是用 C 语言编写的:

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage: $0 <command>"
  exit 1
fi

command=$1
binary=`which $command`

if [ ! -x "$binary" ]; then
  echo "$command not found or not executable."
  exit 1
fi

file_output=`file $binary`

if [[ $file_output =~ "ELF.*executable.*C.*script" ]]; then
  echo "$command is a C program."
else
  echo "$command is not a C program."
fi

if [[ $file_output =~ "ELF.*executable.*C.*script" ]],这句话是什么意思

这句话是在使用正则表达式匹配 file_output 变量中的内容。

[[ $file_output =~ "ELF.*executable.*C.*script" ]] 这个语句判断 file_output 变量中是否含有一个字符串 "ELF.*executable.*C.*script"。如果有,那么判断结果为 true,否则为 false。

"ELF.*executable.*C.*script" 这个字符串包含了正则表达式的一些元字符:

  • ELF:表示字符串必须以 "ELF" 开头。
  • .*:表示后面可以跟任意数量的任意字符。
  • executable:表示字符串必须包含 "executable"。
  • C:表示字符串必须包含 "C"。
  • script:表示字符串必须以 "script" 结尾。

如果 file_output 变量的内容符合此模式,则说明此文件是一个 C 语言编写的可执行文件,脚本将输出 "command is a C program.";否则,脚本将输出 "command is not a C program."。

写一个脚本,功能是查找某rpm包里的可执行的命令文件和服务,将可执行文件放到数组COMMANDS里,将服务放到数组SERVICES里

你可以使用以下 shell 脚本来实现该功能:

#!/bin/bash

# The name of the RPM package
package_name=$1

# Get the list of files included in the RPM package
files=($(rpm -ql $package_name))

# Initialize arrays to store commands and services
COMMANDS=()
SERVICES=()

# Loop through the list of files
for file in "${files[@]}"; do
  # Check if the file is an executable
  if [ -x "$file" ] && [ -f "$file" ]; then
    # Add the file to the COMMANDS array
    COMMANDS+=($file)
  fi

  # Check if the file is a service
  if [ -f "$file" ] && [ "${file##*.}" == "service" ]; then
    # Add the file to the SERVICES array
    SERVICES+=($file)
  fi
done

# Print the contents of the COMMANDS array
echo "COMMANDS:"
for cmd in "${COMMANDS[@]}"; do
  echo "  $cmd"
done

# Print the contents of the SERVICES array
echo "SERVICES:"
for srv in "${SERVICES[@]}"; do
  echo "  $srv"
done

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值