首页 > 代码库 > 【Linux】积累笔记 II

【Linux】积累笔记 II

<style>strong { color: #8600FF }</style>

■  文件的特殊权限 SUID,SGID,SBIT

  SUID权限(体现在owner的x位上显示s)。SUID只对二进制程序有效,且仅在执行过程中有效。执行者将因为拥有SUID权限而在执行期间有程序拥有者的权限

  比如普通用户可以passwd来修改/etc/shadow,相当于说普通用户对其有写权限。但是cat /etc/shadow是做不到的,因为/usr/bin/passwd执行文件的权限是-rwsr-xr-x。这说明,当普通用户运行此文件时会变身成root,因此修改了shadow文件。而/bin/cat的权限中并无s,运行它时普通用户仍然是普通用户

  SGID权限(体现在group权限的x位显示s)。SGID也只对二进制程序有效,也可对文件或目录设置。与SUID类似,执行者在执行过程中会变身成为程序所有组的一员来执行程序。对于目录而言,相当于这个用户可以进入。

 

■  file <某文件> 查看文件类型,比如是ASCII text,Data等各种类型

 

■  防火墙iptables配置在/etc/sysconfig/iptables下。开机开启防火墙在/etc/init.d/iptables,也可以service iptables start/stop等等

 

■  SELinux可以通过set/getenforce 设置/获取selinux运行状态。在setenforce的时候可选参数为 Enforcing/Permissive/Disabled 分别代表开启/警告/关闭的状态。另外编辑/etc/selinux/config文件可以一劳永逸地关闭selinux

 

■  关于守护进程的简要理解。守护进程向本地及网络的用户提供了linux系统功能的接口。即服务

  守护进程还可分为独立守护进程和超级守护进程。超级守护进程是指用xinet这一个守护进程进行相关监听等工作,当请求进来的时候由xinet调用相关进程处理请求。

 

■  之前知道mkdir -p <path>可以一次性递归地创建多级目录。除了一般的写法之外,还有mkdir -p {a,b}/{1,2}这样的写法。这样写的意思是在做了一个笛卡尔积,在当前目录下创建两个子目录a和b,然后再分别在a和b下各创建两个子目录1和2

 

■  chmodchown都是可以用-R来表示递归的。同时chown还有chown -R <user:group> <file>这种一次性改变一整个目录的所属用户和用户组的方便写法

 

■  wc用于计数,可以接在管道右边也可以在后面直接接上文件,不同的参数表示统计不同的数量。

  -l 表示统计行数    -w 表示统计单词个数    -m  表示统计字符个数    不加任何参数表示统计 ‘行数\t词数\t字符数\n‘

 

■  sort可以接在管道右边,用于排序。

  -f  忽略大小写

  -b  忽略开头所有空白字符

  -M  以月份名(JAN,FEB...)排序

  -n  以数字大小排序

  -u  同uniq,相同的数据只列出一次

  -k xx  以某个field排序

 

■  md5sum <file>可以方便地统计一个文件的md5值。需要注意的是同样的文件在linux中和在windows中的md5等hash值并不一定相同。这是因为两者文件系统不一样,在传输过后有可能会有用\0填补空白部分的这种做法。

 

■  killall xxx相当于ps -ef | grep xxx后用kill -9所有这些进程,比较危险,谨慎操作

 

■  sourcesh <file>以及./<file>来执行文件的不同点

  传统的sh 或者 ./xx 这种形式采用创建一个新的bash子进程,然后把脚本放到这个新bash中去执行。子进程开启后父进程挂起且子进程中定义的变量以及操作返回的数据等等都不传回父进程,传回父进程的只有子进程执行的返回码。而source这种方式,在子进程开启后父进程继续运行,没有挂起。此外子进程中定义的变量等都会直接影响到父进程。所以在运行更新环境变量等操作的脚本的时候肯定用的是source这种方式来执行的。另外关于./这种操作方式和其他两种的不同在于,它不是把脚本看成一个文本文件而是一个可操作文件。所以这样做时需要这个文件的执行权限,而其他两种方式都只需要文件的读权限就可以了。

 

■  rpm的各种命令

  rpm -ivh <.rpm>  指定一个包安装

  rpm -Uvh <.rpm>  升级一个包

  rpm -e <.rpm> 卸载一个包

  rpm -q <.rpm> 查询一个包是否安装

    rpm -qa  查看所有安装了的包

  rpm -qi <.rpm>  列出某个包的信息

  rpm -ql <.rpm>  列出某个包内所有文件

  rpm -qf <file>  列出某个文件属于哪个包

■  tree是个很方便的命令,不过不是大多数发型版本自带的,需要手动yum install tree安装一下。常用参数有

  -L n  只生成n层目录的显示

  -d  只显示目录不管文件

  -f  显示绝对路径

 

■  查询配置文件的时候通常有较多注释和空行,可以考虑cat <file> | egrep -v "(^#|^$)"的方法来只获取有效行

 

■  关于重定向的一点简单认识

  重定向中几个特殊字符的意义:

    0 代表stdin,操作符是<或者<<,以左边的对象文件内容为stdin

    1 代表stdout,操作符是>或者>>,将左边内容导入右边

    2 代表stderr,操作符是2>或者2>>,意思是将左边的错误信息导入右边

  “>>”表示是append而不覆盖之前文件的内容,反之一个>就表示直接覆盖掉之前存在的内容

  “<<”右边可以加一个参数,表示终止,即把左边的内容作为stdin读入,读到出现右边内容时终止不再读

  通过重定向可以把错误和标准输出(本来是一起输出在屏幕的)分开管理。比如`do some cmd` > outfile 2> errfile 如果需要把stdout和stderr写到同一个文件里面的话可以 >file 2>&1这样来表示。清空文件内容可echo ‘‘>file。如果不需要某个输出的话可以把它重定向到/dev/null设备,它专门用来销毁信息的。

 

■  命令复合化

  要连续执行多条命令的话第一个想到的就是写一个脚本。其实在逻辑简单的时候,命令行也能搞定。比如:

  cmd1;cmd2  顺序结构

  cmd1 && cmd2  两者是与关系

  cmd1 || cmd2  两者或关系

 

■  关于linux上定时工作(工作调度和例行性工作)

  1. at命令 一次性的预定工作

  at的权限文件在 /etc/at.allow或者at.deny中设置。两者分别采用的是白、黑名单策略。若在这两个文件里面没有设置的话就只有root可以执行at命令

  使用at前要先开启atd服务:service atd start

  用法:

    at [option] TIME

    -l  列出所有用户的at工作

    -d <jobid>  删除一个at工作

    -c <jobid>  列出某个工作的详细信息

    TIME的格式是 HH:MM yyyy-mm-dd

  at命令不常用,不多说了

  2.crontab命令 例行性工作

  和at一样,在/etc下有cron.allow和cron.deny。每个用户的cron任务被记录在/var/spool/cron/<用户名>中。crontab的用法:

  crontab [-u <username>] [-l/-e/-r]

    -l  列出用户的所有cron任务

    -e  编辑用户的cron任务

    -u  仅root可用,可以指定编辑某个普通用户的cron任务

    -r  删除所有cron任务

  在用-e进入编辑界面后,每一行都代表一项例行工作,有六个字段,意义为:

    分钟(0-59)  小时(0-23)  日期(1-31)  月份(0-12)  周几(0-7,0和7都代表星期天)  命令

  时间的参数为*的时候表示该字段的任何时间都接受

  带,表示在多个事件点上进行动作

  带-表示在一个时间段内。比如20 8-12 就表示从八点到十二点每到X点二十分的时候进行动作

  带/n的表示每隔n个单位时间进行动作,比如*/5 8-12 * * *表示每天的八点到十二点间每隔5分钟动作一次

  用crontab -e进入的是针对单个用户的crontab任务,如果需要针对整个系统可以编辑/etc/crontab文件。所有crontab的任务的日志会被记录在/var/log下面的cron-xxxx文件中,默认是每周记录一次所以你能看到的只是上周的情况。

 

■  grep的正则相关

  在linux中,正则表达式分为普通正则和扩展正则。grep处理普通正则式的时候不用特别标识,只要给表达式加上引号即可。但是在grep扩展正则式的时候需要用参数-E指明,告诉系统我grep的是个扩展正则表达式。比如子模式(),统计出现次数的{}等等这些表达方法都属于扩展正则的范畴内

 

■  在linux的shell中,双引号引起来的字符串中碰到特殊的可转义字符会转义掉,导致输出中的一些变化。而被单引号引起来的字符串则不对可转义字符进行转义(这个单双引号之间的差别和python中单双引号不一样,有点大。。而且这里的单引号其实相当于python里的r‘xxx‘的写法吼)

  比如echo "$1" > testfile后,testfile中并没有内容,因为字符串中的$1被转义了(当初想要批量修改zabbix客户端的配置的时候就吃过这个亏,一下子搞挂了好大一片zabbix客户端服务器。。)而用echo "\$1" > testfile或者echo ‘$1‘ > testfile都可以正常的把$1这个字符串echo进testfile中

 

■  用date命令可以格式化地输出时间,用法是date +"format"

  format可以自定义一个,比如"%y-%m-%d %H:%M:%S"更多的格式化字符串的参数选项可以参见man date

 

【Linux】积累笔记 II