`

解析Linux特殊文件

    博客分类:
  • unix
 
阅读更多

如果您有Dos和Windows經驗,就大概知道系統存在若幹類型的文件,如系統文件、只讀文件、隱含文件等。在Linux/Unix下,文件類型遠比Dos/Windows系統多樣和複雜。本文以RedHat Linux為例,旨在使讀者對Linux下的文件類型有更多的了解。文中的多數內容,對其他發行版的Linux以及Aix、Solaris、Freebsd等操作系統也同樣正確。 Linux下可以用ls Cl 命令來判斷文件類型,如上 圖所示。可以依據第一列中的10個字符來判斷。 

• 
-rw-r―r―指明了1.txt文件是一個普通文件,1.txt和myprog04文件都是普通文件。以”-“開頭的都是普通文件,而以”d”開頭的是目錄文件。 

• 
brw-rw---- 指明了/dev/sda1是一個塊設備(Block Device)文件。以”b”開頭的文件都是塊設備文件。• 


• 
crw-rw----指明了/dev/lp0是一個字符設備(Chartacter Device)文件,以”c”開頭的文件都是字符設備文件。 

• 
srwxrwxrwx 指明了/var/lib/mysql/mysql.sock是一個socket文件。以””開頭的文件都是socket文件。 

• 
prwxr―r--指明了了mypipe 是一個管道文件。管道文件的一個屬性是”p”。 

• 
lrwxrwxrwx 指明了softlinKOF1.txt 是一個軟鏈接文件(或稱符號鏈接文件),該文件指向了1.txt。以”l”開頭的文件是軟鏈接文件。 

• 
-rw-r―r―開頭的hard_link_of_1.txt看上去是個普通文件,但它實際上是一個硬鏈接文件。 

• 
-rwsr-xr-x指明了myprog01是一個setUid的可執行文件,這是根據第四個字符”s”判斷的。 

• 
-rwxr-sr-x指明了myprog03是一個setGid的可執行文件,這是根據第七個字符中的”s”判斷的。 

• 
-rwsr-sr-x指明了myprog02是一個setUid加setGid的可執行文件,這是根據第四個和第七個字符中的”s”判斷的。 

• 
drwxrwxrwt 中的第一個”d”字指明了tmp文件是一個目錄,最後一個字符”t”指明了該目錄被設置了粘著位。 一、設備文件 

Linux下的/dev 目錄中有大量的設備文件。主要是塊設備文件和字符設備文件。 

塊設備文件 

在過去,在添加新磁盤後,往往需要手動增加塊設備文件。現在通常我們不需要手動增加塊設備文件,運行一下service kudzu start ,系統就會自動為您配置相應的設備。塊設備的主要特點是可以隨機讀寫,而最常見的塊設備就是磁盤,如/dev/hda1 、/dev/sda2、/dev/fd0等。 

字符設備文件 

同塊設備一樣,我們一般都可以用service kudzu start命令來自動增加、刪除或修改字符設備。最常見的字符設備是打印機和終端,他們可以接受字符流。 

/dev/null是一個非常有用的字符設備文件,送入這個設備的所有東西都被忽略。如果將任何程序的輸出結果重定向到/dev/null,則看不到任何輸出信息。甚至於,您可以將某一用戶的shell指向/dev/null 以禁止其登陸。 

管道設備文件 

管道設備文件有時候也被叫做FIFO文件(FIFO是先進先出的意思),從字面上理解,管道設備文件就是從一頭流入,從另一頭流出。通常我們會在其中做一些工作,以達到我們“吃的是草,擠出來的是奶”的目的,管道文件也有其妙用。 

以前,Unix系統對文件的最大用量用2GB的限制,雖然現在新版本的Linux、Solaris、FreeBSD等不再有此限制,但處理大文件的需求仍然存在,假設您想用鏡像(dd命令)的方式來備份一個容量為20GB分區的分區,就會產生一個20GB的文件,根據您磁盤實際的使用狀況,這個文件在壓縮後可能只有數MB到數GB,我們可以建立一個管道文件來自動實現這個壓縮過程。 

[root@linux236 root]# mknod mypipe p 

[root@linux236 root]# ls -l mypipe 

prw-r--r-- 1 root root 0 Aug 5 23:27 mypipe 

[root@linux236 root]# 

在這里,我們建立了一個叫mypipe的管道文件,用ls -l 命令可以看到它的屬性是prw-r--r--,用下面的組合命令實現鏡像和壓縮: 

[root@linux236 root]# compress < 
mypipe > 
sda6.img.Z & 


[root@linux236 root]# dd if=/dev/sda6 of=mypipe 

[root@linux236 root]# ls sda6.img.Z 

sda6.img.Z 

第一個命令使得從mypipe管道中流出的文件被壓縮為sda.img.Z文件,注意這個命令的結尾必須使用"&"符號。第二個命令將/dev/sda6分區中的資料道入管道文件mypipe,換句話說,/dev/sda6分區中的數據進入管道,而壓縮文件sda6.img.Z文件從管道中流出。 

在導出Oracle、DB2等大型數據庫時等經常會生成很大的文件,熟練的數據庫管理員往往會選擇通過管道進行壓縮的方式,對於Oracle數據庫,我們可以使用下邊的組合命令: 這樣,就會將Oracle導出的內容直接壓縮成為eXPdat.dmp.Z文件。 

compress < 
mypipe > 
expdat.dmp.Z & 


exp userid=system file=mypipe owner=scott 

第二章 鏈接文件 

鏈接文件有點類似於Windows 的所謂快捷方式,但並不完全一樣。鏈接有兩種方式,軟鏈接和硬鏈接。 

軟鏈接文件 

軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統的文件。鏈接文件甚至可以鏈接不存在的文件,這就產生一般稱之為"斷鏈"的問題(或曰“現象"),鏈接文件甚至可以循環鏈接自己。類似於編程語言中的遞歸。 

[yaoyao@linux236 yaoyao]$ ls -l 

total 0 

lrwxrwxrwx 1 yaoyao yaoyao

5 Aug 6 17:39 1.txt -> 
3.txt 

lrwxrwxrwx 1 yaoyao yaoyao

5 Aug 6 17:38 2.txt -> 
1.txt 

lrwxrwxrwx 1 yaoyao yaoyao

5 Aug 6 17:39 3.txt -> 
2.txt 

上面的三個文件形成了一個遞歸,實質上沒有任何作用。系統管理員應該避免系統出現斷鏈或循環鏈接。 

用ln -s 命令可以生成一個軟連接,如下: 

[root@linux236 test]# ln -s source_file softlink_file 

在對符號文件進行讀或寫操作的時候,系統會自動把該操作轉換為對源文件的操作,但刪除鏈接文件時,系統僅僅刪除鏈接文件,而不刪除源文件本身。 

硬鏈接文件 

info ln 命令告訴您,硬鏈接是已存在文件的另一個名字(A "hard link" is another name for an existing file),這多少有些令人困惑。硬連接的命令是 

ln -d existfile newfile 

硬鏈接文件有兩個限制 

1、不允許給目錄創建硬鏈接; 

2、只有在同一文件系統中的文件之間才能創建鏈接。 

對硬鏈接文件進行讀寫和刪除操作時候,結果和軟鏈接相同。但如果我們刪除硬鏈接文件的源文件,硬鏈接文件仍然存在,而且保留了願有的內容。這時,系統就“忘記”了它曾經是硬鏈接文件。而把他當成一個普通文件。 三、setUid、setGid文件和帶粘著位的目錄文件 

在Linux/Unix下,有一種可執行文件被setUid,這使得任意使用者在執行該文件時,都綁定了文件擁有者的權限。就好像文件帶了一把尚方寶劍一樣,setUid文件通常用來提升使用者的權限.最有代表性的su命令.普通用戶可以可以執行該命令,使自己升級為root。setUid命令的用法是: 

chmod 4755 your_program 

setGid 文件和setUid文件非常類似,它使得這使得任意使用者在執行該文件時,都綁定了文件所有組的權限.單獨setGid的文件非常少用,通常都是即setUid又setGid。不過和您猜想的可能有點不同。setUid+setGid通常並不是用來提升權限的,而是為了綁定某個特殊用戶及其組的特殊權限,例如qmail 的外圍軟件vpopmail,就使用了一個setUid+setGid的程序vchkpw來校驗用戶名和密碼。這個道理和Apache常常以nobody用戶運行一樣。其目的是為了更加安全。 

setGid 命令的用法為 

chmod 2755 your_program 

通常使用命令 

chmod 6755 yourprogram 

來使得某可執行程序同時setUid和setGid 

全能的root用戶當然可以任意setUid和setGid。但尚方寶劍不能用來假傳聖旨,普通用戶只能給屬於自己的文件配置setUid或setGid。由於setUid或setGid文件會使普通用戶提升權限,謹慎的系統管理員通常會留意系統中有setUid或setGid文件的變化。減少安全隱患。 

在Linux下,/tmp是一個存放臨時文件的目錄,要求是對所有用戶可寫。但每個用戶都只能刪除自己擁有的文件。這種情況下,就可以把目錄加一個粘著位。 

[root@yaoyao /]# ls -l |grep tmp 

drwsrwsrwt 9 root root 4096 8月7 10:50 tmp 

注意第是個字符"t",它代表了這個目錄被設置了粘著位。 

我們自行建立一個abc的目錄,使之具有和/tmp相同的特點 

chmod 777 abc 

chmod +t abc 

上述的個兩個命令組合等同於下邊的一個命令: 

chmod 1777 abc 

用ls Cl 看abc 目錄的屬性如下: 

[root@yaoyao test]# ls -l 

總用量 4 

drwsrwsrwt 2 root root 4096 8月 7 11:32 abc 

和/tmp目錄相同的需求往往在FTP服務器的upload 目錄中也存在。可以用相同的方式處理。 四、socket 文件 

socket文件類似於管道,但它是在網絡上面工作的。您到計算機就是靠它來做網絡處理的。您可能聽說過“Winsock”,那是 Windows 的套接口。我們在這里不深入談有關套接口,因為如果您不寫程序,您不會用到它,但如果您看到您系統里有個文件類型是s,您知道它是什麼就行了。 

比如說mysql 運行的時候通常會產生一個socket文件。 

[root@yaoyao tmp]# ls -l /tmp/mysql.sock 

srwxrwxrwx 1 mysql mysql 08月 7 10:03 mysql.sock 

/tmp目錄下還有一些socket文件,多半是運行Xwindows的時候產生的。 

五、疑難雜症--刪除不掉的文件 

“為什麼有些文件以討厭的減號("-")開頭做文件名,無論如何都刪除不掉,這到底為什麼?",您可能聽過您臨桌的新手這樣的叫喊過,希望同樣的事情不會發生在您的身上,這個非常容易解決,您只要用帶路徑的方法就可以把他們刪除了,假定一個文件名為"-abc",您可以用: 

rm ./-abc 或者 

rm /home/yaoyao/-abc 

命令將其輕松刪除,另外您也可以用相同的方式用vi或者其他工具對他們進行修改。 

另一些文件看上去可能一切正常,但當您嘗試刪除的時候,居然也會報錯,就象下邊一樣: 

[root@linux236 root]# ls -l 1.txt 

-rw-r--r-- 1 root root 0 Aug 5 23:00 1.txt 

[root@linux236 root]# rm -rf 1.txt 

rm: cannot unlink `1.txt': Operation not permitted 您是全能root用戶,居然系統告訴您操作不允許,是Linux瘋了麼?當然不是,如果您會用lsattr命令,問題就有了答案。 

[root@linux236 root]# lsattr 

---i---------- ./1.txt 

-------------- ./weiqi.ldif 

-------------- ./qi.schema 

秘密終於暴露了,在lsattr命令下,這個1.txt文件帶有一個"i"的屬性,所以才不可以刪除。您現在可以用下邊的一系列命令: 

[root@linux236 root]# lsattr 1.txt 

---i---------- 1.txt 

[root@linux236 root]# chattr -i 1.txt 

[root@linux236 root]# rm -rf 1.txt 

[root@linux236 root]# 

成功了,這個屬性專門用來保護重要的文件不被刪除,通常的情況下,懂得用這幾個命令的通常系統管理員有能力判斷這個文件是否可以被刪除。 如果您想給一個文件多加點保護,可以使用下邊的命令: 

chattr +i filename 

命令,這樣一來,想要刪除這個文件就要多一個步驟。同時,這樣的文件也是不可以編輯和修改的。只有root用戶才能使用chattr命令。此命令可以在Linux ext2或ext3系統上使用。 

類似於Dos和Windows文件系統,不能隨意刪除的文件多半都有其道理,即使您知道如何刪除,都應該三思而後行。 

總結 

Linux/Unix系統管理是個複雜的工作,掌握和理解Linux/Unix文件類型是必備的基礎之一。學習Linux/Unix沒有捷徑,必需通過大量的實踐和努力學習。

分享到:
评论

相关推荐

    解析Linux特殊文件.pdf

    本文主要解析了Linux中的特殊文件类型,包括设备文件、链接文件、setUid、setGid文件和带粘着位的目录、socket文件,以及一些难以处理的文件问题。 首先,设备文件是Linux系统中的重要组成部分,分为块设备文件和...

    LInux fstab文件解析

    Linux fstab 文件解析 Linux 系统中的 `/etc/fstab` 文件是一个非常重要的配置文件,它定义了静态文件系统信息,描述了存储设备和分区如何整合到整个系统中。该文件由 mount 命令读取,以确定设备和分区的挂载选项...

    Linux系统文件系统的工作原理

    ### Linux系统文件系统的工作原理 #### 一、文件系统概述 在Linux系统中,文件系统是组织和管理数据的一种方式,它将数据存储为文件,并通过目录结构来组织这些文件。Linux支持多种文件系统类型,如ext2、ext3、...

    Linux文件特殊权限SGID-UID详解

    ### Linux 文件特殊权限 SGID/SUID/Sticky Bit 详析 #### 一、引言 在 Linux 操作系统中,为了实现更为灵活和安全的权限管理机制,除了基本的读(r)、写(w)、执行(x)权限外,还引入了一些特殊的权限控制方式,包括 ...

    Linux gcc C语言解析XML文件,纯原生源代码, 无需安装三方库!

    在Linux环境下,使用gcc编译器进行C语言编程时,解析XML文件是一项常见的任务,尤其在处理配置文件或数据交换时。本项目提供了一种纯原生的解决方案,无需依赖额外的XML解析库,如libxml2等。下面将详细阐述如何在...

    Linux进程init主配置文件etcinittab的解析IT知识

    ### Linux 进程init主配置文件/etc/inittab解析 #### 概述 在Linux系统中,`init` 是所有进程的祖先,它的PID始终为1。`init`进程负责初始化整个系统,并根据系统运行级别(runlevel)来启动相应的服务。`init`...

    linux 查看文件编码

    在处理PHP文件时,如`cp.php`,确保文件编码正确至关重要,因为PHP代码中的特殊字符可能会因编码问题而引发解析错误。通常,PHP文件使用UTF-8无BOM编码,这是最兼容和推荐的标准。 除了命令行工具,还有一些图形...

    文件系统模拟LINUX

    8. **设备文件**:Linux中的设备通常被当作特殊文件处理,如/dev目录下的设备文件。模拟时需要考虑如何处理这些特殊文件。 9. **缓冲和缓存**:为了提高效率,Linux文件系统使用缓冲和缓存策略。你需要设计类似机制...

    Linux ini 文件读写

    本节将深入探讨如何在Linux环境下进行`.ini`文件的读写操作,并通过提供的源代码`inirw.c`和`inirw.h`来解析和理解其工作原理。 首先,`.ini`文件的基本结构由节(section)、键(key)和值(value)组成。每个节以...

    linux下的shell解析器

    "Linux下的shell解析器"这个主题涉及到的是如何理解和使用这种工具,尤其是如何实现其基本功能,如输入、解析和运行命令。本文将深入探讨Linux Shell的工作原理、常见种类以及`minishell`这个简化版Shell的实现。 ...

    lrc.rar_Linux 歌词秀_c语言歌词解析_lrc linux_site:www.pudn.com

    解析过程可能包括读取文件、处理LRC格式的特殊标记、解析时间戳以及与音频播放进行同步。 5. **C语言编程实践**: 在C语言中,实现歌词解析可能涉及到文件I/O操作(如`fopen`, `fgets`, `fclose`等函数)、字符串...

    C语言解析ini文件

    C语言中解析ini文件并不像高级语言那样有内置的库支持,因此通常需要自定义函数来实现。本项目提供了一个在Linux环境下运行的C语言程序,用于读取和处理ini文件。 1. ini文件结构: ini文件的基本结构由节...

    顺藤摸瓜之Linux文件系统

    VFS通过抽象出一套通用的接口和数据结构,使得内核可以支持多种不同的文件系统类型,包括但不限于基于磁盘的文件系统(如EXT2、FAT、NTFS)、网络文件系统(如NFS)以及特殊文件系统(如procfs)等。 ##### VFS基本...

    实例解析linux的IO编程

    ### 实例解析Linux的IO编程 #### Linux标准IO与文件IO概述 在深入探讨Linux的IO编程之前,我们需要先理解Linux中的两种基本IO概念:标准IO(Standard I/O)和文件IO(File I/O)。这两种IO机制在Linux系统中扮演着...

    嵌入式 Linux 根文件系统的实现

    ### 嵌入式Linux根文件系统的实现及关键技术解析 #### 摘要 本文深入探讨了嵌入式Linux根文件系统(Root File System, RootFS)的设计与实现原理,重点介绍了选择根文件系统的方法以及如何构建适用于嵌入式系统的根...

Global site tag (gtag.js) - Google Analytics