写一个脚本,找出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/$'
该命令的工作原理如下:
-
首先,使用
rpm -qa命令列出所有已安装的 RPM 包。 -
然后,使用
rpm -qlq命令查询每个 RPM 包的详细信息,并以列表的形式显示其中的文件。 -
接下来,使用 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/$'
该命令的工作原理如下:
-
使用
rpm -ql <package-name>命令查询指定的 RPM 包的详细信息,并以列表的形式显示其中的文件。 -
然后,使用 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
本文介绍如何使用bash脚本查找RPM包中的命令文件和服务。内容包括:如何列出RPM包中所有命令文件,如何排除非可执行文件,如何查找系统已安装RPM包的可执行文件,如何定位特定RPM包的可执行文件,以及如何判断命令是否由C语言编写。同时,提供了脚本示例,用于将可执行文件放入COMMANDS数组,服务放入SERVICES数组。
4011

被折叠的 条评论
为什么被折叠?



