免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tanyear
打印 上一主题 下一主题

《UNIX编程环境》学习笔记 [复制链接]

论坛徽章:
0
9 [报告]
发表于 2005-12-29 14:38 |只看该作者
文件系统这一章不想说太多了。今天把它结束

2.4 关于目录

在某些unix版本上,可以用od查看目录。
因为目录其实也都是文件。
在SunOS 5.9上
在test目录下创建了hello ok两个文件

bash-2.05# ls test
hello  ok

bash-2.05# od -bc test
0000000 000 010 257 320 000 014 000 001 056 000 000 000 000 000 000 002
          \0  \b 257 320  \0  \f  \0 001   .  \0  \0  \0  \0  \0  \0 002
0000020 000 014 000 002 056 056 000 000 000 010 257 322 000 020 000 005
          \0  \f  \0 002   .   .  \0  \0  \0  \b 257 322  \0 020  \0 005
0000040 150 145 154 154 157 000 000 000 000 010 257 323 001 330 000 002
           h   e   l   l   o  \0  \0  \0  \0  \b 257 323 001 330  \0 002
0000060 157 153 000 000 000 000 000 000 000 000 000 000 000 000 000 000
           o   k  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000100 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
          \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0001000

可以看到目录也是一个包含有目录下文件名的一个文件。

但是我在linux下面,centos 4.1是不能查看目录的
# od -bc intel
od: intel: read error: Is a directory
0000000

2.5 目录与文件权限

文件的权限只能由root或者文件的拥有者来改变。
其他人即使有文件的写权限,也不能改变文件的权限

但是这种情况,如果有写的权限,可以把文件copy一份作为你自己的文件
这样你就可以为所欲为了。

-rw-rw-rw-  1 test    test       0 Jan 13 20:21 hehe
比如这样一个文件
[wrxu@lc tmp]$ chmod 644 hehe
chmod: changing permissions of `hehe': Operation not permitted

目录的权限跟文件的权限有些不同,所以这里花一定的篇幅来说明
希望对大家理解目录的权限有帮助。

目录的r权限,表示目录可读,上面有说到目录也是一个包含目录下文件名的文件,
这时候只能够用ls来读此目录。

只有具有x的权限,才能进入到目录,
这里的x并不是可执行,而是搜索的意思。

没有x权限的例子
[snms@matrix root]$ ls -l
drwxrw-rw-  2 root  root       4096 Dec 30 08:59 tmp
[snms@matrix root]$ cd tmp
-bash: cd: tmp: Permission denied
[snms@matrix root]$ ls -l tmp
total 0
?---------  ? ? ? ?           ? a
?---------  ? ? ? ?           ? b
?---------  ? ? ? ?           ? c
虽然snms用户可以读到tmp目录的权限,但是不能搜索到信息。
也不能进去目录。

没有r权限的例子
[snms@matrix root]$ ls -l
drwx-wx-wx  2 root  root       4096 Dec 30 08:59 tmp
[snms@matrix root]$ cd tmp
[snms@matrix tmp]$ ls -l
ls: .: Permission denied
[snms@matrix tmp]$ rm a
rm: remove write-protected regular empty file `a'? n

具有了x权限,所以可以进入目录,具有了w权限,所以可以删除文件
但是没有r权限,读不了目录文件,就无法得到当前目录下的内容。

w权限就是可以创建或删除文件,
注意:删除一个文件的权限与文件本身无关
即使用户对某个目录下的文件没有写的权限,但他只要具有目录的w权限,
就可以轻易的删除此目录下的任何文件。

下面的例子:snms用户删除了root的tmp文件夹下面的写保护文件。
[snms@matrix root]$ ls -l
drwxr-xrwx  2 root  root       4096 Dec 30 08:52 tmp
[snms@matrix root]$ cd tmp
[snms@matrix tmp]$ ls -l
total 12
-rw-r--r--  1 root root 0 Dec 30 08:52 a
-rw-r--r--  1 root root 0 Dec 30 08:52 b
-rw-r--r--  1 root root 0 Dec 30 08:52 c
[snms@matrix tmp]$ rm *
rm: remove write-protected regular empty file `a'?y

所以目录的写权限不要轻易的给出去。

更改权限的命令chmod
chmod [u/g/o]+/-[x/w/r] file
u,g,o分别指user,group,others
+-就是加上或者去掉某种权限

或者chmod 777 file
777这个数的三位,从左到右分别表示用户,组和others
数字的意义,4表示r,2表示w,1表示x
需要什么要的权限把它加起来就可以了。
比如用户读写(r+w),组读(r),others读(r)
                   4+2         4              4
chmod 644 file
数字的记忆办法,都是2的*次方。权限越高,数字越小。

看一个权限的应用。
前面说了用户之间的通信,比如wall,write这类的命令
可以用mesg [ y|n ]来关闭或打开

mesg命令的实质就是对用户当前所在的终端设备的写权限的更改

首先查看test用户的终端设备
test$ who am i
test     pts/1        Dec 29 19:24 (192.168.1.2)

test$ mesg
is y

test$ ls -l /dev/pts/1
crw--w----  1 test tty 136, 1 Dec 29 19:26 /dev/pts/1
test$ mesg n
$ ls -l /dev/pts/1
crw-------  1 test tty 136, 1 Dec 29 19:26 /dev/pts/1

关掉了mesg,关掉了test用户当前所在终端设备的写的权限
这个时候用户tony就不能给test发信息了
tony$ write test
write: test has messages disabled

此时test用户自己都不能写了
test$ write tony
write: you have write permission turned off.

[ 本帖最后由 tanyear 于 2005-12-30 09:37 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2005-12-28 14:54 |只看该作者
好教材,楼主继续啊

论坛徽章:
0
7 [报告]
发表于 2005-12-28 14:49 |只看该作者
我没有电子版的啊,呵呵

论坛徽章:
0
6 [报告]
发表于 2005-12-28 12:52 |只看该作者
要不就打包把

论坛徽章:
0
5 [报告]
发表于 2005-12-28 12:50 |只看该作者
你把连接地址发这就可以拉

论坛徽章:
0
4 [报告]
发表于 2005-12-27 22:21 |只看该作者
第2章 文件系统

2.1 od查看文件的字节

   文件就是字节的序列。可用od命令查看文件的字节序列

# cat  tmp                      //cat 显示文件内容
hello
123

# od -c tmp                    //-c 把字节解释为ASCII码字符
0000000   h   e   l   l   o  \n   1   2   3  \n
0000012

# od -cb tmp                 //-b 按八进制显示字节
0000000   h   e   l   l   o  \n   1   2   3  \n
        150 145 154 154 157 012 061 062 063 012
0000012

\n是换行符,在ASCII中,八进制值\n是012
左边的数字表示在文件中的位置。

2.2 文件结束

用换行来结束一行,\n,不对整行做记录或者统计。

而文件的结束没有任何标识。
内核跟踪文件的长度,当一个程序读完文件的所有字节时,就到文件尾结束了。

这个过程是,程序使用系统调用read来取得文件中的数据。
每一次调用read,它都返回文件中的下一部分,同时,还说明返回了文件中多少个字节,
当read说明“返回了零字节”,那么就到了文件尾。

用从终端输入的例子来看看
当从终端读入程序的时候,每次按下enter键,才把每一个输入行传给程序。
使用cat来观察这种情况。
#cat
123enter
123
Ctrl+d
#

然后我们看看Ctrl+d怎么结束文件的

#cat
123Ctrl+d123

Ctrl+d表示“立即把键盘输入的字符传给从终端读取程序”。
当第二次键入Ctrl+d的时候

#cat
123Ctrl+d123Ctrl+d#

shell响应一个提示符。因为cat这次没有读到任何字符。
上面说了,没有读到字符,则意味着文件结束。并且停止。
Ctrl+d 把你键入输出到终端的字符传给程序,
当你什么都没有键入时,程序就没有读入任何字符,就认为到了文件的末尾。
这就是我们键入Ctrl+d,会退出的原因。

2.3 文件结构

首先用file命令来看三种文件格式

# file /bin /bin/ls /root/install.log
/bin:              directory
/bin/ls:           ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), stripped
/root/install.log: ASCII English text

在Unix中,并不像windows靠扩展符,后缀来识别文件类型。
那么file是怎么识别各种不同的文件的呢?
这里用od命令来看看

#od -cb /bin/ls

0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
        177 105 114 106 002 001 001 000 000 000 000 000 000 000 000 000
0000020 002  \0   >  \0 001  \0  \0  \0   ?  '   @  \0  \0  \0  \0  \0
        002 000 076 000 001 000 000 000 360 047 100 000 000 000 000 000
......                    //省略一小段
*
0000760  \0  \0  \0  \0  \0  \0  \0  \0  \b  \0  \0  \0  \0  \0  \0  \0
        000 000 000 000 000 000 000 000 010 000 000 000 000 000 000 000
0001000   /   l   i   b   6   4   /   l   d   -   l   i   n   u   x   -
        057 154 151 142 066 064 057 154 144 055 154 151 156 165 170 055
0001020   x   8   6   -   6   4   .   s   o   .   2  \0 004  \0  \0  \0
        170 070 066 055 066 064 056 163 157 056 062 000 004 000 000 000
0001040 020  \0  \0  \0 001  \0  \0  \0   G   N   U  \0  \0  \0  \0  \0
        020 000 000 000 001 000 000 000 107 116 125 000 000 000 000 000
0001060 002  \0  \0  \0 004  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

file通过读入文件的前几百个字节可以查看到文件类型的线索。

[ 本帖最后由 tanyear 于 2005-12-29 14:44 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2005-12-27 07:34 |只看该作者
不同的shell对命令的解释有很细微的差别。关于mv的通配符问题。可能提示的错误信息不一样,不过大体上和书上说的并没有冲突。

如果想看一下shell到底是怎么处理的。可以执行
set -x

然后再执行那个mv命令,可以看到shell是怎么展开通配符的。

论坛徽章:
0
2 [报告]
发表于 2005-12-27 00:07 |只看该作者
1.4 shell  wildcard通配符

  常用的*?就不细说了。
  [...][匹配括号内的任何字符
#  rm [12356].txt 删除1.txt, 2.txt, 3.txt, 5.txt, 6.txt文件
#  rm [1-35-6].txt 同上
#  ls  [a-z].txt 列出所有的a.txt, ... , z.txt,等

  书上说通配符只能用于匹配已存在的文件,而不能用来创建文件。
#  mv ch.* chapter.*
   这样是不执行的。

但是在我的系统上
#  ls
1.txt  2.txt  3.txt  4.txt  5.txt  6.txt
# mv *.txt *.tx
mv: when moving multiple files, last argument must be a directory


1.5 I/O重定向(redirection)和管道(pipe)

  I/O重定向指 > , >> , < , <<
  重定向到一个文件时,会判断一个文件是否存在,不存在则创建它,然后再执行命令,写进去。
# ls
1.txt 2.txt
# ls >ls.out
# cat ls.out
1.txt
2.txt
ls.out

由于先判断文件是否存在的关系,ls.out本身也包括在里面了。

类似的情况,在管道中
# ps -ef|grep named
有时候你会grep到“grep named”这个命令。

# set -x
# ps -ef|grep named
+ grep named
+ ps -ef
root      4336  2148  0 18:47 pts/0    00:00:00 grep named

# ps -ef|grep named
+ ps -ef
+ grep named

这是因为管道的程序是“同时”运行的,而不是顺序执行。
管道中的程序是交互式的,由内核对其进行调度和同步处理,以使他们全部运行。

1.6 shell解释的情况

# sort<temp
# sort temp
这两者执行的结果是一样,但实质是有区别的。
sort<temp,是由shell解释<temp,然后作为标准输入传递给sort。
sort temp,是sort把temp看作一个变量,sort读入temp并排序。

#  rm [12356].txt  
同样,这些通配符也都是由shell来解释。而不是这些命令程序
首先shell解释[12356].txt 是1.txt , 2.txt ...
然后rm再读取1.txt , 2.txt ...
因此对于程序来说,通配符,重定向和管道都是透明的。

[ 本帖最后由 tanyear 于 2005-12-29 23:40 编辑 ]
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP