2019.3.18 severus.va

软链接
ln -s
创建软链接ls -s f2 f2_link

软链接和原始链接不是同一个文件,但是原文件删除后所有软链接皆失效,但是如果有新的文件文件名与软链接指向名相同就会被顶替。
软链接可以跨分区创建,文件路径决定软链接文件大小。
软链接连接数增加不会影响原文件连接数。
软链接可以对文件夹(目录)进行创建。

  • 软链接时相对路径一定要相对于软链接而非工作目录

软、硬链接定义
硬链接:一个文件多个名字
软链接:一个文件对应的快捷方式

软、硬链接区别:
硬链接会增长连接数,软链接不会
硬链接不支持跨分区,软链接支持
硬链接对目录创建,软链接支持
原始文件和链接文件的关系:
硬链接:原始文件与链接文件无差异
软链接:软链接文件依赖于原始文件
删除原文件:
硬链接:硬链接不受任何影响
软链接:软链接皆失效,但是如果有新的仅同名文件会被新的同名文件顶替

  • readlink + 软链接 可以直接看软链接原始文件路径

软链接生产中经常用作软件升级、调试

mv和inode
• 在同一个文件系统内进行mv相当于换个文件名,inode表不会有任何改动,磁盘上的位置也没有任何法改动
• 如果mv目标和源不在同一个文件系统,相当于先cp到源然后再rm

标准I/O和管道
程序:指令+数据

  • 三种I/O设备
    标准输入(STDIN) - 0 默认接受来自键盘的输入
    标准输出(STDOUT) - 1 默认输出到终端窗口
    标准错误(STDERR) - 2 默认输出到终端窗口
  • I/O重定向:改变默认位置
    支持的操作符号包括:
    > 把标准输出重定向到文件
    2> 把标准错误重定向到文件
    &> 把所有输出重定向到文件
    符号 > 文件内容会被覆盖
    set -C 禁止将内容覆盖已有文件内,但可以追加
    >|file 强制覆盖
    set +C 允许覆盖
    符号 >> 原有内容基础上追加内容

pts/1 将内容重定向到 pts/2

[root@CentOS7 ~]# tty
/dev/pts/1
[root@CentOS7 ~]# tty
/dev/pts/2
[root@CentOS7 ~]# ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates
Desktop          Downloads  Music                 Public    Videos
[root@CentOS7 ~]# ls > /dev/pts/2
[root@CentOS7 ~]#
[root@CentOS7 ~]# tty
/dev/pts/2
[root@CentOS7 ~]# anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates
Desktop          Downloads  Music                 Public    Videos

符号 >> 可以将标准输出追加到文件内而不是覆盖

[root@CentOS7 data]# hostname > va.txt
[root@CentOS7 data]# cat va.txt
CentOS7
[root@CentOS7 data]# uname -r >> va.txt
[root@CentOS7 data]# cat va.txt
CentOS7
3.10.0-957.el7.x86_64

具有标准输出/标准错误的cmd > 文件

  • 标准输出cmd > 文件
  • > FILE 此命令将会清空文件
  • cmd > /dev/null /dev/null 相当于垃圾桶
  • cat /dev/null > FILE 与清空文件相同,但是这条比较通用
  • >> 空文件 可以创建空文件,且比> 空文件更安全些
  • 标准错误cmd 2> 文件
  • 执行命令时既有标准输出也有标准错误
[root@CentOS7 data]# ls /rrr /boot
ls: cannot access /rrr: No such file or directory
/boot:
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-d4dfbc62a3aa42a88abe0d0e43d8b817.img
initramfs-3.10.0-957.el7.x86_64.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-d4dfbc62a3aa42a88abe0d0e43d8b817
vmlinuz-3.10.0-957.el7.x86_64
[root@CentOS7 data]# ls /rrr /boot > va.txt 2> vv.txt
[root@CentOS7 data]# cat va.txt
/boot:
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-d4dfbc62a3aa42a88abe0d0e43d8b817.img
initramfs-3.10.0-957.el7.x86_64.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-d4dfbc62a3aa42a88abe0d0e43d8b817
vmlinuz-3.10.0-957.el7.x86_64
[root@CentOS7 data]# cat vv.txt
ls: cannot access /rrr: No such file or directory

  • &> 该cmd将标准输出和标准错误归到一个文件内
[root@CentOS7 data]# ls /rrr /boot &> vz.txt
[root@CentOS7 data]# cat vz.txt
ls: cannot access /rrr: No such file or directory
/boot:
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-d4dfbc62a3aa42a88abe0d0e43d8b817.img
initramfs-3.10.0-957.el7.x86_64.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-d4dfbc62a3aa42a88abe0d0e43d8b817
vmlinuz-3.10.0-957.el7.x86_64

以下四个选项哪个结果不同:

  1. cmd &> file
  2. cmd > file 2>&1
  3. cmd 2>&1 >file xxx 顺序不同
  4. cmd 2>file 1>&2

  • 也可以用(cmd;cmd;cmd)来同时执行输出多个命令
[root@CentOS7 data]# hostname
CentOS7
[root@CentOS7 data]# uname -r
3.10.0-957.el7.x86_64
[root@CentOS7 data]# (hostname;uname -r) > vb.txt
[root@CentOS7 data]# cat vb.txt
CentOS7
3.10.0-957.el7.x86_64

打开的文件都有一个fd:filedescriport(文件描述符)

tail -d FILE 持续打开不关闭文件
查看/var/log/massages的fd(文件描述符)

[root@CentOS7 ~]# tail -f /var/log/messages
Mar 12 16:49:08 CentOS7 systemd: Unit iscsi.service cannot be reloaded because it is inactive.
Mar 12 16:49:17 CentOS7 dbus[6181]: [system] Failed to activate service 'org.bluez': timed out
Mar 12 16:49:17 CentOS7 pulseaudio: GetManagedObjects() failed: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
Mar 12 16:50:01 CentOS7 systemd: Started Session 2 of user root.
Mar 12 16:50:15 CentOS7 systemd-logind: New session 3 of user root.
Mar 12 16:50:15 CentOS7 systemd: Started Session 3 of user root.
Mar 12 16:51:15 CentOS7 systemd: Started Session 4 of user root.
Mar 12 16:51:15 CentOS7 systemd-logind: New session 4 of user root.
Mar 12 16:54:13 CentOS7 journal: JS WARNING: [resource:///org/gnome/shell/ui/popupMenu.js 717]: reference to undefined property "_delegate"
Mar 12 16:54:23 CentOS7 journal: g_simple_action_set_enabled: assertion 'G_IS_SIMPLE_ACTION (simple)' failed
[root@CentOS7 ~]# cd /proc
[root@CentOS7 proc]# pidof tail
8547
[root@CentOS7 proc]# cd `pidof tail`
[root@CentOS7 8547]# ll fd
total 0
lrwx------. 1 root root 64 Mar 12 16:59 0 -> /dev/pts/1
lrwx------. 1 root root 64 Mar 12 16:59 1 -> /dev/pts/1
lrwx------. 1 root root 64 Mar 12 16:59 2 -> /dev/pts/1
lr-x------. 1 root root 64 Mar 12 16:59 3 -> /var/log/messages
lr-x------. 1 root root 64 Mar 12 16:59 4 -> anon_inode:inotify

< 标准输入的重定向

  • 可以通过标准输入的重定向批量输入
[root@CentOS7 data]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
^C
(interrupt) Exiting bc.
[root@CentOS7 data]# nano
[root@CentOS7 data]# cat bc.txt
2*3
4+6
[root@CentOS7 data]# bc < bc.txt
6
10

cat < bc.txt > bc2.txt

[root@CentOS7 data]# cat < bc.txt
2*3
4+6
[root@CentOS7 data]# cat < bc.txt > bc2.txt
[root@CentOS7 data]# cat bc2.txt
2*3
4+6

相当于文件的复制


cat < file >> file2.txt
该命令为死循环,file2.txt文件会暴涨


tr命令:用来转换了删除字符
tr是以Ctrl d退出


  • tr可以实现对位替换
[root@CentOS7 data]# tr '136' 'avf'
1241323131212
a24av2vava2a2
[root@CentOS7 data]# tr 'a-z' 'A-Z'
aehgkljggfd
AEHGKLJGGFD

  • tr -t
[root@CentOS7 data]# tr -t 'abcd' 'gt'
abcdfg
gtcdfg

  • tr -d ’ ’ 删除单引号中的字符
[root@CentOS7 data]# tr -d 'abc'
32ahbkjdclc
32hkjdl

  • tr -d ‘\n’ 删除换行符
[root@CentOS7 data]# cat qq.txt
a
b
c
d
[root@CentOS7 data]# tr -d '\n' < qq.txt
abcd[root@CentOS7 data]#

windows换行多一个回车符(0d),而Linux换行只需要一个换行符(0a)


  • hexdump -C 查看文件16进制?
  • sz FILE 可以将文件传到windows

  • 创建一个文件包含a,b,c并将文件的空格替换为换行保存在另一个文件中
[root@CentOS7 data]# echo {a,b,c} > qe.txt
[root@CentOS7 data]# cat qe.txt
a b c
[root@CentOS7 data]# tr ' ' '\n' <qe.txt>qr.txt
[root@CentOS7 data]# cat qr.txt
a
b
c

  • tr -s 'abc'将单引号中的字符连续的合为一个
  • tr -dc '123' 除了123全部删除

  • cat <<EOF 多行重定向,最后必须以EOF结尾
    cat > file <<EOF 可以将文件写入file
    文件中也可以写入变量生成灵活文件
[root@CentOS7 data]# cat > qq.txt <<EOF
> $PATH
> The kernel is `uname -r`
> My hostname is `hostname`
> EOF
[root@CentOS7 data]# cat qq.txt
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
The kernel is 3.10.0-957.el7.x86_64
My hostname is CentOS7

  • 从1+…100的总和
    方法一:
[root@CentOS7 data]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@CentOS7 data]# echo {1..10}>aa.txt
[root@CentOS7 data]# tr ' ' + <aa.txt
1+2+3+4+5+6+7+8+9+10
[root@CentOS7 data]# tr ' ' + <aa.txt>ss.txt
[root@CentOS7 data]# cat ss.txt
1+2+3+4+5+6+7+8+9+10
[root@CentOS7 data]# bc <ss.txt
55

方法二:

  • 管道技术:
    cmd1 | cmd2 | cmd3
    c* md1需要标准输出,cmd2需要标准输入和标准输出,cmd3需要标准输入
[root@CentOS7 data]# echo {1..10}|tr ' ' +|bc
55
  • 管道符只处理标准输出,不能处理标准错误
    但是2>&1可以强制处理
[root@CentOS7 data]# cmd
bash: cmd: command not found...
Similar command is: 'mcd'
[root@CentOS7 data]# cmd 2>&1 | tr 'a-z' 'A-Z'
BASH: CMD: COMMAND NOT FOUND...
SIMILAR COMMAND IS: 'MCD'

方法三:
seq -s + 100 | bc

[root@CentOS7 data]# seq -s + 100 | bc
5050

  • tee : 即重定向,屏幕上还可以继续显示
[root@CentOS7 ~]# echo abcd
abcd
[root@CentOS7 ~]# echo abcd| tee f1.txt
abcd
[root@CentOS7 ~]# cat f1.txt
abcd
  • tee -a 追加
[root@CentOS7 ~]# echo eegg| tee -a f1.txt
eegg
[root@CentOS7 ~]# cat f1.txt
abcd
eegg

  • 查看发行版本
[root@CentOS7 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

用户、组和权限

用户

  • 安全3A
    Authentication: 认证
    Authorization: 授权
    Accouting|Audition: 审计
  • 令牌token:用户登录获得令牌
  • centos6系统用户uid:1-499
    登录用户uid:500+
  • centos7系统用户uid:1-999
    登录用户uid:1000+

  • Linux组:groupname/GID
  • 管理员组:root
  • 普通组: 系统组和用户组
  • 用户必须属于且只有一个主组(私有组),可以有多个附加组
  • Linux安全上下文:当root和普通用户使用同样的工具访问文件时,用户身份决定权限

用户和组的配置文件

  • Linux用户和组的主要配置文件
  1. /etc/passwd:用户及其属性信息
  2. /etc/group: 组及其属性信息
  3. /etc/shadow: 用户密码及其相关属性
  4. /etc/gshadow: 组密码及其相关属性

  • cat /etc/passwd 格式:
    ’’ name:password:UID:GID:GECOS:directory:shell ''
    GECOS:用户描述
    nologin:非登录用户

  • cat /etc/shadow 格式:
    ’’ login name : encrypted password:date of last password change : minimum password age : maximum password age : password warning period : password inactivity period : account expiration date : reserved field ''
    ’’ 登录名:加密密码:最后密码更改日期:最小密码有效期:最大密码有效期:密码警告期:密码闲置期:帐户到期日:账户有效期 ''

  • chage user更改用户shadow时间相关配置

    usermod -L user 给用户加锁
    usermod -U user 给用户解锁


  • getent file keyword 查看某文件内指定某一行
  • gpasswd groupname 当前用户加入某组

  • cat /dev/urandom 查看生成的随机字符(urandom专门用来生成随机字符)
  • cat /dev/urandom | tr -dc 'a-zA-Z0-9'

用户和组管理命令
用户管理命令:

  • useradd
    useradd NAME 创建用户
[root@CentOS7 ~]# useradd qq
[root@CentOS7 ~]# getent passwd qq
qq:x:1001:1001::/home/qq:/bin/bash

  • useradd -u 可以人为指定用户UID
    useradd -u 9527 va创建uid为9527的用户va

  • useradd -o 配合-u选项,不检查UID的唯一性,多人同时使用一个UID
    useradd -g 指定主组(GID)
    useradd -u9527 -g GIU va

  • useradd -c "COMMENT" 加账户描述信息

  • useradd -d HOME_DIR 指明家目录
    useradd -u9527 -g GIU -d /data/qqhome va

  • useradd -s SHELL 指定shell

  • useradd -G GROUP1[GROUP2] 指定附加组

  • useradd -N 不创建私有组作为主组,使用user组作为主组

  • useradd -r 创建系统用户centos7:ID<1000

  • useradd -m 创建家目录,用于系统用户

  • useradd -M 不创建家目录,用于非系统用户


仅删除隐藏文件:rm -rf .[^.]*
将一个家目录的文件全部拷贝到另一个文件夹,前提是以处于当前家目录cp -r /home/va/ls -A/data/vahome&cp -r /home/va/. /data/vahome -a是显示隐藏文件包括.和…,-A是显示隐藏文件不包括.和…


  • 关于useradd重点选项参考rpm -q --scripts postfix下列命令行最后一行
[root@CentOS7 ~]# rpm -q --scripts postfix
preinstall scriptlet (using /bin/sh):
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
/usr/sbin/groupadd -g 12 -r mail 2>/dev/null
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null

  • 通过 /etc/default/useradd 来观察创建用户的默认值设定
[root@CentOS7 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

其中SKEL=/etc/skel为用户的模板文件路径,如果在改文件下创建一个文件夹,那么所有新建用户都将会有这个文件夹


  • echo ****** | passwd --stdin user改密码

getent passwd从中复制想要拷贝的用户信息并创建文件userfile.txt
newusers userfile.txt即可批量创建用户达到拷贝用户效果
批量改密码时提前建立文件nano ***.txt

va:000000
vb:123123
vc:555444
冒号前为用户名,冒号后为密码
  • cat ****.txt |chpasswd便可以批量更改用户密码

  • usermod

  • userdel
    userdel 只删除用户名不删除数据
    userdel -r 删用户删数据

  • id + 选项 +用户
    id -u 显示UID
    id -g 显示GID
    id -G 显示用户所属组的ID
    id -n 显示名称,需配合ugG使用

su(switch user)切换身份
su username 部分切换 exit返回
su - username 完全切换 exit返回
su [-] username -ccmd``切换用户并执行命令


组账号维护命令:

  • groupadd 创建组
    groupadd [OPTION]… groupname

  • groupadd -g GID 指明GID号

  • groupadd -r 创建系统组

  • groupmod 修改组属性

  • groupdel 删除组
    如果一个组为某个用户主组,想删组先删用户

  • gpasswd -a user group 将用户加到某一组

  • usermod -G “” username`清空用户附加组


设置密码

  • passwd [OPTIONS] UserName: 修改指定用户的密码
    passwd -d UserName 删除指定用户密码
    passwd -l UserName 锁定指定用户
    passwd -u UserName 解锁指定用户
    passwd -e UserName 强制用户下次登录修改密码
    chage -d 0 UserName 强制用户下次登录修改密码
    passwd -f UserName 强制操作
    passwd -n mindays UserName 指定最短使用期限
    passwd -x maxdays UserName 最大使用期限
    passwd -w warndays UserName 提前多少天开始警告
    passwd -i inactivedays UserName 非活动期限
    `passwd --stdin:从标准输入接收用户密码
    示例:echo “PASSWORD” | passwd --stdin USERNAME

文件权限

  • 文件属性:
    权限-引用计数-所有者-所属组-大小-创建和修改时间-文件名
    权限:读-写-执行:rwx
    所有者-所属组-other

  • chown 更改所有者
    chown user file 将某文件所有者改为user

total 0
drwxr-xr-x. 2 root root 6 Mar 13 02:48 va.txt
[02:48:42 root@CentOS7 data]#chown va va.txt
[02:48:53 root@CentOS7 data]#ll
total 0
drwxr-xr-x. 2 va root 6 Mar 13 02:48 va.txt

  • chgrp 更改所属组
    chgrp group file 将某文件所属组改为group
[02:48:53 root@CentOS7 data]#ll
total 0
drwxr-xr-x. 2 va root 6 Mar 13 02:48 va.txt
[02:48:54 root@CentOS7 data]#chgrp va va.txt
[02:49:46 root@CentOS7 data]#ll
total 0
drwxr-xr-x. 2 va va 6 Mar 13 02:48 va.txt

chown和chgrp都可以加选项-R,将文件夹所有子目录全部递归更改属性,慎用!!


模式法:
chmod u.g.o +(增加).-(减少).=(赋予)权限 per权限r.w.x. file 更改文件权限

[02:47:08 root@CentOS7 data]#ll
total 0
drwxr-xr-x. 2 root root 6 Mar 13 01:46 va
[02:47:09 root@CentOS7 data]#chmod a=w va
[02:47:31 root@CentOS7 data]#ll
total 0
d-w--w--w-. 2 root root 6 Mar 13 01:46 va
[02:47:33 root@CentOS7 data]#

数字法

  • umask值 可以用来保留在创建文件权限
  • 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1
  • 新建目录的默认权限: 777-umask
  • 非特权用户umask是 002
  • root的umask 是 022
  • umask: 查看
  • umask # 设定
  • umask –S 模式方式显示
  • umask –p 输出可被调用
  • 全局设置: /etc/bashrc 用户设置:~/.bashrc

Linux文件系统上的特殊权限

  • SUID,SUIG,Sticky

  • 三种常用权限:r,w,x

  • 安全上下文

  • 前提:进程有属主和属组;文件有属主和属组

    (1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有
    执行权限

    (2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组

    (3) 进程访问文件时的权限,取决于进程的发起者
    (a) 进程的发起者,同文件的属主:则应用文件属主权限
    (b) 进程的发起者,属于文件属组;则应用文件属组权限
    © 应用文件“其它”权限


可执行文件上SGID权限

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属组为原程序文件的属组
  • 权限设定:
[15:42:41 root@centos7 data]#chmod g+s 2019-03-17.txt
[15:43:04 root@centos7 data]#ll
total 0
-rw-r--r--. 1 root root 0 Mar 17 11:23 2019-03-17.log
-rw-r-Sr--. 1 root root 0 Mar 17 11:35 2019-03-17.txt
[15:43:06 root@centos7 data]#chmod g-s 2019-03-17.txt
[15:43:54 root@centos7 data]#ll
total 0
-rw-r--r--. 1 root root 0 Mar 17 11:23 2019-03-17.log
-rw-r--r--. 1 root root 0 Mar 17 11:35 2019-03-17.txt

目录上的SGID权限

  • 默认情况下,用户创建文件时,其属组为此用户所属的主组
  • 一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
  • 通常用于创建一个协作目录
    权限设定:
  • 名为va目录的属性
[15:48:52 root@centos7 data]#ll -d va
drwxr-xr-x. 2 root root 6 Mar 18 15:45 va

  • 给名为va的目录加权限
[15:49:15 root@centos7 data]#chmod g+s va
[15:49:36 root@centos7 data]#ll -d va
drwxr-sr-x. 2 root root 6 Mar 18 15:45 va

  • 给名为va的目录减权限
[15:49:40 root@centos7 data]#chmod g-s va
[15:49:58 root@centos7 data]#ll -d va
drwxr-xr-x. 2 root root 6 Mar 18 15:45 va

Sticky位

  • 具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
  • 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
  • sticky 设置在文件上无意义
  • 权限设定:
[15:50:01 root@centos7 data]#ll -d va
drwxr-xr-x. 2 root root 6 Mar 18 15:45 va

[15:53:23 root@centos7 data]#chmod o+t va
[15:53:40 root@centos7 data]#ll -d va
drwxr-xr-t. 2 root root 6 Mar 18 15:45 va

[15:53:44 root@centos7 data]#chmod o-t va
[15:54:01 root@centos7 data]#ll -d va
drwxr-xr-x. 2 root root 6 Mar 18 15:45 va

设定文件特殊属性

  • chattr +i FILE 不能删除、改名、更改
  • chattr +a FILE 只能追加内容
  • lsattr FILE 显示特定属性

访问控制列表

  • ACL:Access Control List,实现灵活的权限管理
  • 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
  • CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
  • CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
    tune2fs –o acl /dev/sdb1
    mount –o acl /dev/sdb1 /mnt/test
  • ACL生效顺序:所有者,自定义用户,自定义组,其他人
  • 为多用户或者组的文件和目录赋予访问权限rwx
    mount -o acl /directory
    getfacl file |directory
    setfacl -m u:wang:rwx file|directory
    setfacl -Rm g:sales:rwX directory
    setfacl -M file.acl file|directory
    setfacl -m g:salesgroup:rw file| directory
    setfacl -m d:u:wang:rx directory
    setfacl -x u:wang file |directory
    setfacl -X file.acl directory
  • ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限
  • getfacl可看到特殊权限:flags
  • 通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
  • base ACL 不能删除
  • setfacl -k dir删除默认ACL权限
  • setfacl –b file1清除所有ACL权限
  • getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
  • mask只影响除所有者和other的之外的人和组的最大权限
    Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective
    Permission)
    用户或组的设置必须存在于mask权限设定范围内才会生效
    setfacl -m mask::rx file
  • –set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含
    UGO的设置,不能象-m一样只是添加ACL就可以
  • 示例:
    setfacl --set u::rw,u:wang:rw,g::r,o::- file

备份和恢复ACL

  • 主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
    getfacl -R /tmp/dir1 > acl.txt
    setfacl -R -b /tmp/dir1
    setfacl -R --set-file=acl.txt /tmp/dir1
    setfacl --restore acl.txt
    getfacl -R /tmp/dir1

SHELL脚本编程基础

基础编程

  • Linux:Talk is cheap,show me the code
  • 程序
    程序:算法+数据结构
    数据:是程序的核心
    数据结构:数据在计算机中的类型和组织方式
    算法:处理数据的方式
  • 程序编程风格:
    过程式:以指令位中心,数据服务于指令
    对象式:以数据为中心,指令服务于数据
  • shell程序:提供了编程能力,解释能力

程序的执行方式

  • 计算机:运行二进制指令
  • 编程语言:人与计算机之间交互的语言
  • 低级编程语言:
    机器:二进制的0和1的序列,称为机器指令。与自然语言差异太大,难懂、难写
    汇编:用一些助记符号替代机器指令,称为汇编语言
    如:ADD A,B 将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中
    汇编语言写好的程序需要汇编程序转换成机器指令
    汇编语言稍微好理解,即机器指令对应的助记符,助记符更接近自然语言
  • 高级编程语言:
    编译:高级语言–>编译器–>机器代码–>执行
    C,C++
    解释:高级语言–>执行–>解释器–>机器代码
    shell,python,php,JavaScript,perl

编程基本概念

  • 编程逻辑处理方式:
    顺序执行、循环执行、选择执行
  • shell编程:过程式、解释执行
    编程语言的基本结构:
    各种系统命令的组合
    数据存储:变量、数组
    表达式:a + b
    语句:if

shell脚本基础

  • shell脚本:
    包含一些命令或声明,并符合一定格式的文本文件
  • 格式要求:首行shebang机制
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl
  • shell脚本的用途:
    自动化常用命令
    执行系统管理和故障排除
    创建简单的应用程序
    处理文本或文件

创建shell脚本

  • 第一步:使用文本编辑器来创建文本文件
    第一行必须包括shell声明序列:#!
    添加注释
  • 第二部:运行脚本
    给予执行权限,在命令行上指定脚本的绝对或相对路径
    直接运行解释器,将脚本作为解释器程序的参数运行

脚本规范

  • 脚本代码开头约定
  1. 第一行一般为调用使用的语言
  2. 程序名,避免更改文件名为无法找到正确的文件
  3. 版本号
  4. 更改后的时间
  5. 作者相关信息
  6. 该程序的作用,及注意事项
  7. 最后是各版本的更新简要说明

脚本的基本结构

#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE

shell脚本示例


#!/bin/bash
#------------------------------------------
#Filename: hello.sh
#Revision: 1.1
#Date: 2017/06/01
#Author: wang
#Email: wang@gmail.com
#Website: www.magedu.com
#Description: This is the first script
#Copyright: 2017 wang
#License: GPL
#------------------------------------------


脚本测试

  • 检测脚本中的语法错误
    bash -n xxx.sh
  • 调试执行
    bash -x xxx.sh

变量

  • 变量:命名的内存空间
  • 变量类型:
    作用:
  1. 数据存储方式
  2. 参与的运算
  3. 表示的数据范围
    类型:
    字符
    数值:整型,浮点型
  • 静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时
    检查,如:java,c
  • 动态编译语言:不用事先声明,可随时改变类型,如bash,Python
  • 强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,
    如java , c# ,python
    如:以下python代码
    print(‘magedu’+ 10)
    提示出错,不会自动转换类型
    print(‘magedu’+str(10)) 结果为magedu10,需要显示转换类型
  • 弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为
    字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
    如:bash 不支持浮点数,php,javascript
  • Shell中变量命名法则:
  1. 不能使程序中的保留字:例如if, for
  2. 只能使用数字、字母及下划线,且不能以数字开头
  3. 见名知义
  4. 统一命名规则:驼峰命名法
  • Shell中命名建议规则:
  1. 变量名大写
  2. 局部变量小写
  3. 函数名小写
  4. 用英文名字,并体现出实际作用

bash中变量的种类

  • 根据变量的生效范围等标准划分下面变量类型
  1. 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
  2. 环境变量:生效范围为当前shell进程及其子进程
  3. 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
  4. 位置变量:$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
  5. 特殊变量:$?, $0, $*, $@, KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲,$

局部变量

  • 变量赋值:
    name=‘value’

  • 可以使用引用value
    (1) 可以是直接字串:
    name=“root"
    (2) 变量引用:
    name="$USER"
    (3) 命令引用:
    name=COMMAND
    name=$(COMMAND)

  • 变量引用:
    ${name} 或者 $name

    " "弱引用,其中的变量引用会被替换为变量值

    ’ '强引用,其中的变量引用不会被替换为变量值,而保持原字符串

  • 显示已定义的所有变量:set

  • 删除变量:unset name


环境变量

  • 变量声明、赋值:
    export name=VALUE
    declare -x name=VALUE
  • 变量引用:
    $name, ${name}
  • 显示所有环境变量:
    env
    printenv
    export
    declare -x
  • 删除变量:
    unset name
  • bash内建的环境变量
    PATH
    SHELL
    USER
    UID
    HOME
    PWD
    SHLVL
    LANG
    MAIL
    HOSTNAME
    HISTSIZE
    _ 下划线

只读和位置变量

  • 只读变量:只能声明,但不能修改和删除
  • 声明只读变量:
    readonly name
    declare -r name
  • 查看只读变量:
    readonly -p
  • 位置变量:在脚本代码中调用通过命令行传递给脚本的参数
    $1, $2, … 对应第1、第2等参数,shift [n]换位置
    $0 命令本身
    $* 传递给脚本的所有参数,全部参数合为一个字符串
    $@ 传递给脚本的所有参数,每个参数为独立字符串
    $# 传递给脚本的参数的个数

*注意:$@ $只在被双引号包起来的时候才会有差异

  • set – 清空所有位置变量

第二周博客之小白懵了相关推荐

  1. 20162316刘诚昊 第二周博客作业

    20162316刘诚昊 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一.数字不能为被声明变量的首个字符,否则会报错. 二.在输出的引号内是可以用中文的,但 ...

  2. 软工Hello World!团队第二周博客汇总

    2017.10.20-2017.10.26 Scrum会议: 第一天:http://www.cnblogs.com/liusx0303/p/7704482.html 第二天:http://www.cn ...

  3. BUAA-2023软件工程第二次博客作业

    BUAA-2023软件工程第二次博客作业 项目 这个作业属于哪个课程 2023北航敏捷软件工程 这个作业的要求在哪里 个人作业-软件案例分析 我在这个课程的目标是 学习并实践软件工程开发的方法论.在把 ...

  4. go基础第一遍学习(李文周博客)

    go基础第一遍学习记录,以下内容来自李文周博客 文章目录 my重点记录 1.println和prinf的区别 一.通常情况: 二.整数: 三.浮点数: 四.字符串: 五.布尔类型: 2.[golang ...

  5. C语言第二次博客作业---分支结构

    C语言第二次博客作业---分支结构 一,PTA实验作业 题目1.计算分段函数 本题目要求计算下列分段函数f(x)的值 1.代码 double x, result;scanf("%lf&quo ...

  6. 【精】【火】关于CSDN博客与博主的第二个博客之间的区别与联系

    因为CSDN不能上传视频,和嵌入视频链接的原因: 本人在今天将会使用另外一个博客,当然CSDN博客也会经常使用! 本CSDN博客将会以记录技术细节,和编程风格,学习以及仿照大佬代码等这些博文: 而新的 ...

  7. 2022北航敏捷软件工程 第二次博客作业

    2022北航敏捷软件工程 第二次博客作业 项目 内容 这个作业属于哪个课程 2022年北航敏捷软件工程 这个作业的要求在哪里 个人作业-软件案例分析 我在这个课程的目标是 了解软件工程的方法论.在实践 ...

  8. 领奖啦!第二期博客征文《从HelloWorld启航——说说那些年我们一起写过的代码》获奖名单揭晓

    让大家久等了,下面颁布第二期博客征文<从HelloWorld启航--说说那些年我们一起写过的代码>获奖博文名单: 排名 标题 文章地址 1 从Hello World到defmacro,那些 ...

  9. 现代软件工程 第一周博客记录

    前言: 这是我真正意义上的第一篇博客,希望以后我能时刻谨记自己的这一篇博客对自己的分析,并且能及时认识到自己的错误和在学习上的放松,一直奋斗下去. 1.自我介绍 大家好,我叫罗博伦,来自西南石油大学软 ...

最新文章

  1. Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire
  2. 这是一个不完整的详细Java多线程,但对于初学者足够了,相信我,你会爱上她的
  3. python怎么检查数据库实例能否链接_python pymysql链接数据库查询结果转为Dataframe实例...
  4. Tomcat 配置 Context
  5. Linux服务-NFS服务部署
  6. Bash脚本教程之命令提示符
  7. python代码计算字数_Python计算一个文件里字数的方法
  8. 能力不错的大厂高 P,为什么过不了小厂的试用期?
  9. mysql锁问题排查_Mysql死锁问题如何排查和解决?
  10. MongoDB 聚合管道(Aggregation Pipeline)
  11. angularjs 循环完之后执行的事件
  12. CSS学习总结(1)——基本介绍
  13. matlab示例程序,matlab示例程序
  14. Navicat Premium 12注册机破解方法
  15. 【蓝桥杯省赛真题34】Scratch九宫格 少儿编程scratch蓝桥杯省赛真题讲解
  16. GB28380台式计算机,微型计算机能效限定值及能效等级 GB28380-2012
  17. 【新技能get】让App像Web一样发布新版本
  18. 神奇智能搜索引擎:perplexity智能搜索引擎(ChatGPT与Edge合体——联网版chatGPT)
  19. 流式数据武装零售业,打响“降维”反击战!
  20. 外包公司面试门槛高吗?软件测试员进外包公司容易吗?

热门文章

  1. phantompdf 下载_实用!手机俄语输入法下载攻略!
  2. 1恢复 群晖raid_群晖SHR、RAID1阵列模式拆分、降级为BASIC教程
  3. HTML中的time标签
  4. C语言中exit函数
  5. SSL证书错误怎么解决
  6. Uncaught SyntaxError: The requested module ‘/node_modules/.vite/deps/vue-router.js?v=6552c805‘
  7. 150套JSP源码--免费下载
  8. 一文带你入门Linux
  9. C#配置NuGet包log4Net,生成日志文件
  10. CentOS7.2中vsftp安装、配置、卸载