Linux下查看并下载命令源码包(根据命令/应用程序逆向获取并且安装其所属源码包)

使用linux的过程中,我们会熟悉各种命令,偶尔我们不禁会问,这些命令是怎么实现的,学习他们其实是学习linux高级系统编程很快捷的方法。

这些命令的源码肯定是存放在相应的包里面,但是是哪些包呢?

发行版的包管理器为我们提供了很方便的命令接口,供我们查找我们指定命令所在的包

比如我们以最普通的uname命令来说明,

  • 使用我们使用whereis或者which命令可以查找命令的绝对位置
  • 通过rpm或者dpkg命令搜索命令所属的包信息
  • 下载并安装对应的源码source包,即可得到源码

CentOS等rpm包管理器


搜索斌下载命令所属包



怎么查看某个命令的源代码

比如想查看uname这个命令的源代码

## 查看命令
which uname
## /bin/uname

##查看命令所属的包
rpm -qf /bin/uname

##下载对应的xxx.src.rpm源码包
yumdownloader --source coreutils-版本号

[问题1]

没有yumdownloader 的话可以这样子安装

yum install yum-utils

[问题2]

如果提示No Match for argument coreutil-5.97-23.el5_4.2

说明源中可能没有这个包,那么我们只能手动下载

去包站点http://vault.centos.org下载对应版本的包即可

注意

我们需要的是源码包,因此下载的应该是xxx.src.rpm的包。

安装或则解压源码包得到源码



下载了源码包以后有两种方法可以查看到源码包,

第一种方法

rpm -qpl coreutils-8.5-7.fc14.src.rpm | grep tar ##查询rpm中的tar文件,源码一般放在这里

##从rpm包中提取指定的文件

rpm2cpio coreutils-8.5-7.fc14.src.rpm | cpio -idv coreutils-8.5.tar.xz

tar xjvf coreutils-8.5.tar.xz
##到解压出来的coreutils-8.5/src/中就能找到相关的源码了

第二种方法:安装源码包

rpm -i coreutils-8.5-7.fc14.src.rpm ##安装源码包

centos和rhel一般安装后的源码在/usr/src/redhat下的各个目录下,但fedora是在~/rpmbuild/SOURCES/

可以通过locate命令查询代码包被安装到哪里了

locate coreutils*tar

/home/workhard/tmp/coreutils-8.5.tar.xz

/home/workhard/rpmbuild/SOURCES/coreutils-8.5.tar.xz

cd /home/workhard/rpmbuild/SOURCES/c

tar Jxvf coreutils-8.5.tar.xz
cd coreutils-8.5/src/
ll uname*

安装*.src.rpm后怎么卸载

cd /home/gatieme/rpmbuild/SOURCES
rpmbuild --rmsource --rmspec coreutils.spec

相关说明


yumdownloader



yumdownloader comes from the yum-utils package, if you don’t have that installed already.

yum install yum-utils

RPM用法


rpm {-i|--install} [install-options] PACKAGE_FILE ...
-f, --file FILE
Query package owning FILE.
-p, --package PACKAGE_FILE
Query an (uninstalled) package PACKAGE_FILE.
-l, --list
List files in package.
-qf:查找指定文件属于哪个RPM软件包
-qpl:列出RPM软件包内的文件信息;

rpm2cpio


Extract cpio archive from RPM Package Manager (RPM) package.

顾名思义,rpm2cpio是将rpm包文件转换成cpio归档文件

CPIO用法



cpio - copy files to and from archives

-i 抽取的意思,和"--extract"等同
-d 建立目录,和"--make-directories"等同
-v 冗余信息输出,和"--verbose"等同

rpmbuild用法


--rmsource
Remove the sources after the build
--rmspec
Remove the spec file after the build

Ubuntu等deb包



与RedHat系列的rpm包不同,Ubuntu使用的是Debian的deb包,因此搜索和安装的方式略有不同,但是思路是一样的

找到想看源码的命令属于哪个包:

dpkg -S `which cp`

coreutils: /bin/cp

下载源码:

apt-get -d source "coreutils"

其他发行版



其实我们从上面的过程就可以看到,大多数的命令源码都是在包coreutils中的,其他发行版直接下载即可

http://ftp.gnu.org/gnu/coreutils/

coreutils 是GNU下的一个软件包,包含linux下的 ls等常用命令。这些命令的实现要依赖于shell程序。

GNU/CoreUtils 是一组类 Unix 操作系统所需的基础软件包。它包含三组命令,常用的命令如 cat、ls、rm。

对于其他一些非标准的包,我们可以采用同样的方法,因为这些命令必然我们安装的包或者应用程序所自带的,比如git

再比如top命令等,就位于procps包中

时间: 2024-12-26 02:05:25

Linux下查看并下载命令源码包(根据命令/应用程序逆向获取并且安装其所属源码包)的相关文章

linux下查看进程占用端口和端口占用进程命令

Linux下查看进程占用端口: 查看程序对应进程号:ps –ef|grep 进程名 REDHAT :查看进程号所占用的端口号:netstat –nltp|grep 进程号 ubuntu:查看进程占用端口号:netstat -anp|grep pid Linux下查看端口号所使用的进程号: 使用lsof命令: lsof –i:端口号

Linux下查看CPU型号,内存大小,硬盘空间的命令

1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:删除重复行;wc –l命令:统计行数** 1.2 查看CPU核数 # cat /proc/cpuinfo | grep "cpu cores" | uniqcpu cores : 4 1.3 查看CPU型号 # cat /proc/cpuinfo | grep 'model name' |uniqmodel n

linux下查看内存的命令

top能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. 下面是对内存查看free命令输出内容的解释: total:总计物理内存的大小. used:已使用多大. free:可用有多少. Shared:多个进程共享的内存总额. Buffers/cached:磁盘缓存的大小. free -m ,加上 -m 参数,以M为单位显示 查看内存:less /proc/meminfo cat /proc/meminfo 查看cpu:less /proc/cpuinfo

在 Linux 下查看进程运行时间的命令

对于一个 Linux 系统的新手,该如何在我的 Ubuntu 服务器上查看一个进程(或者,根据进程 id 去查看)已经运行了多久呢?下面兄弟连Linux培训分享给大家好方法. ···你需要使用 ps 命令来查看关于一组正在运行的进程的信息.ps 命令提供了如下的两种格式化选项. etime 显示了自从该进程启动以来,经历过的时间,格式为 [[DD-]hh:]mm:ss. etimes 显示了自该进程启动以来,经历过的时间,以秒的形式. 如何查看一个进程已经运行的时间? 你需要在 ps 命令之后添

Linux下查看USB设备的VID、PID命令

Linux下查看PID命令 cat /proc/bus/usb/devices 或 lsusb 方法一:在/etc/init.d/rcS中添加mount -t usbfs none /proc/bus/usb. 方法二:在shell中输入mount -t usbfs /proc/bus/usb /proc/bus/usb. 前提是在编译内核时选中usb device filesystem. # cat   /proc/bus/usb /device T:  Bus=01 Lev=00 Prnt=

Linux下查看日志的命令

最近线上的事故有点多,加上公司的监控系统实在是不好用,所以为了抓更多的信息,需要去线上服务器看实时日志.作为一个萌新,居然傻傻的直接用vim打开了jetty的日志文件,近乎10个G的日志文件被vim读入内存,导致服务器的内存被撑爆,系统自动开始kill进程,最后把jetty进程kill掉了,导致了线上故障. 所以有了这篇文章,主要介绍在Linux环境下,可以用来查看日志文件并且不会占用很大内存的一些命令. Introduction 一般来说在Linux下查看文件内容的命令有以下几种: vim.v

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

linux 下查看硬盘型号、大小等信息(含Raid)

linux 下查看硬盘型号.大小等信息,机器有没有做Raid有关系 一.普通模式(该机硬盘没有做磁盘阵列) 1.fdisk -l 查看你的硬盘编号,如sda,sdb 等 2.smartctl --all /dev/sda smartctl --all /dev/sda #该命令centos自带 [[email protected] ~]# smartctl --all /dev/sda smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-504

linux下查看和设置软件的安装路径

1:你可以通过whereis 软件名来查找系统里的文件位置 比如你想查找eclipse文件,那么就: [[email protected] ~]# whereis eclipse 会显示: eclipse: /usr/bin/eclipse /usr/lib/eclipse /usr/share/eclipse 2.如果是源码安装的话,你可以使用-prefix指定安装路径 3.如果是rpm包安装的话,可以使用rpm -qal查询一下 rpm -qf /路径/程序名 可以查到一个程序属于哪个rpm