文档库 最新最全的文档下载
当前位置:文档库 › Linux下ELF文件的代码签名验证机制

Linux下ELF文件的代码签名验证机制

Linux下ELF文件的代码签名验证机制
Linux下ELF文件的代码签名验证机制

1 引言

随着Linux 的不断发展,已有越来越多的人开始推广和使用Linux,其安全性也受到越来越多的挑战。ELF(Executable and Linkable Format)[1]作为Linux 下最主要的可执行二进制文件格式,自然成了病毒及各种恶意代码的攻击目标。事实证明,有不少Linux下的病毒程序就是通过直接修改ELF文件的方法来实现入侵的[10]。传统的Unix系统(包括Linux)并不会对执行的代码进行完整性和合法性检测,因而让很多病毒程序以及木马程序有机可乘。

代码签名验证是一种能够有效的防止病毒以及其他恶意代码入侵的方法。对于Linux下的代码签名验证机制,早几年就已经有人研究。文[2]提出了在安装时进行签名验证的方法,并通过修改chmod系统调用控制文件的可执行属性,但这种方法无法检测程序安装后对代码的任何修改,有一定的局限性。文[3][4][5]描述的都是在执行时进行签名验证的方法,其中[4][5]采用了缓存已验证文件的策略,使效率较[3]有很大提高。但是,它们将所有ELF文件"一视同仁",没有主次轻重之分,缺少灵活性。

本文提出了一种改进的基于ELF文件格式的代码签名验证机制,通过提供更加灵活的分级验证方式,进一步提高验证效率,并且使系统在安全性与效率方面取得平衡。

2 签名验证原理

我们采用完全符合PKCS[8] 系列标准的签名验证算法,并兼容所有符合X509格式的证书,以RSA[6][7]非对称密钥体制为基础来完成对ELF文件代码的签名验证。

2.1签名

设被签名的数据为m,其数字摘要为h。

h = Hash(m)

其中,Hash是哈希单向散列算法,如MD5、SHA-1等。

设p,q,d为签名者的私有数据,他们都包含在签名者的私钥SK中;n,e为签名者的公开数据,并且都包含在签名者的公钥PK中。这些数据满足以下要求:

n = pq 其中p ≠q,p q均为大素数;e,d∈RZn 并且e = d-1,ed ≡1mod(n);这里,(n) = (p-1)(q-1)。那么,使用签名者私钥对h进行加密即可得到签名值s:

s = E(x) = hdmod n

2.2验证

设被验证数据为m′,其数字摘要为h′。

h′= Hash(m′)

假设我们已经取得签名者的真实公钥PK,然后我们使用PK中的公开数据e对s进行解密计算,得到还原的数字摘要h′′,这里h′′就相当于是○1式中的h。

h′′= D(s) = se mod n

现在,我们比较h′和h′′是否完全相同。如果相同则验证通过,否则验证失败。

3 设计与实现

为了便于描述,我们引入以下几个基本概念:

1. 完全摘要值--指对ELF文件的所有数据以及签名相关数据计算出来的摘要值;

2. 不完全摘要值--指对ELF文件的一部分重要数据(主要是ELF文件头)以及签名相关数

据计算出来的摘要值;

3. 完全签名值--指对完全摘要值加密所得到的签名值;

4. 不完全签名值--指对不完全摘要值加密所得到的签名值;

5. 系统验证级别--指系统级的验证级别,它适用于系统中所有的ELF文件;

6. 文件验证级别--指单个ELF文件的验证级别,它只适用于指定的某个ELF文件。

签名相关数据是指原始文件大小、签名者公钥标识ID、签名算法、签名时间以及签名者基本信息等数据。

3.1 签名策略

对ELF文件的签名是通过签名工具完成的,与操作系统核心无关,同时也和平台无关。签名过程完全遵循第二节中所描述的标准和原理。

首先,我们通过○1式计算得到两种摘要值:不完全摘要值(hpart)和完全摘要值(hcomp)。然后再通过 2 式使用签名者私钥(SKsign)加密摘要值,从而得到两种签名值:不完全签名值(spart)和完全签名值(scomp)。

最后,我们将不完全签名值和完全签名值按照固定的格式组合在一起,并放在被签名文件的末尾。如图3-1所示(括号中的数字表示该字段所占字节数)。

图3-1 代码签名过程及签名值存放

3.2 验证策略

对被执行ELF文件签名值的验证是根据"系统验证级别"和该文件的"文件验证级别"二者进行的。"文件验证级别"是为单个文件设置的验证级别,共分为3个级别,分别由0~2表示。"文件验证级别"保存在每个文件的inode节点标志中,系统管理员可以根据需要设置文件的验证级别。"文件验证级别"的具体含义如表3-1所示。

表3-1:文件验证级别

级别名称说明

0 无保护级不验证该文件的签名值。

1 中保护级验证该文件的不完全签名值。

2 高保护级验证该文件的完全签名值。

"系统验证级别"分为四级,分别由0~3表示。"系统验证级别"通过PROC文件系统来进行控制,可以由管理员根据需要进行设置。"系统验证级别"的具体含义如表3-2所示。

表3-2:系统验证级别

级别名称说明

0 无保护级执行所有程序,不进行任何验证。

1 低保护级根据"文件验证级别"验证被执行文件的签名值。

2 中保护级"文件验证级别"为0时,根据"系统验证级别"验证被执行文件的签名值;

"文件验证级别"不为0时,根据"文件验证级别"验证被执行文件的签名值。

3 高保护级验证所有被执行文件的完全签名值。

3.3验证算法

当用户请求执行某个ELF文件时,系统将根据图3-2所示的流程来判断如何验证该文件的签名值。为了提高系统效率,我们将分别为已验证过"不完全签名值"和"完全签名值"的ELF 文件维护相应的缓存,当再次请求执行这些文件时,就可以不必重复验证其签名值了。

图3-2:系统级签名值验证机制

图3-2中,"验证不完全签名值"和"验证完全签名值"两项都是整个验证过程的重要步骤。签名值的验证与签名值的生成相对应,验证时首先要根据相应的数据通过 3 式计算出摘要值(h′part或h′comp),然后再使用签名者的公钥(PKsign)通过○4 式解密相应的签名值,得到的对应的摘要值(h′′part或h′′comp)。最后比较h′和h′′是否完全一致,一致则验证通过,不一致则验证失败。

3.4公钥管理

在解密签名数据时,需要用到签名者的证书公钥。由于可能存在多个签名者签发的代码,因此也就存在多个签名者的证书。为了节省系统开销,尽量减小对系统性能的影响,我们必须高效地管理这些证书公钥。为此,我们在系统核心空间中维护了一个信任公钥链表,所有被信任者的公钥都将被放在该公钥链表中。当系统验证代码的签名值时,就可以直接从公钥链表中取得相应的公钥。如果公钥链表中没有相应的公钥,则表示该代码的签名者不被信任,因而验证失败。系统中的被信任公钥是可配置的,系统在启动时将根据配置文件自动初始化核心公钥链表,系统管理员也可以随时对其刷新或者修改。

3.5软件结构

本机制的实现主要包括用户空间的签名验证工具和核心空间的签名验证机制模块两个部分。其中,用户空间的签名验证工具是本机制的辅助工具,其主要功能是对ELF文件进行签名和设置,同时也可对ELF文件的签名值进行验证,在此不再赘述;核心空间的签名验证机制模块可以分为验证策略模块以及公钥管理模块。

3.5.1验证策略模块

验证策略模块负责执行签名值的验证策略,同时负责管理已验证文件的缓存链表。当用户请求执行ELF文件时,该模块就会执行如图3-2所示的验证策略。

验证签名值时,系统将首先查询已验证文件缓存链表,如果发现被验证文件已经被验证过,那么就不必再进行重复验证,直接采用上次的验证结果。如果缓存链表中没有被执行文件,那么就向公钥管理模块请求签名者公钥,然后再验证其签名值。如果验证正确,则说明被执行文件是完整和可信的,就让其执行;否则就禁止执行。

另外,为了保证已验证文件缓存链表和实际文件的一致性,我们必须监视ELF文件的修改情况,当某一ELF文件被修改时,我们应当立即清除已验证文件缓存链表中与该文件相关的验证结果。

3.5.2公钥管理模块

公钥管理模块主要负责对信任公钥链表进行管理,如:初始化链表,获取、添加以及删除公钥节点等。

信任公钥链表由一系列的公钥节点组成,如图3-3所示。

图3-3 核心公钥链表

其中key_id是对应公钥的MD5哈希值,长度为16个字节。从理论上说,不同公钥的key_id 相同的概率接近于2128分之一。在很大范围内,我都可以认为key_id和公钥是一一对应的。因此,我们将key_id作为每个公钥的唯一标识。

3.6性能测试

表3-3是一组简单的测试数据,这些数据是通过多次执行后取得的平均值。从中可以看出,通过使用分级机制和缓存机制,系统开销增加不到5%,大大减小了对系统性能的影响。

表3-3 验证签名的系统开销

被执行文件ls / gcc test.c

不验证签名值1489μs 567041μs

验证不完全签名值无缓存3264μs 569763μs

有缓存1513μs 567054μs

验证完全签名值无缓存8955μs 683295μs

有缓存1547μs 567482μs

环境:CPU PIV 1.7G,Kernel linux-2.4.18,签名密钥长度为1024位。

4 结束语

代码签名及验证的主要目的是防止执行病毒以及木马程序等恶意代码,提高操作系统的安全性;同时也是为了保护软件开发者以及使用者的利益,软件开发者可以防止他人冒名顶替,而软件使用者也可以确认软件的真实性和完整性。

目前,也有很多系统采用安装时验证代码签名的机制,如微软的windows系列操作系统。但是,仅仅在安装时验证代码签名存在很大的局限性,它无法检测程序安装后对代码的任何修改。因此,采用执行时验证代码签名的机制将大大提高系统的安全性。但安全性增强的同

时却导致了系统效率的降低。为了取得安全性与效率的平衡,本文提出了分级验证的机制。对安全要求高的系统,则牺牲一定的效率来提高系统安全性;对安全性要求较低的系统,则牺牲一定的安全性来提高系统效率。

参考资料

Tool Interface Standard (TIS) Portable Formats Specification V ersion 1.1:TIS Committee,October 1993

Juha-Petri K?rn? and Mika Leppinen:Signing executables in Linux. April 7th,1998

WLF tutorial,http://libeccio.dia.unisa.it/ wlf/wlf_tutorial.html

W.A. Arbaugh,G.Ballintijn,L.van Doorn:Signed Executables for Linux. Tech. Report CS-TR-4259. University of Maryland,June 4,2001

Luigi Catuogno and Ivan V isconti:A Format-Independent Architecture for Run-Time Integrity Checking of Executable Code. Dipartimento di Informatica ed Applicazioni Universitàdi Salerno Via S. Allende,84081 Baronissi (SA),Italy

OpenSSL cryptographic library man page,https://www.wendangku.net/doc/634550092.html,/docs/crypto/crypto.html OpenSSL SSL/TLS library man page,https://www.wendangku.net/doc/634550092.html,/docs/ssl/ssl.html

PKCS : Public-Key Cryptography Standards. https://www.wendangku.net/doc/634550092.html,/rsalabs/ pkcs/

Tigran Aivazian:Linux Kernel Internals. tigran@https://www.wendangku.net/doc/634550092.html,,22 August,2000

LINUX VIRUSES - ELF FILE FORMA T:Marius V an Oers A VERT-NAI Labs,Gatwickstraat 25,1043 GL Amsterdam,The Netherlands,Europe

关于作者

吴志刚,Linux 爱好者,从事过内核安全机制的研究和开发。通过alex_wzg@https://www.wendangku.net/doc/634550092.html, 可以和他联系。

本文来自CSDN博客,转载请标明出处:https://www.wendangku.net/doc/634550092.html,/Lalphbet/archive/2004/11/14/180877.aspx

pe文件格式

PE文件格式详解(一)――基础知识 什么是PE文件格式: 我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Wind ow系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和 联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,

所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。 程序是如何运行起来的: 一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑源文件;然后使用编译器编译程目标文件OBJ,这里面涉及到编译原理的知识;连接器把OBJ文件和其他一些库文件和资源文件连接起来生成EXE文件,这里面涉及到不同的连接器的知识,连接器根据OS的需要生成EXE文件保存着磁盘上;当我们运行EXE文件的时候有W indow的加载器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪些重要信息。然后生成一个进程,如果进程中涉及到多个线程还要生成一个主线程;此后进程便开始运行;这里面涉及的东西很多,包括:PE文件格式的内容;内存管理(CPU内存管理的硬件环境以及在此基础上的OS内存管理方式);模块,进程,线程的知识;只有把这些都弄清楚之后才能比较清楚的了解这整个过程。下面就让我们先来学习PE文件格式吧。

linux下编译C语言

GCC 支持了许多不同的语言,包括C、C++、Ada、Fortran、Objective C,Perl、Python 和Ruby,甚至还有Java。 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用GCC 编译的。 编译C++程序: -c 只编译不连接 g++ file1 -c -o file1.o g++ file2 -c -o file2.o g++ file1.o file.o -o exec g++ -c a.cpp 编译 g++ -o a a.o 生成可执行文件 也可以g++ -o a a.cpp直接生成可执行文件。 1. 编译单个源文件 为了进行测试,你可以创建“Hello World”程序: #include #include int main(int argc, char **argv) { printf(“Hello world!n”); exit(0); } 使用如下命令编译并测试这个代码: # gcc -o hello hello.c

# ./hello Hello wordl! 在默认情况下产生的可执行程序名为a.out,但你通常可以通过gcc 的“-o”选项来指定自己的可执行程序名称。 2. 编译多个源文件 源文件message.c包含一个简单的消息打印函数: #include void goodbye_world(void) { printf(“Goodbye, world!n”); } 使用gcc的“-c”标记来编译支持库代码: # gcc -c message.c 这一过程的输出结果是一个名为message.o的文件,它包含适合连接到一个较大程序的已编译目标代码。 创建一个简单的示例程序,它包含一个调用goodbye_world的main函数 #include void goodbye_world(void): int main(int argc, char **argv) { goodbye_world(); exit(0); }

elf文件格式

第1章文件格式 1.1 Executable and Linking Format (ELF) 1.1.1整体结构 ELF对象格式用于目标文件(.o扩展名)和执行文件. 有些信息只出现在目标文件或执行文件中. ELF文件由下列部件构成. ELF header必须放在文件的开始;其他部件可以随便排放(ELF header给出了其他部件的偏移量). 1.1.2ELF头[ELF Header] ELF头包含目标文件的一般信息;具有如下结构(from elf.h): #define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; }; ELF头域描述:

1.1.3程序头[Program Header] 程序头为一结构数组,每个元素描述执行文件的一个可载入段. 元素结构如下(from elf.h): typedef struct { Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr;

Linux下Makefile简单教程

目录 一:Makefile基本规则 1.1示例 1.2 隐式规则 1.3 伪目标 1.4 搜索源文件 二:变量 2.1使用变量定义变量值 2.2追加变量 三:条件判断 四:函数

Linux下Makefile总结 ——一步 MakeFile可以看做是一种简单的编程语言,其诞生的本质目的是实现自动化编译。 以Linux下gcc-c编译器为例,编译一个c语言程序需要经过以下几个步骤: 1.将c语言源程序预处理,生成.i文件; 2.预处理后的.i语言编译成汇编语言,生成.s文件; 3.汇编语言经过汇编,生成目标文件.o文件; 4.将各个模块的.o文件链接起来,生成一个可执行程序文件。 我们知道,在Visual C++6.0中,可以新建一个工程,在一个工程当中能够包含若干个c语言文件,则编译的时候直接编译整个工程便可。Linux下无法为多个c语言文件新建工程,但可以通过MakeFile实现它们的整合编译。 如上gcc-c编译步骤,如果使用Makefile则过程为: .C文件——>.o文件——>可执行文件 当然,Makefile中也加入了自己的设置变量方法与集成了一些函数,能够更有效地方便用户使用。 /**************************分隔符********************************/

一:Makefile基本规则 1.1示例 target ... : prerequisites ... command ... ... target也就是一个目标文件,可以是Object File,也可以是执行文件。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令) 为了方便理解,我们来看一个示例: /*Makefile示例*/ edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o gcc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o main.o : main.c defs.h #生成main.o gcc -c main.c

linux下的文件结构

linux下的文件结构,看看每个文件夹都 是干吗用的 /bin二进制可执行命令 /dev设备特殊文件 /etc系统管理和配置文件 /etc/rc.d启动的配置文件和脚本 /home用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /lib标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件/sbin系统管理命令,这里存放的是系统管理员使用的管理程序 /tmp公用的临时文件存储点 /root系统管理员的主目录(呵呵,特权阶级) /mnt系统提供这个目录是让用户临时挂载其他的文件系统。 /lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里 /proc虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。/var某些大文件的溢出区,比方说各种服务的日志文件 /usr最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:/usr/x11r6存放xwindow的目录 /usr/bin众多的应用程序 /usr/sbin超级用户的一些管理程序 /usr/doclinux文档 /usr/includelinux下开发和编译应用程序所需要的头文件 /usr/lib常用的动态链接库和软件包的配置文件

/usr/man帮助文档 /usr/src源代码,linux内核的源代码就放在/usr/src/linux里 /usr/local/bin本地增加的命令 /usr/local/lib本地增加的库 通常情况下,根文件系统所占空间一般应该比较小,因为其中的绝大部分文件都不需要经常改动,而且包括严格的文件和一个小的不经常改变的文件系统不容易损坏。除了可能的一个叫/vmlinuz标准的系统引导映像之外,根目录一般不含任何文件。所有其他文件在根文件系统的子目录中。 1./bin目录/bin目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些命令都是二进制文件的可执行程序(bin是binary--二进制的简称),多是系统中重要的系统文件。 2./sbin目录/sbin目录类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。 3./etc目录/etc目录存放着各种系统配置文件,其中包括了用户信息文件 /etc/passwd,系统初始化文件/etc/rc等。linux正是靠这些文件才得以正常地运行。 4./root目录/root目录是超级用户的目录。 5./lib目录/lib目录是根文件系统上的程序所需的共享库,存放了根文件系统程序运行所需的共享文件。这些文件包含了可被许多程序共享的代码,以避免每个程序都包含有相同的子程序的副本,故可以使得可执行文件变得更小,节省空间。 6./lib/modules目录/lib/modules目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需的模块(例如网络和文件系统驱动)。 7./dev目录/dev目录存放了设备文件,即设备驱动程序,用户通过这些文件访 问外部设备。比如,用户可以通过访问/dev/mouse来访问鼠标的输入,就像访问其他文件一样。 8./tmp目录/tmp目录存放程序在运行时产生的信息和数据。但在引导启动后,运行的程序最好使用/var/tmp来代替/tmp,因为前者可能拥有一个更大的磁盘空间。 9./boot目录/boot目录存放引导加载器(bootstraploader)使用的文件,如lilo,核心映像也经常放在这里,而不是放在根目录中。但是如果有许多核心映像,这个目录就可能变得很大,这时使用单独的文件系统会更好一些。还有一点要注意的是,要确保核心映像必须在ide硬盘的前1024柱面内。

怎样执行在Linux上运行应用程序

如何执行在Linux上运行的应用程序 关键字:Linux 先决条件 要充分理解本文,必须具备Windows 环境下桌面应用程序的工作经验,我认为读者对如何使用Linux 桌面有一个基本的了解。使用一个运行的Linux 计算来机探讨本文的概念和示例是很有帮助的。 概述 有时候第一次在Linux 上运行一个应用程序需要一点额外工作。有些应用程序,比如服务器服务,可能无法安装为服务,因此您需要从命令行启动这些应用程序。对于启动这些应用程序的用户帐户而言,需要在应用程序文件中设置执行许可标志(x)。 运行用户空间应用程序 Linux 在内核空间或用户空间运行进程。用户空间是操作系统的区域,应用程序通常在此运行。简单地说,每个用户帐户有其自己的用户空间,应用程序在这个领域内运行。 默认情况下,只有root 用户有权访问内核空间。root 用户是Linux 中的超级用户,相当于Windows 中的管理员帐户。在root 用户帐户下运行应用程序可能会引起安全风险,是不可取的。 很多服务器服务需要root 权限启动服务。然而,服务启动后,root 帐户通常会将其移至服务帐户。严格地说,Linux 中的服务帐户才是标准的用户帐户。主要区别是服务帐户仅用于运行一个服务,而不是为任何实际登录的用户准备的。 设置权限 您可以使用chmod 命令在一个文件中设置执行权限。在Linux 中,umask 设置通常用来防止下载的文件被执行,也有充分的理由相信,因为它有助于维护Linux 计算机的安全性。 大多数Linux 发行版具有一个值为022 的umask 设置,这意味着,默认情况下一个新文件权限设置为644.权限的数字表示形式采用读(4)、写(2)、执行(1) 的格式。因此,默认权限为644 的应用程序下载意味着文件所有者有读写权限,而组用户和其他用户只有读权限。 例如,为每个人赋予一个文件的执行权限,使用chmod a+x 命令。a 表示所有人,加号(+) 表示添加,而x 表示执行。同样地,如果应用程序是一个服务器服务,您应该确保只有授权帐户才有权执行此服务。 如果一个应用程序能够在标准用户帐户权限下运行,但只有特定组中的用户才需要使用它,您可以将该组所有者权限设置为可执行,然后将这些用户添加到该组中。 更具体地说,您可以在一个可执行文件中设置访问控制列表(ACL) 权限,赋予特定用户或组权限来运行该应用程序。使用setfacl 实用工具设置ACL 权限。 对于这些需要以root 用户启动进程的应用程序,比如服务器服务,您有几个选择。总结了允许用户执行需要root 权限的服务器服务的各种选项。 选项描述 作为root 用户不推荐用于服务器服务。当用户已经知道root 密码而且应用程序泄露不是首要关注问题时,可用于应用程序。 SetUID 由于安全问题,不推荐使用。SetUID 允许标准用户以另一个用户方式,比如root 用户,执行一个文件。 sudo 很常用,并且被认为是一个很好的实践。sudo 授予一个用户或组成员权限以执行可能额外需要root 权限的文件。该用户不需要知道root 密码。 带有文件权限的标准用户帐户在一个文件上为用户所有者、组所有者或其他人(所有人)

linux目录结构

1、什么是文件系统 当您使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc、usr、var、bin ... ... 等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件。文件系统在Linux下看上去就象树形结构,所以我们可以把文件系统的结构形象的称为树形结构。 linux文件系统的最顶端是/,我们称/为Linux的root,也就是 Linux操作系统的文件系统。Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。 2、文件系统的类型 LINUX有四种基本文件系统类型:普通文件、目录文件、连接文件和特殊文件,可用file命令来识别。 普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、more、vi、emacs来察看内容,用mv来改名。 目录文件:包括文件名、子目录名及其指针。它是LINUX储存文件名的唯一地方,可用ls列出目录文件。 连接文件:是指向同一索引节点的那些目录条目。用ls来查看是,连接文件的标志用l开头,而文件面后以"->"指向所连接的文件。 特殊文件:LINUX的一些设备如磁盘、终端、打印机等都在文件系统中表示出来,这一类文件就是特殊文件,常放在/dev目录内。例如,软驱A称为/dev/fd0。LINUX无C:的概念,而是用/dev/sda 来指第一硬盘。 3、目录结构的详细解说 文件系统的组织结构分析,我们能分析什么呢?也就是当我们列/目录时,所看到的/usr、 /etc ... ... /var 等目录是做什么用的,这些目录是不是有些特定的用途。无论哪个哪个版本的Linux系统,都有这些目录,这些目录应该是标准的。当然各个Linux发行版本也会存在一些小小的差异,但总体来说,大体还是差不多。 言归正传,下面将讲到本文最核心的部分:linux文件系统的目录结构。 / Linux文件系统的入口,也是处于最高一级的目录; /bin 系统所需要的那些命令位于此目录,比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命令就是放在这里。 /boot Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;

elf详解

ARM-ELF文件格式与GNU ARM Linker机制 作者:admin 日期:2008-10-13 字体大小: 小中大

里面除了二进制的机器代码,还有一些可用于进行重定位的信息。它主要是作为LINKER(ld)的输入,LINKER将跟据这些信息,将需要重定位的符号重定位,进而产生可执行的OBJECT 文件。ELF格式的可重定位OBJECT文件由header与section 组成。 Header 包括ELF header 与 section header. ELF header 位于文件的头部,用于存储目标机器的架构,大小端配置,ELF header 大小,object文件类型,section header 在文件中的偏移,section header 的大小,section header 中的项目数等信息。Section header 则定义了文件中每个section 的类型,位置,大小等信息。Linker就是通过查找ELF header,找到 section header 的入口,再在section header 中找到相应的section 入口,进而定位到目标section 的。 Section 包括 .text :经过编译的机器代码。 .rodata :只读的数据,例如printf(“hello!”)中的字符串hello。.data :已初始化的全局变量,局部变量将在运行时被存放在堆栈中,不会在.data或 .bss段中出现。 .bss :未初始化的全局变量,在这里只是一个占位符,在object 文件中并没有实际的存储空间。 .symtab :符号表,用于存放程序中被定义的或被引用到的全局变量和函数的信息。

怎么在linux操作系统上安装可执行的软件

仅以RedHat Linux 为参照,包括但不限于其他版本的Linux都要遵循此方法,以下是说明: 先来看看Linux软件扩展名。软件后缀为.rpm最初是Red Hat Linux提供的一种包封装格式,现在许多Linux发行版本都使用;后缀为.deb是Debain Linux 提供的一种包封装格式;后缀为.tar.gz、tar.Z、tar.bz2或.tgz是使用Unix 系统打包工具tar打包的;后缀为.bin的一般是一些商业软件。通过扩展名可以了解软件格式,进而了解软件安装。 RPM格式软件包的安装 1.简介 几乎所有的Linux发行版本都使用某种形式的软件包管理安装、更新和卸载软件。与直接从源代码安装相比,软件包管理易于安装和卸载;易于更新已安装的软件包;易于保护配置文件;易于跟踪已安装文件。 RPM全称是Red Hat Package Manager(Red Hat包管理器)。RPM本质上就是一个包,包含可以立即在特定机器体系结构上安装和运行的Linux软件。RPM 示意图见图1。 大多数Linux RPM软件包的命名有一定的规律,它遵循名称-版本-修正版-类型-MYsoftware-1.2 -1.i386.rpm 。 2.安装RPM包软件 #rpm -ivh MYsoftware-1.2 -1.i386.rpm RPM命令主要参数: -i 安装软件。 -t 测试安装,不是真的安装。 -p 显示安装进度。 -f 忽略任何错误。 -U 升级安装。 -v 检测套件是否正确安装。 3.卸载软件 #rpm -e 软件名 需要说明的是,上面代码中使用的是软件名,而不是软件包名。例如,要卸载software-1.2.-1.i386.rpm这个包时,应执行: #rpm -e software 4.强行卸载RPM包

elf文件资料格式(中文版)

3. 页标题的容和文章的页脚已经在开始的时候被换掉了。 4. 文章的排版也已经修正过了。 5. 如果必要,不同的字体已经被忽略了。大部分地方,这片文档能让你 充分的理解。然而,很小的地方,原始的文档使用了斜体字来指出文 章中的字符变量。在那种情况下,本文使用<尖括号>。在原始的文档 中没有出现尖括号。 6. 原始的文档有三个错误,如果你是不经意读它的话,是不会明显 就能找出的。但是在这里,明确的被鉴别出来了。 我很冒昧的纠正了那些错误。在他们的位置用一个{*}做上了标记。 可能还有其他我没有看出来的的错误。 如果有如何其他的区别都是我的责任。这样的错误请 mailto:breadboxmuppetlabs.. Brian Raiter [Last edited Fri Jul 23 1999] ________________________________________________________________ EXECUTABLE AND LINKABLE FORMAT (ELF) Portable Formats Specification, Version 1.1 Tool Interface Standards (TIS) ________________________________________________________________ =========================== Contents 容=========================== 序言 1. OBJECT文件 导言 ELF头(ELF Header) Sections String表(String Table) Symbol表(Symbol Table) 重定位(Relocation) 2. 程序装载与动态连接 导言 Program头(Program Header)

如何在linux中自由执行python程序

可执行的Python程序 这部分内容只对Linux/Unix用户适用,不过Windows用户可能也对程序的第一行比较好奇。首先我们需要通过chmod命令,给程序可执行的许可,然后运行程序。 chmod命令用来改变文件的模式,给系统中所有用户这个源文件的执行许可。然后我们可以直接通过指定源文件的位置来执行程序。我们使用./来指示程序位于当前目录。 为了更加有趣一些,你可以把你的文件名改成仅仅helloworld,然后运行./helloworld。这样,这个程序仍然可以工作,因为系统知道它必须用源文件第一行指定的那个解释器来运行程序。 只要知道程序的确切位置,你现在就可以运行程序了——但是如果你希望你的程序能够从各个位置运行呢?那样的话,你可以把你的程序保存在PATH环境变量中的目录之一。每当你运行任何程序,系统会查找列在PATH环境变量中的各个目录。然后运行那个程序。你只要简单地把这个源文件复制到PATH所列目录之一就可以使你的程序在任何位置都可用了。

我们能够用echo命令来显示PATH变量,用$给变量名加前缀以向shell 表示我们需要这个变量的值。我们看到/home/swaroop/bin 是PATH变量中的目录之一。swaroop是我的系统中使用的用户名。通常,在你的系统中也会有一个相似的目录。你也可以把你选择的目录添加到PATH变量中去——这可以通过运行PATH=$PATH:/home/swaroop/mydir完成,其中“/home/swaroop/mydir”是我想要添加到PATH变量中的目录。 当你想要在任何时间、任何地方运行你的程序的时候,这个方法十分有用。它就好像创造你自己的指令,如同cd或其他Linux终端或DOS提示符命令那样。

关于ELF文件格式

现代Linux采用ELF(Executable and Linking Format)做为其可连接和可执行文件的格式,因此ELF格式也向我们透出了一点Linux核内的情景,就像戏台维幕留下的一条未拉严的缝。 PC世界32仍是主流,但64位的脚步却已如此的逼近。如果你对Windows比较熟悉,本文还将时时把你带回到PE中,在它们的相似之处稍做比较。ELF文件以“ELF 头”开始,后面可选择的跟随着程序头和节头。地理学用等高线与等温线分别展示同一地区的地势和气候,程序头和节头则分别从加载与连接角度来描述EFL文件的组织方式。 ELF头 ------------------------------------------------ ELF头也叫ELF文件头,它位于文件中最开始的地方。 /usr/src/linux/include/linux/elf.h typedef struct elf32_hdr{ unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; /* Entry point */ Elf32_Off e_phoff;

Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr; #define EI_NIDENT 16 ELF头中每个字段的含意如下: Elf32_Ehdr->e_ident[] (Magic) 这个字段是ELF头结构中的第一个字段,在elf.h中EI_NIDENT被定义为16,因此它占用16个字节。e_ident的前四个字节顺次应该是0x7f、 0x45、 0x4c、 0x46,也就是"\177ELF"。这是ELF文件的标志,任何一个ELF文件这四个字节都完全相同。 16进制 8进制字母 0x7f 0177 0x45 E 0x4c L

linux下编写c源程序并编译运行

姓名:雨田河南大学rjxy 班级:XXXX 实验二Linux基本操作 实验二Linux基本操作 编写c源程序并用编译运行 【需求】 ◆在当前目录下创建新文件t.c,用vi编辑器一段简单代码,代码要求在屏幕上输出 文字“Hello Linux!”; ◆用gcc编译t.c文件,并运行,查看输出结果,若结果错误,请根据提示修改;【系统及软件环境】 操作系统:Virtualbox,Fedora 13 【实验配置文件及命令】 1.配置文件: 2.命令:touch、rpm、gcc、./等

进入Linux操作系统,应用程序-> 系统工具-> 终端,输入命令:su 输入密码切换到root超级用户。 1.在当前目录建立一个新的目录test:$ mkdir test 在test目录下建立文件t.c :$touch t.c 3编辑程序源代码:vi t.c 首先按下键盘的“i”键,字符界面下方出现“insert”提示字符,此时输入以下代码: #include "stdio.h" int main() { printf("Hello Linux!\n"); return 0; } 4 保存退出:先按下“Esc”键,然后按下“shift”和“:”键,界面上出现冒号,然后输入“xq!”或者“x”对代码保存退出。 5 由于系统默认没有安装C语言编译程序,下面进行安装gcc 程序; 此处不再赘述,以下引用实验指导书: 1.gcc的安装 (1)查看gcc是否安装 rpm –q gcc (2)指定安装源 在“系统-分配光驱”里选择“Fedora-13-i386-DVD.iso” (3)查看安装源挂载位置 df命令,可查看到虚拟光驱挂载点 返回结果为:/media/Fedora 13 i386 DVD (4)使用安装源 安装的文件为RPM安装包,所在位置为安装光盘中的“Packages”目录下,可用“cd”命令进入此目录 cd /media/ Fedora 13 i386 DVD/Packages ★由于“Fedora 13 i386 DVD”名字中有空格,若直接输入,则会提示找不到此目录,可用“tab”键自动补全 【方法】cd /media/F)/P() 则可返回如下结果: cd /media/Fedora\ 13\ i386 \DVD\ /Packages (5)查看当前目录下是否有gcc安装包

Linux目录结构

Linux目录结构包括文件类型和一些重要的文件子目录。 linux文件系统的最顶端是/,称为linux的root,所有的目录、文件、设备都在/之下。 /bin:存放系统所需要的那些命令,比如ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户可以使用的命令。 /boot:这是Linux的内核及引导系统程序所需要的文件目录,比如initrd.img等文件都位于这个目录中,grub系统引导管理器也位于这个目录。 /dev:设备文件存储目录,比如声卡、磁盘。 /etc:系统配置文件的所在,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件。 /home:普通用户目录默认存放目录。 /lib:库文件存放目录:用户无权限执行这个目录下的命令,这个目录和/usr/sbin;/usr/local/sbin目录是相似的。凡是目录sbin中包含的都是root权限才能执行的。/tmp:临时文件目录,有时用户运行程序的时候,会产生临时文件。这个目录和/var/tmp 目录相似。 /usr:这个是系统存放程序的目录,比如命令、帮助文件等。当我们安装一个linux发行版官方提供的软件包时,大多安装在这里。如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括设计字体目录/usr/share/fonts,帮助目录/usr/share/man 或/usr/share/doc,普通用户可执行文件目录/usr/bin或/usr/local/bin;超级权限用户root可执行命令存放目录,比如/usr/sbin或/usr/local/sbin等,还有程序的头文件存放目录/usr/include /var:这个目录的内容是经常变动的,/var下有/var/log这是用来存放系统日志的目录。/var/lib 用来存放一些库文件,比如MySQL的。 /media:本目录是空的,是用于挂载的。 /selinux:不知道到底是怎么用的!!! /srv:一些服务需要访问的文件存放在这 /sys:系统的核心文件 /cdrom:光驱 一些重要子目录: /etc/init.d:这个目录是用来存放系统或服务器以System V模式启动的脚本。 /etc/X11:这是X-Window相关的配置文件存放地。 /usr/bin:这个目录是可执行程序的目录,普通用户就有权限执行;当我们从系统自带的软件包安装一个程序时,他的可执行文件大多会放在这个目录。 /usr/sbin :这个目录也是可执行程序的目录,但大多存放设计系统管理的命令,只有root 权限才能执行 /usr/local:这个目录一般是用来存放用户自编译安装软件的存放目录;一般是通过源码包安装的软件,如果没有特别指定安装目录的话,一般是安装在这个目录中。 /usr/share:系统共用的东西存放地。 /usr/src:内核源码存放的目录。 Linux 目录结构及主要内容(1) ―/‖根目录部分有以下子目录: /usr 目录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的Linux发行版本的主要的应用程序,譬如,Netscape。 /var 目录包含在正常操作中被改变的文件:假脱机文件、记录文件、加锁文件、临时文件和页格式化文件等 /home 目录包含用户的文件:参数设置文件、个性化文件、文档、数据、EMAIL、缓

linux下各文件夹的结构说明及用途详细介绍解析

linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令。 /dev:设备特殊文件。 /etc:系统管理和配置文件。 /etc/rc.d:启动的配置文件和脚本。 /home:用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user 表示。 /lib:标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件。 /sbin:系统管理命令,这里存放的是系统管理员使用的管理程序。 /tmp:公用的临时文件存储点。 /root:系统管理员的主目录。 /mnt:系统提供这个目录是让用户临时挂载其他的文件系统。 /lost+found:这个目录平时是空的,系统非正常关机而留下“无家可归”的文件就在这里。 /proc:虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。 /var:某些大文件的溢出区,比方说各种服务的日志文件。 /usr:最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含: /usr/x11r6:存放x window的目录。 /usr/bin:众多的应用程序。

/usr/sbin:超级用户的一些管理程序。 /usr/doc:linux文档。 /usr/include:linux下开发和编译应用程序所需要的头文件。 /usr/lib:常用的动态链接库和软件包的配置文件。 /usr/man:帮助文档。 /usr/src:源代码,linux内核的源代码就放在/usr/src/linux 里。 /usr/local/bin:本地增加的命令。 /usr/local/lib:本地增加的库根文件系统。 通常情况下,根文件系统所占空间一般应该比较小,因为其中的绝大部分文件都不需要经常改动,而且包括严格的文件和一个小的不经常改变的文件系统不容易损坏。除了可能的一个叫/vmlinuz标准的系统引导映像之外,根目录一般不含任何文件。所有其他文件在根文件系统的子目录中。 1. /bin目录 /bin目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后。这些命令都是二进制文件的可执行程序(bin是binary的简称,多是系统中重要的系统文件。 2. /sbin目录 /sbin目录类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。 3. /etc目录

目标文件格式分析工具-ar-nm等等

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf 如果普通编程不需要了解这些东西,如果想精确控制你的目标文件的格式或者你想查看一下文件里的内容以便作出某种判断,那么你可以看一下下面的工具:ar,nm,objdump,objcopy。具体用法请参考man在线手册。 ar基本用法 ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。 下面是ar命令的格式: ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... 例如我们可以用ar rv libtest.a hello.o hello1.o来生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项,而[abcfilNoPsSuvV]部分称为任选项。 {dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个,它们的含义如下: ?d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v 则列出被删除的每个模块。 ?m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用'a','b',或'I'任选项移动到指定的位置。 ?p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文件将显示出来。 ?q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。 ?r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。 如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。 ?t:显示库的模块表清单。一般只显示模块名。 ?x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。 下面在看看可与操作选项结合使用的任选项: ?a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。

计算机操作系统实验_解析ELF文件

西北工业大学操作系统实验实验报告 一、实验目的 熟悉可执行链接文件(ELF)的结构,了解GeekOS将ELF格式的可执行程序加载到内存,建立内核线程并运行的实现技术。 二、实验要求 1.修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头),获取可执行文件长度、代码段、数据段等信息,并打印输出。并且,填充Exe_Format 数据结构中的值域。 2.掌握GeekOS在核心态运行可执行程序的原理,绘制出可执行程序在内核中加载、运行的流程图(需反映关键函数的调用关系)。 3.回答实验讲义P125页的思考题。 三、实验过程及结果 1、修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头),获取可执行文件长度、代码段、数据段等信息,并打印输出。并且,填充Exe_Format 数据结构中的值域。 答:修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,如下: ==============elf.c=================== int Parse_ELF_Executable(char *exeFileData, ulong_t exeFileLength, struct Exe_Format *exeFormat) { int i; elfHeader *head=(elfHeader*)exeFileData; programHeader *proHeader=(programHeader *)(exeFileData+head->phoff); KASSERT(exeFileData!=NULL); KASSERT(exeFileLength>head->ehsize+head->phentsize*head->phnum); KASSERT(head->entry%4==0); exeFormat->numSegments=head->phnum;

linux命令--RUN

linux命令 一、linux各种版本 linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。 二、Linux基本操作命令 首先介绍一个名词“控制台(console)”,它就是我们通常见到的使用字符操作界面的人机接口,例如dos。我们说控制台命令,就是指通过字符界面输入的可以操作系统的命令,例如dos命令就是控制台命令。我们现在要了解的是基于Linux操作系统的基本控制台命令。有一点一定要注意,和dos命令不同的是,Linux的命令(也包括文件名等等)对大小写是敏感的,也就是说,如果你输入的命令大小写不对的话,系统是不会做出你期望的响应的。 2.1 模式切换 1、由字符到图型#startx或#init 5 2、由图形到字符#logout或init 3 3、注销#logout或exit或ctrl+d 4、关机#poweroff或init 0或shutdown now或 halt -p 5、重启#reboot或init 6或shutdown -r now 2.2 获得帮助 #help提供内部命令的帮助#man或info提供外部命令的帮助。 如果你的英文足够好,那完全可以不靠任何人就精通linux,只要你会用man。Man实际上就是察看指令用法的help,学习任何一种UNIX类的操作系统最重要的就是学会使用man这个辅助命令。man是manual(手册)的缩写字,它的说明非常的详细,但是因为它都是英文,看起来非常的头痛。建议大家需要的时候再去看man,平常吗,记得一些基本用法就可以了。 2.3 ls ls [list]

相关文档
相关文档 最新文档