Daftar semua perintah paket Debian tertentu

9

Saya ingin tahu perintah yang ditawarkan paket Debian spesifik kepada saya.

Misalnya katakanlah saya menginstal paket yang disebut x.deb. Paket ini pasti mengandung beberapa perintah yang bisa saya gunakan.

Cara daftar perintah ini.

Saya tahu saya bisa menggunakan compgenperintah bash untuk menghasilkan daftar semua perintah yang tersedia di sistem saya, tetapi yang saya butuhkan hanya untuk paket tertentu.

Saya mencoba solusinya:

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

Saya mencoba perintah itu postgres

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

Jawaban:

13

Gunakan dpkg -L pkgnamedan pipa ke perintah grep yang mencari bin/dan games/:

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

Jika Anda ingin memeriksa semua binari terlepas dari apakah mereka ada di $PATHcoba fungsi bash ini:

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

Ajukan seperti ini:

$ 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...
Winny
sumber
Mungkin ada bin di luar bin / atau game /.
Maythux
dpkg -L apache2 | egrep '(bin | permainan) /' Tidak ada hasil. Harap tingkatkan jawaban Anda
Maythux
@ Han apache2mungkin merupakan contoh buruk karena paket itu adalah metapackage yang biasanya tidak diinstal pada sistem yang menjalankan Apache. Perintah itu berfungsi - coba coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich
1
+1, sangat bagus. Hanya beberapa komentar, Anda mungkin ingin menggunakannya grep -Ew 'bin|sbin|games', egrep sudah usang dan Anda juga dapat mencari sbin. Juga, tidak ada alasan untuk menggunakan forloop di sini, menggunakan whileloop seperti yang saya lakukan dalam jawaban saya, berarti Anda tidak perlu khawatir tentang IFS dan pemisahan kata.
terdon
1
Dari 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.Juga, Anda regex, akan cocok dengan direktori mana pun yang berisi salah satu gamesatau binyang akan menyertakan /usr/share/games/, dan juga foosbinaffdan apa pun lainnya.
terdon
11

1. Gunakan alat yang dirancang untuk pekerjaan itu.

Cara termudah dan mungkin yang paling kuat adalah menginstal dlocate:

sudo apt-get install dlocate

Anda kemudian dapat berlari

dlocate -lsbin package-name

Sebagaimana dijelaskan dalam man dlocate:

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

2. Parsikan basis data paket

Ini adalah pendekatan yang mirip dengan @ Winny tetapi disederhanakan

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

Jika Anda belum apt-filemenginstal, Anda dapat menginstal dan mengaturnya dengan perintah ini:

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

Perintah di atas digunakan apt-fileuntuk mencantumkan konten paket dan kemudian tes bash -f(apakah ini file?) Dan -x(apakah itu dapat dieksekusi?) Dan mencetak nama file jika kedua tes dilewati.

Perhatikan bahwa sementara sesuatu seperti perintah di bawah ini akan membuat Anda sebagian besar dapat dieksekusi:

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

itu tidak akan menemukan semua karena Anda juga mendapatkan executable di tempat-tempat suka /optatau bahkan /lib(berbagai udevalat misalnya). Jadi, saat menggunakan kata kunci -wuntuk mencocokkan seluruh kata meningkatkan peluang Anda untuk mengidentifikasi file dengan benar, mem-parsing path bukanlah pendekatan yang baik dan Anda harus menggunakan salah satu metode di atas.

terdon
sumber
Dapat dieksekusi di /optatau /libtidak dimaksudkan untuk dipanggil oleh pengguna, jadi Anda tidak harus mendaftar mereka. `apt-file -F list $ package | grep -E '^ (/ usr) / (s? bin | games) /' memberi Anda daftar, dengan satu pengecualian: alternatif .
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Saya tidak mengerti mengapa tidak, OP meminta perintah, apakah ini dimaksudkan untuk dijalankan secara manual atau tidak adalah selain itu intinya. Juga, ada beberapa alasan bagus untuk menggunakannya, misalnya /lib/udev/findkeyboardsbisa sangat berguna saat menulis aturan udev keyboard .
terdon
/lib/udev/rule_generator.functionsdapat bermanfaat juga. Jika Anda mulai membuat daftar semua yang berguna, maka itu bukan hanya executable yang perlu Anda daftarkan, tetapi semua jenis pustaka kode.
Gilles 'SO- stop being evil'
2

Jika Anda telah dlocatemenginstal, ada cara mudah untuk mendaftar semua perintah dalam paket yang diinstal:

dlocate -lsbin PACKAGE-NAME

Dengan hanya dpkg, Anda dapat membuat daftar file dalam direktori PATH standar (mereka hampir semua program yang dapat dieksekusi, dengan sangat sedikit pengecualian):

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

Pengecualiannya adalah beberapa direktori - perihal Debian, hanya dua: /usr/bin/mhdan /usr/bin/nu-mh.

Jika paket tidak diinstal, ganti dpkg -Ldengan apt-file -F list:

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

Walaupun ada file yang dapat dieksekusi di direktori lain, mereka tidak dimaksudkan untuk dieksekusi secara langsung, yang membuat mereka tidak relevan di sini.

Semua metode ini melewatkan serangkaian program: yang disediakan melalui mekanisme alternatif . Misalnya, untuk ftppaket, hanya netkit-ftpdan pftpdisediakan, tetapi paket ini sebenarnya menyediakan ftpperintah, karena /usr/bin/ftpmerupakan tautan simbolik /etc/alternatives/ftpyang merupakan tautan simbolik ke salah satu ftpimplementasi pada sistem, secara potensial /usr/bin/netkit-ftp. Perintah berikut (yang bukan contoh pemrograman yang baik, hanya satu-liner besar) daftar perintah yang diberikan oleh paket melalui mekanisme alternatif, seperti yang saat ini dikonfigurasi.

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…

Jika Anda ingin membuat daftar perintah yang dapat disediakan melalui alternatif yang saat ini dikonfigurasi untuk menunjuk ke paket yang berbeda, Anda perlu mengurai file /var/lib/dpkg/alternatives.

Tautan simbolik dan file konfigurasi yang menerapkan mekanisme alternatif tidak terdaftar dalam paket tetapi terdaftar secara otomatis postinst, yang menyulitkan (dan sebenarnya secara teknis tidak mungkin jika skrip instalasi paket tidak mengikuti konvensi) untuk menanyakan alternatif yang disediakan oleh paket yang dihapus instalasinya. .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0
  1. Biasanya, * bin / adalah tempat paling umum untuk menempatkan semua program. Bahkan menggunakan tautan. Jadi, sangat kecil kemungkinan Anda perlu memperhatikan perintah di luar * bin /.
  2. Jika Anda belum menginstal apache2, dpkg -Lpasti tidak akan memberi Anda hasil. Silakan coba alat file-apt (Anda harus menginstalnya).
  3. Nama apache2 adalah metapackage, tidak mengandung program apa pun.
Magicloud
sumber
-1

gunakan di bawah satu perintah dan ganti systemd dengan nama paket yang ditargetkan. perintah ini akan mencantumkan semua perintah yang tersedia dengan intro satu-barisnya masing-masing

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