显示标签为“linux”的博文。显示所有博文
显示标签为“linux”的博文。显示所有博文

2010年1月16日星期六

认识top的显示结果

top命令的显示结果如下所示:



top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
Swap: 192772k total, 0k used, 192772k free, 123988k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0

统计信息区

前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

01:06:48 当前时间
up 1:22 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:

Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s): 0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi
0.0% si

最后两行为内存信息。内容如下:

Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。

进程信息区

统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

更改显示内容

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

按大写的 FO 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转

关于linux上,CPU平均负载

一、注销登陆过的用户
先用w命令查看该用户tty号,然后用fuser -k tty号(或显示pts/*)就可以踢出了

先用w命令查看在线用户
然后
pkill -kill -t tty

如pkill -kill -t pts/1

二、CPU平均负载
为什么要监控系统的平均负载?
有时我们会感觉到系统响应很慢,但是又找不到原因,
这时要查平均负载,是否有大量的进程在排队等待

1,平均负载是什么?
特定时间间隔内运行队列中的平均进程数
好象还不够明白:就是进程队列的长度,有多少个进程在排队等待运行

2,什么是"进程队列"?
一个进程满足以下条件就会位于进程队列中
1,它没有在等待I/O操作的结果
2,它没有主动进入等待状态(即没有调用wait)
3,它没有被停止

3,如何查看平均负载?
最简单的命令是uptime
例子:
[lhd@localhost ~]$ uptime
00:44:22 up 1:17, 3 users, load average: 8.13, 5.90, 4,94

4,显示的内容是什么意思?
load average: 8.13, 5.90, 4,94
显示的是过去的1, 5, 15分钟内进程队列中的平均进程数量

5,如何衡量当前系统是否负载过高?
如果每个cpu(可以按CPU核心的数量计算)上当前活动进程数不大于3,则系统性能良好,
不大于4,表示可以接受
如大于5,则系统性能问题严重
上面例中的8.13,如果有2个cpu核心,则8.13/2=4.065, 此系统性能可以接受
建议设置严格的报警值为: CPU核心的数量
比如:CPU核心数量为2,则设置报警值为2
(这样设置是合理的,因为毕竟不是每个应用都支持多CPU及多核心)

6,查看平均负载的命令
有5个可用:
tload 能够绘制出负载变化的图形
uptime 同时显示开机以来的时间
w 同时显示出已登录的用户
top 这个对资源占用太高,不建议使用
cat /proc/loadavg 通过/proc系统信息得到平均负载
注意:如果你要持续的观察平均负载,建议用 watch uptime
或 watch cat /proc/loadavg
备注:关于watch:每隔一定时间执行指定的程序,并全屏显示结果, 时间默认是2秒.

使用uptime命令监视系统状态
a) #uptime

12:54pm up 27 min, 2 users, load average: 0.00, 0.00, 0.00

现在时间 启动了多久 几个用户在线 CPU平均负载时间(共3个)
第一个 : 1分钟内平均负载值
第二个 : 5分钟内平均负载值
第三个 : 15分钟内平均负载值

当系统负载过大时,说明有多条命令被阻塞在内存和I/O系统中
在大型linux系统中,负载为2和3表示轻载,5和6 表示中等程度的负载,10以上为过载

2009年12月27日星期日

Linux启动

# 转自:http://blog.chinaunix.net/u/23204/showart_199920.html
# 参考:Linux启动过程综述
, man init

(1) 从BIOS到内核

BIOS自检

计算机在接通电源之后首先由BIOS进行自检,即进行所谓的POST(Power On Self
Test), 然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。 在 PC 中,引导 Linux 是从 BIOS 中的地址 0xFFFF0 处开始的。BIOS 的第一个步骤是加电自检(POST)。POST 的工作是对硬件进行检测。BIOS 的第二个步骤是进行本地设备的枚举和初始化。给定 BIOS 功能的不同用法之后,BIOS 由两部分组成:POST 代码和运行时服务。当 POST 完成之后,它被从内存中清理了出来,但是 BIOS 运行时服务依然保留在内存中,目标操作系统可以使用这些服务。

要引导一个操作系统,BIOS 运行时会按照 CMOS 的设置定义的顺序来搜索处于活动状态并且可以引导的设备。引导设备可以是软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备,甚至是 USB 闪存。通常,Linux 都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。MBR 是一个 512 字节大小的扇区,位于磁盘上的第一个扇区中(0 道 0 柱面 1 扇区)。当 MBR 被加载到 RAM 中之后,BIOS 就会将控制权交给 MBR。

提取 MBR 的信息

要查看 MBR 的内容,请使用下面的命令:

# dd if=/dev/hda of=mbr.bin bs=512 count=1 # od -xa mbr.bin

这个 dd 命令需要以 root 用户的身份运行,它从 /dev/hda(第一个 IDE 盘) 上读取前 512 个字节的内容,并将其写入 mbr.bin 文件中。od 命令会以十六进制和 ASCII 码格式打印这个二进制文件的内容。
(2)启动GRUB/LILO

GRUB和LILO都是引导加载程序。最简单地 讲,引导加载程序(boot loader) 会引导操作系统。当机器引导它的操作系统时,BIOS 会读取引导介质上最前面的 512 字节(即人们所知的 主引导记录(master boot record,MBR))。在单一的 MBR 中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序。

GRUB 与 LILO 的比较

如本文开始处所述,所有引导加载程序都以类似的方式工作,满足共同的目的。不过,LILO 和 GRUB 之间有很多不同之处:

  • LILO 没有交互式命令界面,而 GRUB 拥有。
  • LILO 不支持网络引导,而 GRUB 支持。
  • LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件,必须将 LILO 第一阶段引导加载程序重写到 MBR。相对于 GRUB,这是一个更为危险的选择,因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB,如果配置文件配置错误,则只是默认转到 GRUB 命令行界面。

安全提示:

关于安全性,任何可以接触到引导磁盘/CD 的人,只需要使用没有设置安全性的 grub.conf 或 lilo.conf,就可以绕过本文中提及的所有安全措施。特别是使用 GRUB 时,因为能够引导到单用户模式,所以是一个严重的安全漏洞。解决此问题的一个简单方法是在机器的 BIOS 中禁止通过 CD 和软盘进行引导,并确保为 BIOS 设置了一个口令,使得其他人不能修改这些设置。
(3)加载内核

当内核映像被加载到内存之后,内核阶段就开始了。 内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个 zImage(压缩映像,小于 512KB)或一个 bzImage(较大的压缩映像,大于 512KB),它是提前使用 zlib 进行压缩过的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。

GRUB 中的手工引导

在 GRUB 命令行中,我们可以使用 initrd 映像引导一个特定的内核,方法如下:

grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]

grub> initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]

grub> boot

Uncompressing Linux... Ok, booting the kernel.
如果您不知道要引导的内核的名称,只需使用斜线(/)然后按下 Tab 键即可。GRUB 会显示内核和 initrd 映像列表。
(4)执行init进程

init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。init进程是所有进程的发起 者和控制者。因为在任何基于Unix的系统(比如Linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之而垮掉了。

init进程有两个作用。第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参 照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们 的父进程。快速执行一下ps -af 命令,可以列出许多父进程ID(Parent Process ID,PPID)为1的进程来。

init的第二个角色是在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。
(5)通过/etc/inittab文件进行初始化

init的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体, 装载模块,设置网络,等等。

对于RedhatLinux来说,执行的顺序为:

  • /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
    /etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
    设置初始的$PATH变量。
    配置网络。
    为虚拟内存启动交换。
    设置系统的主机名。
    检查root文件系统,以进行必要的修复。
    检查root文件系统的配额。
    为root文件系统打开用户和组的配额。
    以读/写的方式重新装载root文件系统。
    清除被装载的文件系统表/etc/mtab。
    把root文件系统输入到mtab。
    使系统为装入模块做准备。
    查找模块的相关文件。
    检查文件系统,以进行必要的修复。
    加载所有其他文件系统。
    清除几个/etc文件:/etc/mtab、/etc/fastboot和/etc/nologin。
    删除UUCP的lock文件。
    删除过时的子系统文件。
    删除过时的pid文件。
    设置系统时钟。
    打开交换。
    初始化串行端口。
    装入模块。
  • /etc/rc.d/rcX.d/[KS]

    首先终止“K”开头的服务,然后启动“S”开头的服务。

    对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级 别的数字。比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc /rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在 /etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来 关闭一个服务的,其符号链接的名字就以字母K打头。许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有先配置网络接口,就没有办法使用DNS服务 解析主机名!为了安排它们的执行顺序,在字母S或者 K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet就会在 /etc/rc.d/rc3.d/S55named之前执行。存放在/etc/rc.d/init.d子目录中的、被符号链接上的命令脚本程序是真正的实 干家,是它们完成了启动或者停止各种服务的操作过程。当 /etc/rc.d/rc运行通过每个特定的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母K打头的命令脚本程 序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递 Start参数。
  • 执行/etc/ec.d/rc.local
    Redhat Linux中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其 他初始化工作之后,登录之前执行的命令。在维护Linux系统运转的日子里,肯定会遇到需要系统管理员对开机或者关机命令脚本进行修改的情况。如果所做的 修改只在引导开机的时候起作用,并且改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local脚本。这个命令脚本程序是在引导过程的最 后一步被执行的。
  • 执行 /bin/login 程式

    login 程序会提示使用者需输入账号及密码, 接着编码并确认密码的正确性, 若二者相合, 则为使用者进行初始化环境, 并将控制权交给 shell,即等待用户登录。
    多次为止Linux启动过程全部结束。

最后笔者使用图1解释全部过程。

图1 Linux启动流程

总结:与 Linux 本身非常类似,Linux 的启动引导过程也非常灵活,可以支持众多的处理器和硬件平台。LILO 引导加载程序对引导能力进行了扩充,但是它却缺少文件系统的感知能力。最新一代的引导加载程序,例如 GRUB将更加灵活。

2009年10月3日星期六

is not in the sudoers file. This incident will be

1.#su
输入root密码。。。
2.#chmod u+w /etc/sudoers
3.#vi /etc/sudoers
在root ALL=(ALL) ALLZ下添加xxx ALL=(ALL) ALL 然后按esc键,再输入:wq!保存退出
4.#chmod u-w /etc/sudoers
问题解决!

2009年3月4日星期三

关于UNIX和Linux系统下SUID、SGID的解析

如果你对SUID、SGID仍有迷惑可以好好参考一下!



Copyright by kevintz.



由于用户在UNIX下经常会遇到SUID、SGID的概念,而且SUID和SGID涉及到系统安全,所以用户也比较关心这个问题。关于SUID、SGID的问题也经常有人提问,但回答的人一般答得不够详细,加上曾经回答过两个网友的问题,还查了一些资料,决定整理成本文,以供大家参考。限于本人的水平问题,文章中如果有不当之处,请广大网友指正。



一、UNIX下关于文件权限的表示方法和解析



SUID 是 Set User ID, SGID 是 Set Group ID的意思。



UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:



9 8 7 6 5 4 3 2 1 0

- r w x r - x r - x

第9位表示文件类型,可以为p、d、l、s、c、b和-:

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket文件

c表示字符设备文件

b表示块设备文件



第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:



r表示可读,可以读出文件的内容

w表示可写,可以修改文件的内容

x表示可执行,可运行这个程序

没有权限的位置用-表示

例子:

ls -l myfile显示为:

-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile



表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。



所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。



如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置



2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置



3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置



4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被社



其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是



1,表示有相应的权限:

11 10 9 8 7 6 5 4 3 2 1 0

S G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

11 10 9 8 7 6 5 4 3 2 1 0

上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1

-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0



给文件加SUID和SUID的命令如下:

chmod u+s filename 设置SUID位

chmod u-s filename 去掉SUID设置

chmod g+s filename 设置SGID位

chmod g-s filename 去掉SGID设置

另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。



二、SUID和SGID的详细解析



由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。

首先讲普通文件的SUID和SGID的作用。例子:

如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:

-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。

除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

下面讨论一个例子:

UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:cr--r----- 1 root system 2, 1 May 25 1998 kmem

但ps等程序要读这个文件,而ps的权限设置如下:

-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置SUID 来访问kmem,但大家注意了,bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID 位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替 SUID的程序,如果可能的话。下面来说明一下SGID对目录的影响。SUID对目录没有影响。如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。





三、关于SUID和SGID的编程



和SUID和SGID编程比较密切相关的有以下的头文件和函数:



#include

#include



uid_t getuid(void);



uid_t geteuid(void);



gid_t getgid (void);



gid_t getegid (void);



int setuid (uid_t UID);



int setruid (uid_t RUID);



int seteuid (uid_t EUID);



int setreuid (uid_t RUID,uid_t EUID);



int setgid (gid_t GID);



int setrgid (gid_t RGID);



int setegid (git_t EGID);



int setregid (gid_t RGID, gid_t EGID);



具体这些函数的说明在这里就不详细列出来了,要用到的可以用man查。





SUID/SGID :

假如你有文件a.txt

#ls -l a.txt

-rwxrwxrwx

#chmod 4777 a.txt

-rwsrwxrwx ======>注意s位置

#chmod 2777 a.txt

-rwxrwsrwx ======>注意s位置

#chmod 7777 a.txt

-rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省系统再加载的时间.



现在再看前面设置 SUID/SGID作用:

#cd /sbin

#./lsusb

...

#su aaa(普通用户)

$./lsusb

...

是不是现在显示出错?

$su

#chmod 4755 lsusb

#su aaa

$./lsusb



... 现在明白了吗?本来是只有root用户才能执行的命令,加了SUID后,普通用户就可以像root一样的用,权限提升了。上面是对于文件来说的,对于目录也差不多!

目录的S属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组,目录的T属性使得该目录的所有者及root才能删除该目录。还有对于s与S,设置SUID/SGID需要有运行权限,否则用ls -l后就会看到S,证明你所设置的SUID/SGID没有起作用。



Why we need suid,how do we use suid?



r -- 读访问



   w -- 写访问



   x -- 执行许可



   s -- SUID/SGID



   t -- sticky位



那么 suid/sgid是做什么的? 为什么会有suid位呢?



要想明白这个,先让我们看个问题:如果让每个用户更改自己的密码?



用户修改密码,是通过运行命令passwd来实现的。最终必须要修改/etc/passwd文件,而passwd的文件的属性是:



#ls -l /etc/passwd



-rw-r--r-- 1 root root 2520 Jul 12 18:25 passwd



我们可以看到passwd文件只有对于root用户是可写的,而对于所有的他用户来说都是没有写权限的。 那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢?



为了解决这个问题,SUID/SGID便应运而生。而且AT&T对它申请了专利。 呵呵。



SUID和SGID是如何解决这个问题呢?



首先,我们要知道一点:进程在运行的时候,有一些属性,其中包括 实际用户ID,实际组ID,有效用户ID,有效组ID等。 实际用户ID和实际组ID标识我们是谁,谁在运行这个程序,一般这2个字段在登陆时决定,在一个登陆会话期间, 这些值基本上不改变。



而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时,是采用了进程的有效用户ID来进行判断的。



知道了这点,我们来看看SUID的解决途径:



当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。举个例子:



[root@sgrid5 bin]# ls -l passwd



-r-s--s--x 1 root root 16336 Feb 14 2003 passwd



虽然你以test登陆系统,但是当你输入passwd命令来更改密码的时候,由于 passwd设置了SUID位,因此虽然进程的实际用户ID是test对应的ID,但是进程的有效用户ID则是passwd文件的所有者root的ID, 因此可以修改/etc/passwd文件。



让我们看另外一个例子。



ping命令应用广泛,可以测试网络是否连接正常。ping在运行中是采用了ICMP协议,需要发送ICMP报文。但是只有root用户才能建立ICMP报文,如何解决这个问题呢?同样,也是通过SUID位来解决。



[root@sgrid5 bin]# ls -l /bin/ping



-rwsr-sr-x 1 root root 28628 Jan 25 2003 /bin/ping



我们可以测试一下,如果去掉ping的SUID位,再用普通用户去运行命令,看会怎么样。



[root@sgrid5 bin]#chmod u-s /bin/ping



[root@sgrid5 bin]# ls -l ping



-rwxr-xr-x 1 root root 28628 Jan 25 2003 ping



[root@sgrid5 bin]#su test



[test@sgrid5 bin]$ ping byhh.net



ping: icmp open socket: Operation not permitted



SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐患。



因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。



因此在安全方面特别要注意那些设置了SUID的程序。



通过以下的命令可以找到系统上所有的设置了suid的文件:



[root@sgrid5 /]# find / -perm -04000 -type f -ls



对于这里为什么是4000,大家可以看一下前面的st_mode的各bit的意义就明白了。



在这些设置了suid的程序里,如果用不上的,就最好取消该程序的suid位。

2009年2月12日星期四

修改Linux时间一般涉及到3个命令: date, clock, hwclock

date: 修改系统当前的时间

#date –s ‘2005/12/5 10:01:00

系统当前的时间改成2005年12月5日,10点01分 .
这个修改在系统重启后就失效了,因此为了将这个时间永久生效,需要将修改的时间写入CMOS
机器里有两个时钟。硬件时钟从根本上讲是CMOS时钟;而系统时钟是由内核维护的,它是从1969年末(即传说中的标志Unix时代开端的那个拂晓)开始算起的累积秒数
你可以通过BIOS修改系统硬件时钟,或者如果你不想重起机器,那就用hwclock命令

查看硬件时钟用命令:
hwclock --show 或者直接hwclock
重置硬件时钟用:
hwclock --set --date="1/23/01 22:16:59" m ,$j

2009年2月10日星期二

linux设置目录和文件使用权限

ext2fs文件系统中的目录及文件,可依实际需要来设置可读取、可写入与可执行等权限。以下我们就来了解文件和目录的权限设置。

ext2fs文件系统中的目录及文件,可依实际需要来设置可读取、可写入与可执行等权限。以下我们就来了解文件和目录的权限设置,首先请执行ls –l指令,看看现在的状况:

lrwxrwxrwx 1 root root 10 Aug 18 …………

权限标识代号 拥有者 群组名称 文件与目录的相关信息

权限的意义

当执行ls –l 或ls –al 指令时所显示的结果,最前面第2-10字符是用来标识权限,第1个字符一般用于区别文件和目录:

d:表示这是一个目录,事实上在ext2fs中,目录是一种特殊的文件。

-:表示这是一个普通的文件;

l:表示这是一个符号链接的文件,实际上它指向另一个文件,详细第13-5节。

b、c:分别代表区块设备和其它的外围设备,是特殊型态的文件。

S、p:这些文件关系到系统的数据结构和管线,通常很少见到。

一般权限

第2-10字符当中每3个为一组,左边3个字符拥有者权限,中间3个字符夫示与拥有者同一群组的用户之权限,右边3个字符是其他用户的权限。关于这3个一组共9个字符,其代表意义如下:

r(Read,读取):对文件而言该用户具有读取文件内容的权限;对目录来说该用户有具有浏览目录内容的权限;

w(Write,写入):对文件该用户具有新增、修改文件内容的权限;对目录来说该用户具有删除、移动目录内文件的权限。

x(eXecute,执行):对文件而言该用户具有执行文件的权限,对目录来说该用户具有进入目录的权限。

-:表示不具有该项权限。

我们举些范例说明会更清楚:

-rwx- - - - - -:文件拥有者对文件具读取、写入与执行的权限。

-rwxr- -r- -:文件拥有者具有读、写与执行的权限;同群组及其它用户则具有读取的权限。

-rw-rw-r-x:文件拥有者与同群组的用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。

drwx- -x- -xx:目录拥有者具有读写与进入目录的权限,同群组及其他用户仅能进入该目录,却无法读取任何数据。

drwx- - - - - -:除了目录拥有者具有完整的权限之外,其他用户对该目录没有任何权限。

在前一章提到每个用户都应拥有自己的专属目录,通常集中放置于/home目录下,这些专属目录的默认权限为:

请注意上面kdeuser、linuxCon和UserAdd用位用户用不一样的方式新增用户帐号,默认权限会有所不同。如果您linuxCon程序或执行 useradd指令,默认的权限是“rwx- - - - - -”,假若使用Kuer程序来建立帐号,则默认权限变成“rwxr-xr-x”。前者表示目录拥有者本身具备所有权限,而同群组与其他用户无法进入该目录。后者代表群组与其他用户权具有进入目录的权限,却无法得知里面有哪些文件。

Root帐号执行mkdir指令所建立的目录,其权限默认为“rwxr-xr-x”,其它帐号的用户执行该指令建立之目录,默认的权限是“rwxrwxr-x”。你可以视实际需求而定,去变更目录的权限。

此外,默认的权限可用umask指令更改,用法非常简单,只需umask 777指令,便代表遮蔽所有的权限,因而之后建立的文件或目录其权限会变成000,依此类推,通常root帐号搭配的数值为027、022与077,一般用户则是采用002,这样所产生的权限依序是755、750、700和775。有关权限的数值标识法,后面将会详细说明。

(注意:umask无法遮蔽特殊权限,关于特殊的信息,请见后面)

在用户登入系统时,用户环境就会自动umask指令,来决定文件、目录之默认权限,这个部份的相关设置位于/etc/profile文件里。



现行目录与上层目录

“.”和“..”是做什么用的?相信用过dos的用户都很清楚,经常到处ftp的用户也熟悉。前者代表这个目录,后者代表上一层目录。这部份在很多操作系统里都是一样。

需要留意Unix之类的操作系统采用绝对路私径,换成dos的讲法来说明,就是当用户招待一个程序时,系统会去搜索path、append所指定的路径,而不会寻找现有所处的目录是否有这个程序。用户要执行现行目录中的程序,必须在程序前面标明./或干脆指出完整的路径。


特殊权限

其实文件与目录的权限设置不只如此,还有所谓的特殊权限存在。由于特殊权限会拥有一些“特权”,因而用户若无特殊需要,不应该去打开这些权限,避免安全方面出现严重漏洞、甚至摧毁系统。

s或S(SUID,setUID):一个可执行的文件搭配这个权限,该文件便能得到特权,任意存取该文件拥有者能使用的全部系统资源。注意具备SUID权限的文件,怪客经常利用这种特性,以SUID配上root帐号拥有者,无声无息地在系统里开扇后门,供日后进出使用。

s 或S(SUID,setGID):套用在文件上面,其效果和SUID相同,只不过将文件拥有者换成群组,该文件就可以任意存取整个群组所能使用的系统资源。套用在目录上面,则所有被复制到这个目录下的文件,其所属的群组都会被重设为和这个目录一样,除非在复制文件时加上-p(divserve,保留文件属性)的参数,。才能保留原来所属的群组设置。

t或T(sticky,粘着):曾提到/tmp和/var/tmp两个目录,开放供所有用户暂时存放文件,亦即每位用户都拥有完整的权限进入该目录,去浏览、删除和移动文件。假使碰到某位用户存心搞鬼,恣意乱删其他用户放置的文件。暂存目录将形同危险地带,造成没有任何用户能够安心利用这些目录。我们把暂存目录的sticky权限找开之后,存放在该目录的文件,仅准许其拥有者去删除、移动它,避免不守法的用户之无故骚扰。假使对文件启用这个权限,则该文件的最后更新时间(last modified time)将不会改变。

注意:Linux系统下“执行文件”其扩展名毋须非.exe不可,只要加上可执行的权限,该文件就是执行文件。Linux也没有隐藏属性、系统属性的问题,在权限许可下什么都能够看到。

因为SUID、SGID、Sticky占用X的位置来表示,所以在表示上有大小写之分,假若同时设打开执行权限和SUID、SGID与Sticky,权限标识字符是小写的形式:

-rwsr-sr-t 1 root root 9Aug 19 21:47 showme

倘若关闭执行的权限,则标识字符会变成大写:

-rwSr-Sr-T 1 root root 9Aug 19 21:47 showme

改变权限

要更改文件或目录的权限,有多种方法可以选择,下面我们将一一介绍。

文件管理员

在linux中,图形界面的文件管理员能够轻易地改变文件、目录的权限,无讼使用GNOME的gmc或KDE的kfm都可:

方法:在要改变的文件和目录上面点击右键/属性/权限

数字改变法

文件或目录的权限标识,是用“rwx”这3个字符重复3次形成9个字符,分别代表拥有者、群组和其他用户的权限。有些时候9个字符似乎过于麻烦,因此还有另外一种方法,是以数字来表示权限,而且仅需3个数字就能搞定。

r:对应数值为4;

w:对应数值为2;

x:对应数值为1;

-:对应数值为0。

遵循上述法则,“rwx”合起来就是4+2+1=7,一个“rwxrwxrwx”权限全开的文件,它的数字标识为“777”;而完全不开放的权限文件“- - - - - - - - - ”,它的数值标识为“000”。下面我们举几个例子说明:

-rwx- - - - - :等于数字标识700;

-rwxr- -r- - :等于数字标识744;

-rw-rw-r-x:等于数字标识665;

drwx- -x- -x:等于数字标识711;

drwx- - - - - -等于数字标识700。

文字模式下可执行chmod指令去改变文件与目录的权限,我们先执行ls –l指令观察目录的情况。

执行下列指令更改nohup.out文件的权限:

[*@* *]$chmod 777 nohup.out 将权限改为777

[*@* *]$ ls –l 再观察一次目录

我们可以看到nohup.out文件的权限已经更改为“rwxrwxrwx”。

假若要加上特殊权限,就必须使用4位数字方能表示。特殊权限的对应数值为:

s或S(SUID):对应数值为4。

s或S(SGID):对应数值为2。

t或T:对应数值为1。

用同样的方法更改文件权限即可。

文字改变法

除了数字表示可以更改权限之外,还能使用文字表示法去设置权限。第2-10字符亦能以“rwx”每3个一组,分别用“u”“g”与“o”来表示:

用chmod指令配合文字参数就能改变权限设置,下面举例说明:

“u+rw”:赋予文件拥有者读取和写入的权限。

“g-x”:将同群组用户的执行权限取消。

“g+x,o+rx”:赋予同组用户执行的权限,共他用户读取、执行之权限。

“u+rwx,g-w,o-w”打开文件或目录拥有者完整的权限,并且关闭同群组其用户的执行权限。

“o=rx”: 赋予其他用户读取和执行的权限。

“ugo+x”或“a+x”:同时打开拥有者、群组、其他用户的执行权限,“ugo”可以合称为“a”

“+x”:和“ugo+x”、“a+x”的意义相同,没有指定u、g、o或a时,即代表全部。

“o+T”:打开sticky特殊权限。

“u+s,g+s”打开SUID和SGID特殊权限。

假若想一次更改某个目录下的所有文件权限,包括子目录中的文件权限也要更改,请使用参数-R表示运行递归处理,有无递归处理的差别在于:

chmod 777 cassia TEST:仅把cassia TEST目录的权限改为“rwxrwxrwx”。

Chmod –R 777 cassia TEST:将整个cassia TEST目录与世隔绝当中的文件和子目录之权限统统改成“rwxrwxrwx”。

Chmod指令

Chmod指令可用来把文件或目录移转给其他的用户或群组,执行的指令格式为:

[*@* *]# chmod “指定该文件的拥有者”. “指定该文件所属的群组” “文件”

只要变更拥有者,请执行[*@* *]# chmod “指定该文件的拥有者” “文件”;仅需变换所属群组,则执行[*@* *]# chmod “指定该文件所属的群组

2009年2月8日星期日

libstdc++.so.5 not found问题解决

ln -s /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.so.5 /usr/lib/libstdc++.so.5

failed to read machine uuid: Failed to open "/var/lib/dbus/machine-id"的解决办法

今天,ememge skype之后到sawfish里就出现了标题中的错误信息,解决办法如下:
/etc/init.d/hald start

2009年2月6日星期五

gentoo ntfs支持

File systems --->
DOS/FAT/NT Filesystems --->
<*> NTFS file system support
[ ] NTFS debugging support
[*] NTFS write support