您的位置:首页 > 运维架构 > Linux

Linux知识总结

2017-01-03 10:05 225 查看
本文源自摘抄总结:

1、普通用户可以修改密码原因:



Linux的文件权限如: 777;666等,其实只要在相应的文件上加上UID的权限,就可以用到加权限人的身份去运行这个文件。所以我们只需要将bash复制出来到另一个地方,然后用root加上UID权限,只要用户运行此Shell就可以用用root的身份来执行任何文件了

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组.

如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置. 

setuid:该位是让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令。比如我们用普通用户运行passwd命令来更改自己的口令,实际上最终更改的是/etc/passwd文件我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改

 [root@localhost ~]# ls -l /etc/passwd

  -rw-r--r-- 1 root root 2379 04-21 13:18 /etc/passwd
  作为普通用户如果修改自己的口令通过修改/etc/passwd肯定是不可完成的任务,但是不是可以通过一个命令来修改呢答案是肯定的,作为普通用户可以通过passwd 来修改自己的口令这归功于passwd命令的权限我们来看一下;

  [root@localhost ~]# ls -l /usr/bin/passwd

  -r-s--x--x 1 root root 21944 02-12 16:15 /usr/bin/passwd
  因为/usr/bin/passwd 文件已经设置了setuid 权限位(也就是r-s--x--x中的s),所以普通用户能临时变成root,间接的修改/etc/passwd,以达到修改自己口令的权限

setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.

sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.

2、进程知识:

Linux系统中除了进程0(PID=0,交换进程)以外的所有进程都是由其他进程使用fork创建的
Linux系统中除了进程0以外的其他进程都有一个父进程,但一个进程可以有多个子进程
Linux系统中进程0在创建子进程(即PID=1的进程1,init进程)后,进程0就转为交换进程(有时也被称为空闲进程),而进程1(init进程)就是系统里其他所有进程的祖先





3、打开文件方式a+、w+、r+

r+ 和 w+ 的区别:

r+ 是可以直接写在文件上,读取和写入的光标都在文件开头。

w+ ,如果文件已经存在,将建立一个新文件覆盖原文件(很缺德啊……),并且支持读取。

a+ 和 r+:

a+只能在文件最后补充,光标在结尾。

r+可以覆盖前面的内容,光标在开头

第一步 排除文件打开方式错误:

r只读,r+读写,不创建

w新建只写,w+新建读写,二者都会将文件内容清零

(以w方式打开,不能读出。w+可读写)

**w+与r+区别:

r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建

4、线程和进程对比:



5、文件

系统通过索引节点来定位每一个文件(文件名可以随时更改,但是索引节点对于物理文件是唯一的,并且随物理文件的存在而存在)



6、exit()、_exit()和return区别

1. return 只能返回当前函数,常用于获取函数的返回值,只有在main函数中return才起到退出程序的作用,而在子程序中只能返回上一级调用程序。

2.exit()和_exit()函数调用时会结束进程,他们的区别在于结束时两者所做的清理工作不同。exit()会在退出程序之前关闭所有打开的文件,清空标准输入输出缓冲区,最后执行atexit()注册的回调函数(在main中使用return效果和exit()一样)。而_exit()则不会关闭打开的文件,不会清空缓冲区,也不会执行atexit()注册的回调函数,这一切由内核接管执行处理。

3. 所以,fork()的子进程中,最好不要使用exit()来退出,因为子进程调用exit()产生的清理工作可能会影响到父进程。



_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit() 函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。 

exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O缓冲"。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息