Liệt kê tất cả các lệnh của gói Debian cụ thể


9

Tôi muốn biết các lệnh mà gói Debian cụ thể cung cấp cho tôi.

Ví dụ, giả sử tôi đã cài đặt một gói được gọi x.deb. Gói này chắc chắn chứa một số lệnh mà tôi có thể sử dụng.

Làm thế nào để liệt kê các lệnh này.

Tôi biết tôi có thể sử dụng compgenlệnh bash để tạo danh sách tất cả các lệnh có sẵn trong hệ thống của mình nhưng những gì tôi cần chỉ dành cho gói cụ thể.

Tôi đã thử các giải pháp:

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

Tôi đã thử lệnh postgres

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

Câu trả lời:


13

Sử dụng dpkg -L pkgnamevà chuyển nó thành lệnh grep tìm kiếm bin/games/:

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

Nếu bạn muốn kiểm tra tất cả các nhị phân cho dù chúng có trong hàm của bạn $PATHhãy thử chức năng bash này:

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

Gọi như vậy:

$ 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...

Có thể có bin bên ngoài bin / hoặc trò chơi /.
Maythux

dpkg -L apache2 | egrep '(bin | games) /' Không có kết quả. Vui lòng cải thiện câu trả lời của bạn
Maythux

@Hadi apache2có thể là một ví dụ tồi vì gói đó là một siêu dữ liệu thường không được cài đặt trên các hệ thống chạy Apache. Lệnh hoạt động - thử coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich

1
+1, rất hay. Chỉ cần một vài ý kiến, bạn có thể muốn sử dụng grep -Ew 'bin|sbin|games'thay vào đó, egrep không được dùng nữa và bạn cũng có thể tìm kiếm sbin. Ngoài ra, không có lý do để sử dụng forvòng lặp ở đây, sử dụng whilevòng lặp như tôi đã làm trong câu trả lời của mình thay vào đó, có nghĩa là bạn không cần phải lo lắng về việc tách IFS và từ.
terdon

1
Từ man grep: Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.Ngoài ra, bạn regex, sẽ khớp với bất kỳ thư mục nào có chứa gameshoặc binsẽ bao gồm /usr/share/games/, foosbinaffvà bất kỳ thứ gì khác.
terdon

11

1. Sử dụng một công cụ được thiết kế cho công việc.

Cách dễ nhất và có lẽ là mạnh mẽ nhất là cài đặt dlocate:

sudo apt-get install dlocate

Bạn có thể chạy

dlocate -lsbin package-name

Như đã giải thích trong man dlocate:

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

2. Phân tích cơ sở dữ liệu gói

Đây là một cách tiếp cận tương tự như @ Winny nhưng được đơn giản hóa

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

Nếu bạn chưa apt-filecài đặt, bạn có thể cài đặt và thiết lập nó bằng các lệnh sau:

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

Lệnh trên sử dụng apt-fileđể liệt kê nội dung của gói và sau đó là các thử nghiệm của bash -f(đây có phải là tệp không?) Và -x(có thể thực thi được không?) Và in tên tệp nếu cả hai thử nghiệm đều được thông qua.

Lưu ý rằng trong khi một cái gì đó giống như lệnh dưới đây sẽ giúp bạn thực thi hầu hết :

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

nó sẽ không tìm thấy tất cả vì bạn cũng có thể thực thi ở những nơi như /opthoặc thậm chí /lib( udevví dụ các công cụ khác nhau ). Vì vậy, trong khi sử dụng -wđể khớp toàn bộ các từ làm tăng cơ hội xác định các tệp chính xác, phân tích đường dẫn không phải là một cách tiếp cận tốt và thay vào đó bạn nên sử dụng một trong các phương pháp trên.


Các tệp thực thi trong /opthoặc /libkhông có nghĩa là được gọi bởi người dùng, vì vậy bạn không nên liệt kê chúng. `apt-file -F list $ gói | grep -E '^ (/ usr) / (s? bin | games) /' cung cấp cho bạn danh sách, với một ngoại lệ: các lựa chọn thay thế .
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi không hiểu tại sao không, OP đã yêu cầu các lệnh, liệu những thứ này có nghĩa là được chạy thủ công hay không nằm ngoài mục đích đó. Ngoài ra, có những lý do hoàn toàn chính đáng để sử dụng một số trong số chúng, ví dụ /lib/udev/findkeyboardscó thể rất hữu ích khi viết quy tắc udev trên bàn phím .
terdon

/lib/udev/rule_generator.functionscũng có thể hữu ích Nếu bạn bắt đầu liệt kê mọi thứ hữu ích, thì đó không chỉ là các tệp thực thi mà bạn cần liệt kê, mà là bất kỳ loại thư viện mã nào.
Gilles 'SO- ngừng trở nên xấu xa'

2

Nếu bạn đã dlocatecài đặt, có một cách dễ dàng để liệt kê tất cả các lệnh trong gói đã cài đặt:

dlocate -lsbin PACKAGE-NAME

Chỉ với dpkg, bạn có thể liệt kê các tệp trong các thư mục PATH tiêu chuẩn (chúng hầu như đều là các chương trình thực thi, với rất ít ngoại lệ):

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

Các ngoại lệ là một vài thư mục - như Debian wheezy, chỉ hai: /usr/bin/mh/usr/bin/nu-mh.

Nếu gói không được cài đặt, thay thế dpkg -Lbằng apt-file -F list:

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

Mặc dù có các tệp thực thi trong các thư mục khác, nhưng chúng không có nghĩa là được thực thi trực tiếp, điều này làm cho chúng không liên quan ở đây.

Các phương thức này đều bỏ lỡ một bộ chương trình: những phương thức được cung cấp thông qua cơ chế thay thế . Ví dụ, đối với ftpgói, chỉ netkit-ftppftpđược cung cấp, nhưng gói này thực sự cung cấp ftplệnh, bởi vì đây /usr/bin/ftplà một liên kết tượng trưng /etc/alternatives/ftplà liên kết tượng trưng đến một trong những ftptriển khai trên hệ thống /usr/bin/netkit-ftp. Lệnh sau (không phải là một ví dụ về lập trình tốt, chỉ là một lệnh lớn) liệt kê các lệnh được cung cấp bởi một gói thông qua cơ chế thay thế, như được cấu hình hiện tại.

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…

Nếu bạn muốn liệt kê các lệnh có thể được cung cấp thông qua một giải pháp thay thế hiện đang được cấu hình để trỏ đến một gói khác, bạn cần phân tích các tệp trong đó /var/lib/dpkg/alternatives.

Các liên kết tượng trưng và các tệp cấu hình thực hiện các cơ chế thay thế không được đăng ký trong các gói mà được đăng ký tự động postinst, điều này gây khó khăn (và trên thực tế là không thể nếu tập lệnh cài đặt của gói không tuân theo các quy ước) để truy vấn các lựa chọn thay thế được cung cấp bởi gói đã gỡ cài đặt .


0
  1. Thông thường, * bin / là nơi phổ biến nhất để đặt tất cả các chương trình. Ngay cả khi sử dụng một liên kết. Vì vậy, có rất ít cơ hội mà bạn cần quan tâm đến các lệnh bên ngoài * bin /.
  2. Nếu bạn chưa cài đặt apache2, dpkg -Lchắc chắn sẽ không cung cấp cho bạn kết quả. Vui lòng thử công cụ apt-file (bạn cần cài đặt nó).
  3. Tên apache2 là một siêu dữ liệu, nó không chứa bất kỳ chương trình nào.

-1

sử dụng bên dưới một lệnh và thay thế systemd bằng tên gói mục tiêu của bạn. lệnh này sẽ liệt kê tất cả các lệnh có sẵn với phần giới thiệu một lớp của chúng tương ứng

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.