列出特定 Debian 软件包的所有命令

列出特定 Debian 软件包的所有命令

我想知道特定 Debian 软件包为我提供的命令。

例如,假设我安装了一个名为 的包x.deb。这个包肯定包含一些我可以使用的命令。

如何列出这些命令。

我知道我可以使用compgenbash 命令生成系统中所有可用命令的列表,但我需要的只是特定的包。

我尝试了解决方案:

dpkg -L postgresql-9.3 | egrep '(bin|games)/'
/usr/lib/postgresql/9.3/bin/pg_upgrade
/usr/lib/postgresql/9.3/bin/pg_ctl
/usr/lib/postgresql/9.3/bin/pg_resetxlog
/usr/lib/postgresql/9.3/bin/postgres
/usr/lib/postgresql/9.3/bin/pg_xlogdump
/usr/lib/postgresql/9.3/bin/initdb
/usr/lib/postgresql/9.3/bin/pg_controldata
/usr/lib/postgresql/9.3/bin/postmaster

我尝试了命令postgres

user@userPc:~$ postgres
No command 'postgres' found, did you mean:
 Command 'postgrey' from package 'postgrey' (universe)
postgres: command not found

答案1

使用dpkg -L pkgname并将其通过管道传输到 grep 命令来搜索bin/and games/

$ dpkg -L bash | grep -E '/(s?bin|games)/'
/bin/bash
/usr/bin/bashbug
/usr/bin/clear_console
/bin/rbash

如果您想检查所有二进制文件,无论它们是否在您中,$PATH请尝试以下 bash 函数:

find_binaries (){
    dpkg -L "$@" | while read -r; do
        [ -f "$REPLY" -a -x "$REPLY" ] && echo "$REPLY"
    done
}

像这样调用:

$ find_binaries postfix
...SNIP...
/usr/lib/postfix/postfix-files
/usr/lib/postfix/pipe
/usr/lib/postfix/proxymap
/usr/lib/postfix/local
/usr/lib/postfix/discard
...SNIP...

答案2

1. 使用专为该工作设计的工具。

最简单也可能是最可靠的方法是安装dlocate

sudo apt-get install dlocate

然后你可以运行

dlocate -lsbin package-name

正如中所解释的man dlocate

-lsbin List full path/filenames of executable files (if any) in package

2.解析包数据库

这与 @Winny 的方法类似,但经过简化

apt-file -F list package | cut -d ' ' -f 2 | 
    while read file; do [[ -x $file && -f $file ]] && echo "$file"; done

如果尚未apt-file安装,可以使用以下命令进行安装和设置:

sudo apt-get install apt-file
sudo apt-file update

上面的命令用于apt-file列出包的内容,然后列出 bash 的测试-f(这是一个文件吗?)和-x(它是可执行的吗?),如果两个测试都通过,则打印文件的名称。

请注意,虽然像下面的命令这样的东西会让你最多可执行文件:

apt-file -L list package | grep -Ew 'bin|sbin'

它不会找到全部,因为您还会在类似/opt或什至的地方获得可执行文件(例如/lib各种工具)。udev因此,虽然使用 来-w匹配整个单词可以增加正确识别文件的机会,但解析路径并不是一个好的方法,您应该使用上述方法之一。

答案3

如果您已经dlocate安装,有一个简单的方法列出已安装包中的所有命令:

dlocate -lsbin PACKAGE-NAME

使用 just dpkg,您可以列出标准 PATH 目录中的文件(它们几乎都是可执行程序,除了极少数例外):

dpkg -L PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u

例外的是几个目录——从 Debian wheezy 开始,只有两个:/usr/bin/mh/usr/bin/nu-mh

如果未安装该软件包,请替换dpkg -Lapt-file -F list

apt-file -F list PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u

虽然其他目录中有可执行文件,但它们并不意味着直接执行,这使得它们在这里无关紧要。

这些方法都错过了一组程序:那些通过备择方案机制。例如,对于ftp包中仅提供了netkit-ftp和,但该包实际上提供了命令,因为是一个符号链接,它是系统上实现之一的符号链接,可能是。以下命令(这不是一个良好编程的示例,只是一个大的单行代码)列出了包通过当前配置的替代机制提供的命令。pftpftp/usr/bin/ftp/etc/alternatives/ftpftp/usr/bin/netkit-ftp

perl -lwe 'foreach (`dpkg -L @ARGV`) {chomp; ++$p{$_}} foreach (</bin/* /sbin/* /usr/bin/* /usr/sbin/*>) {$e = readlink; next unless defined $e and $e =~ m!^/etc/alternatives/!; $t = readlink $e; print if $p{$t}}' PACKAGE_NAME…

如果您想列出可以通过当前配置为指向不同包的替代方案提供的命令,则需要解析/var/lib/dpkg/alternatives.

实现替代机制的符号链接和配置文件不是在包中注册的,而是在 中自动注册的postinst,这使得查询已卸载的包提供的替代项变得困难(如果包的安装脚本不遵循约定,实际上在技术上是不可能的) 。

答案4

使用以下命令并将 systemd 替换为您的目标包名称。该命令将列出所有可用命令及其简短的介绍

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null

相关内容