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


8

我想知道特定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

Answers:


13

使用dpkg -L pkgname并将其传递给搜索bin/和的grep命令games/

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

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

find_binaries (){
    dpkg -L "$@" | while read; 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...

bin /或游戏/外面可能有bin。
Maythux 2014年

dpkg -L apache2 | egrep'(bin | games)/'没有结果。请改善您的答案
Maythux 2014年

@Hadi apache2可能是一个不好的例子,因为该软件包是一个元软件包,通常甚至不安装在运行Apache的系统上。该命令有效-尝试coreutilsdpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich

1
+1,非常好。仅提供几个注释,您可能想要使用它grep -Ew 'bin|sbin|games',egrep已被弃用,您也可以搜索sbin。另外,这里没有理由使用for循环,while而是像我在回答中那样使用循环,这意味着您不必担心IFS和字分割。
terdon

1
来自man grepDirect invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.另外,您正则表达式将匹配包含或的任何目录,其中将包括,以及其他内容。gamesbin/usr/share/games/foosbinaff
terdon

11

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甚至/libudev例如各种工具)等地方获得可执行文件。因此,虽然使用-w来匹配整个单词会增加正确识别文件的机会,但是解析路径并不是一个好的方法,您应该改用上述方法之一。


可执行文件属于用户/opt/lib不旨在由用户调用,因此您不应列出它们。`apt-file -F列表$ package | grep -E'^(/ usr)/(s?bin | games)/'给您列表,但有一个例外:Alternatives
吉尔斯2014年

@Gilles我不明白为什么不行,OP询问了命令,这些命令是否本来是要手动运行的才是重点。另外,有充分的理由使用其中的一些理由,例如,/lib/udev/findkeyboards编写键盘udev规则时非常有用。
terdon

/lib/udev/rule_generator.functions也会有用。如果您开始列出所有有用的内容,那么不仅需要列出可执行文件,还包括任何类型的代码库。
吉尔斯2014年

2

如果已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-ftppftp,但是此包实际上提供了ftp命令,因为它/usr/bin/ftp是一个符号链接,与/etc/alternatives/ftp该符号链接的链接ftp可能是系统上的一种实现/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,这使得查询已卸载的软件包提供的替代方案非常困难(实际上,如果软件包的安装脚本未遵循约定,从技术上讲是不可能的) 。


0
  1. 通常,* bin /是放置所有程序的最常见位置。即使使用链接。因此,几乎没有必要考虑* bin /之外的命令。
  2. 如果您尚未安装apache2,dpkg -L那么肯定不会给您结果。请尝试使用apt-file工具(您需要安装它)。
  3. 名称apache2是一个元软件包,它不包含任何程序。

-1

在以下命令中使用,并用目标软件包名称替换systemd。该命令将分别列出所有可用的命令及其一线介绍

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.