linux账户、组、文件权限

账户与群组

每个系统用户都至少有两个ID:使用者ID(User ID,简称UID)、群组ID(Group ID,简称GID)。

显示文件属性时,系统会依据UID从/etc/passwd中找出账户名,根据GID从/etc/group中找出组名,然后再把账户名和组名显示出来。

账号文件/etc/passwd组成:

每行表示一个用户,每个字段用:分隔,共有7个字段:账户名称:密码:UID:GID:用户信息说明:家目录:登录shell

UID为0表示是系统管理员;1 - 499是保留给系统账号的;500 - 65535是可登入账号的,给一般使用者使用。

系统账号主要用于运行服务,一般不会建立家目录。

密码文件/etc/shadow组成:

实际保存用户的密码,以:分隔,有9个字段:
账户名称:密码:最近更改密码的日期:密码不可被更改的天数:密码需要重新变更的天数:密码需要变更期限前的警告天数:密码过期后的账号宽限时间:账号失效日期:保留

说明:

  • 最近更改密码的日期:记录了密码上次被修改的日期,日期是以1970年1月1日作为1而累加的日期,每过一天加1。
  • 密码不可被更改的天数:(与第3个字段相比)记录了这个账号的密码在上次被更改后需要经过几天才可以再被更改。如果是0表示密码随时可以更改。
  • 密码需要重新变更的天数:(与第3个字段相比)指定上次更改密码之后,在多少天内需要再次更改密码才行。
  • 密码需要变更期限前的警告天数:当账号的密码有效期限快要到的时候(第5个字段),系统会依据这个字段的设定,发出“警告”言论给这个账号。
  • 密码过期后的账号宽限时间:(与第5个字段相比),密码的有效日期为更新日期(第3个字段) + 重新变更日期(第5个字段),过了这个期限后用户依旧没有更新密码,那该密码就算过期。密码过期后,账户登入系统时,系统会强制要求重新设定密码才能登入继续使用。
  • 账号失效日期:用1970年以来的总天数设定。表示这个账号在此字段规定的日期后将无法再使用,不管密码是否过期。

root密码忘记后,可以用LiveCD挂载根目录修改/etc/shadow,将root的密码字段清空,再重新启动后root将不用密码即可登入。

群组文件/etc/group组成:

每行代表一个群组,用冒号:分隔:组名:群组密码:GID:群组支持的账号名称

群组支持的账号名称用逗号分隔多个账号。

群组分为有效群组(effective group)与初始群组(initial group)。
/etc/passwd里的第4栏GID就是初始群组,当用户登入系统,立刻就拥有这个群组相关的权限。
初始群组不需要在/etc/group的第4个字段写入账号,有效群组才需要。

有效群组的作用是在新建文件时,新文件所属的群组就是用户当前的有效群组。

继续阅读

tar命令

tar

tar命令可用于创建、解压缩、不解压直接查看 压缩文件,删除压缩文件里的指定文件。支持的格式有gzip、bzip2、compress。

常用选项

  • -c, --create:创建新的压缩文件。
  • -x, --extract, --get:解压缩文件。
  • -C, --firectory dir:转到指定目录,与-x选项合用可直接解压到指定目录。
  • -t, --list:列出压缩文件中的文件列表。
  • -f filename, --file filename:指定压缩文件的文件名。
  • -z, --gzip, --ungzip:使用gzip格式对文件进行压缩或解压缩。
  • -j, --bzip2, --bunzip2:使用bzip2格式对文件进行压缩或解压缩。
  • -Z, --compress, --bucompress:使用compress格式对文件进行压缩或解压缩。
  • -v, --verbose:详细显示处理的文件。
  • --exclude file:排除指定的文件。
  • -X, --exclude-from filename:从filename中读入不想包含的文件列表。
  • --remove-files:建立压缩文件后删除源文件。
  • -r, --append:附加到压缩文件。
  • -P, --absolute-paths:不要从文件名中去除’/’,即允许使用绝对路径。

举例

tar cf test.tgz *.sh:用gzip创建压缩文件。

tar tf test.tgz:查看压缩文件里的文件列表。

tar xf test.tgz:解压缩test.tgz文件。

tar xf test.tgz -C scripts:解压缩test.tgz文件到scripts目录。

tar rf test.tgz * setup.sh_bak:把setup.sh_bak追加压缩进现有的test.tgz文件里。

tar f test.tgz --delete setup.sh_bak:删除压缩文件test.tgz里的setup.sh_bak文件。

tar cf test.tgz *.sh --exclude test.sh:用gzip创建压缩文件,不压缩test.sh文件。

tar tf test.tgz --exclude test.sh:查看压缩文件里的文件列表,不列出test.sh文件。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

shell 脚本之条件测试和流程结构

条件测试

每个命令结束后,都有返回一个结束状态值,值为0表示执行成功,非0表示失败。条件测试就是以状态返回值的真假值作为判断依据:值为0判断为真,非0判断为假。

条件测试的写法

  • 执行一个命令,可以包括管道命令。例如:

if  grep  -q  "rm"  fn.sh;  then
     echo "find rm command."
else
     echo  "not found ."
fi
  • 传回某一命令执行结果的相反值:! command!与命令之间用空格分开。

if  !  grep  -q  "rm"  fn.sh;  then
     echo  "not found ."
else
     echo "find rm command."
fi
  • 使用符合命令:(( expression ))。如果expression的值不为0,则传回真值(0),否则传回假值(1)。
  • 使用Bash关键字[[]]组成的式子:[[ 判断式 ]]注意:[[ 的后面、]]的前面都要有空格。


if  [[ str > xyz ]];  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用内置命令test: test 判断式

if  test "str" \> "xyz";  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用内置命令:[][]test的用法是相同的,可以互换。注意:[ 的后面、]的前面都要有空格。

if  [ "str" \> "xyz" ];  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用-a, -o进行逻辑组合。-a是逻辑与,-o逻辑或。例如:[ -f filename -a -x filename ],如果filename可读且可执行则为真。

  • 注意:

    • test[]都需要对Bash特殊字符进行转义;而[[]]不需要,<, >, &&, ||都可以在其中自由使用。
    • [[ 判断式 ]]中,如果使用==, !=,且在这两个运算符右边的字符串没有加上单引号或双引号,则==, !=会视为需要匹配该字符串所形成的“样式”,如果匹配,返回0,否则返回1。
    • [[ 判断式 ]]中,=~的右边放置要匹配的样式。样式不能用引号引起,否则不会被当作样式匹配。

继续阅读

shell 脚本之变量、数组、扩展

变量

变量是什么

在Bash shell中,只有一种数据型态:以字符组成的字符串。Bash Shell把任何存储在变量中的值,皆视为以字符组成的“字符串”。
要使用Bash Shell变量,不需要经过实现声明。

每个Shell环境都会维护一份它们自己的变量空间,彼此不互相影响。

变量命名

变量名可用英文字母、数字及下划线组成,但开头第一个字符不能是数字;变量名长度不限制;大小写敏感;

变量赋值

给变量赋值时,等号两边不可以有空白;若变量值有空白,则要用引号括起来。

变量和引号

推荐习惯:把字符串用双引号或单引号括起来。
在双引号中,可进行以下3个操作:替换变量;替换命令执行结果;替换算术运算结果。

单引号的作用是形成一个所见即所得的字符串,不会进行任何变量替换的操作。

取变量值

$变量名${变量名}
前者在变量名后面是空白符时使用,后者在变量名与其他字母、数字、下划线混合时使用。

取消变量:

取消变量就是把变量从变量空间删除释放。


unset 变量名
unset -v 变量名
unset -f 函数名

清空变量

变量仍然存在,只不过值是长度为0的字符串。

变量名=

继续阅读

grep 命令

grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。

egrep是grep的扩充版本,改良了grep不能或不方便的操作,主要是正则匹配方面的扩展。

fgrep不做正则处理,表达式仅作为一般字符串处理,所有正则元字符不起作用。

调用grep

一般的grep命令行是:grep options pattern input_file_names

可以有零个或多个options和input_file_names,可以用-e pattern-f file选项来指定多个正则表达式。

grep 常用选项

  • -v:逆反模式,只输出不匹配的行。
  • -r:递归搜索目录。
  • -q:静默模式,不输出任何结果(stderr除外,用于获取命令返回值,有匹配为true,否则为false)。
  • -i:忽略大小写区别。
  • -w:整个单词匹配。
  • -n:同时输出行号。
  • -c:只输出匹配的行数。
  • -l:只输出含有匹配行的文件名。
  • -E:切换到egrep。

举例

grep -l 'main' *.c:在当前目录下的所有c源文件里搜索含有main的文件,只输出文件名。

grep -r 'hello' /home/gigi:递归地搜索目录。

find /home/gigi -name "*.c" -print0 | xargs -0r grep -H 'hello':在/home/gigi目录下的所有c文件里搜索hello,类似于:grep -rH --include='*.c' 'hello' /home/gigi

grep -e '--cut here--' *:如果模式以-开头,需要使用-e选项,否则grep是尝试当作选项列表来解析。

grep -w 'hello' *:搜索一个完整的单词,而不是作为单词的一部分。

grep -C 2 'hello' *:输出匹配行的上下文,前后各2行。

grep -H 'eli' /etc/passwd /dev/null:强制grep输出匹配行所在的文件名。

ps -ef | grep '[c]ron:这里之所以要使用字符集[]模式,是为了避免匹配到这条命令本身。

grep 'paul' /etc/motd | grep 'franc,ois':grep没法表示一个逻辑与的概念,如果需要同时匹配多个模式,需要使用多个grep命令。

cat /etc/passwd | grep 'alain' - /etc/motd:同时在标准输入和输入文件里查找。-表示标准输入。

echo -e "123321\nabcxyz\nabcba" | grep -e '\(.\)\(.\).\2\1':用正则表达式表示回文。能够匹配的回文多达19个字符:
echo "1234567890987654321" | grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$'

继续阅读

cut,sort,uniq,du 命令

cut

从文件的每一行抽出一部分。

常用选项:

  • -d 指定分隔符,如: -d: 指定冒号为分隔符。
  • -f 指定要抽取的字段,可以用逗号分隔要选取的字段,也可以用-指定要选取的字段范围,如: -f1,2抽取第1、2个字段, -f1-3抽取第[1-3]的字段。
  • -c 抽取指定范围的字符,包含起始位置,如: -c9-抽取第9个及以后的的字符, -c1-3,22-抽取第1-3以及第22及个以后的字符。

举例:

  • cut -d: -f1,6 /etc/passwd
  • cut -c2- /etc/passwd
  • cut -c1-5,22- /etc/passwd

sort

对文本文件的每一行进行排序,默认按ASCII的字符升序排序。

常用选项:

  • -f 把小写字母转换为大写字母来比较。
  • -i 忽略非字母。
  • -h 人类可读数字排序,如:3k < 2M < 1G
  • -n 按数字排序。
  • -r 降序排序。
  • -R 随机排序。
  • -k 按指定字段排序,如 -k 2 表示按第二个字段排序。

uniq

对已排序好的文件删除重复行或统计重复次数。

常用选项:

  • -d 只输出重复行。
  • -c 计算每一行重复的次数。输出结果是两列: 重复次数 行内容

举例:

  • echo -e "1\n1\n1\n2\nx\ny" | uniq -d 只会输出: 1

  • echo -e "1\n1\n1\n2\nx\ny" | uniq -c, 输出结果如下:


      3 1
      1 2
      1 x
      1 y

du

du 命令用于查看目录下文件及文件夹的大小(粗略,非精确, estimate)。

有用的选项:

  • -h 以人类可读的单位显示大小,如1.1K, 1.2M, 1.3G。
  • -s 为每个参数显示一个总和。如: du -s * 则显示当前目录下文件及直接子目录的大小。
  • -b -k -m 分别表示以 B KB MB 为单位。
  • –exclude=pattern 排除匹配模式pattern的文件。
  • –time 显示文件或目录的最后修改时间。

举例:

du -sh * 命令的输出虽然是可读的,但却没有排序,下面两个脚本是按大小排序的可读格式输出:

  • for x in K M G; do du -sh * | grep -P “^[1-9]+\.?[0-9]*$x” | sort -n; done
  • du -sh * | sort -h

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

xargs 命令

xargs的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题,其作用一般等同于shell中反引号,但更加灵活,并可以正确处理输入中的空格等特殊字符的情况。

命令的一般形式:xargs [option...] [command [initial-arguments]]

选项

  • -a inputfile--arg-file=inputfile,从inputfile读取名字而不是标准输入。如果使用了这个选项,标准输入流在命令执行时将保持不变,否则stdin从重定向自/dev/null
  • -0--null,(-0是数字0)输入文件名将以null字符而不是空白符结束,任何引号和反斜杠将不被特殊处理(每个字符取字面义)。Disables the end of file string, which is treated like any other argument.

  • -d delim--delimiter delim,输入文件名以指定的字符而不是空白符结束,任何引号和反斜杠将不被特殊处理(每个字符取字面义)。Disables the end of file string, which is treated like any other argument。一般是单个字符,不支持多字节字符。

  • -I replace-str-i[replace-str]--replace[=replace-str],用stdin读取的名字替换初始参数中出现的replace-strreplace-str默认是{}

  • -r--no-run-if-empty,如果标准输入是空的,不执行命令。默认情况下,命令至少执行一次,即使没有输入。

  • -t--verbose,在stderr上输出命令,在命令执行前。

  • -p,在命令执行前让用户确认是否执行。

  • -P max-procs--max-procs=max-procs,任意时刻,同时执行命令的最大进程数。默认是1。如果是0,xargs将同时运行尽可能多的进程。

  • L max-lines-l[max-lines]--max-lines[=max-lines],每个命令行最多处理max-lines个非空白输入行。

  • -n max-args--max-args=max-args,每个命令行最多使用max-args个参数。

  • -s max-chars--max-chars=max-chars,每个命令行最多使用max-chars个字符,包括命令、初始化参数和参数字符串的结束符。

  • -x--exit,如果超出了-s选项指定的大小将退出。

  • --process-slot-var=environment-variable-name
    继续阅读

linux find 命令

find 命令的一般形式: find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

其中[-H] [-L] [-P] [-D debugopts] [-Olevel]并不常用,path是find命令所查找的目录路径,默认是当前目录,可以指定多个搜索目录,expression可以分为:-options [-opertaions ...]

find命令还支持-a, -o, \( exp \) 来组合选项,-a, -o分别表示逻辑与和逻辑或,\( exp \)用于指定优先级。默认情况下,各个选项之间的bool值是逻辑与的关系。

-opertaions选项详解

  • -print,每个结果文件名单独一行输出到标准输出。默认操作。
  • -fprint outfile,与-print一样,只是将结果输出到outfile。

  • -exec cmd,find命令将对匹配的文件执行该参数所给出的shell命令。一般模式为:'cmd' {} \;{}表示匹配的结果,即文件名,{}之间不能有空格;\;是必须的,表示命令的结束;{}\;之间有空格。例如: find ./ -size 0 -exec rm {} \; 删除大小为0的文件。

  • -ok cmd,同-exec一样,但是先询问用户(在标准输入),假如应答不是以yY开头,将不执行command,返回假。

  • -ls,将搜索到的结果用ls -l命令形式的结果输出到标准输出。

  • -fls outfile,同-ls选项一样输出,只是结果输出到outfile。

  • -print0,在标准输出上输出整个文件名,并后加一个空字符。则允许其他程序能正确处理在find输出中包含新行的文件名。

  • -fprint0 outfile,与-print0一样,只是输出到outfile。

  • -printf format,格式化输出到标准输出。

继续阅读

crontab调度

调度的基本格式


*    *     *    *     *       cmd
分  时    日   月    周      命令

第1列表示分钟  0 - 59,每分钟用 * 或者 */1表示。
第2列表示小时  0 - 23,0表示0点。
第3列表示日期 1 - 31
第4列表示月份  1 - 12
第5列表示星期 0 - 6, 0表示星期日
第6列是要运行的命令

月和周的属性值还可以用相应英语单词的前3个字母来表示,如jan表示一月,mon-wen表示周一到周三。

特殊符号:

  • 逗号,来分隔多个时间值,
  • - 表示一个时间范围,
  • *表示该属性的所有取值,是否有效取决于相关属性的值。
  • /n代表每隔n个时间单位的意思,*/5表示每隔5个单位,1-10/2表示1至10之间每隔2个时间单位,也就是1,3,5,7。
  • 如果时属性指定了具体值,而分属性是*则表示整点。

注意:因为日期属性与周属性都表示某一天,两者之间的关系是比较微妙的。

  • 如果两个属性都是*,当然是按每天调度。
  • 如果两个属性中有一个是具体的,如0-3,另一个是*,则按具体的属性调度,*不再表示所有取值。
  • 如果两个属性都是具体值,则按两个规则调度,都有效。

继续阅读