Linux & Mac terminal
Linux basic command
普通命令
cd ../.. 直接回到根目录,对应在finder中使用 ⇧+⌘+h
ls -al == ls -la
ls -l == limit
ls -a 看全部的
ls -l 看权限 (可以查看某一个文件的权限 : ls -l myfile)
左到右 一共十位 构成是 type | rwx | rwx | rwx
type: p、d、l、s、c、b和-
- p表示命名管道文件
- d表示目录文件
- l表示符号连接文件
- -表示普通文件 //myfile作为一个txt文件 属于普通文件
- s表示socket文件
- c表示字符设备文件
- b表示块设备文件
剩下9位 每3位一组 分别表示文件所有者的权限,同组用户的权限,其他用户的权限
⚠️ 首先描述的是所有者的权限 而不是根用户的权限
- r表示可读,可以读出文件的内容
- w表示可写,可以修改文件的内容
- ==x表示可执行,可运行这个程序 // execute==
- 没有权限的位置用-表示 「所有者 是否可读、可写、可执行|同组用户是否可读…」
.作为分割, 之后则是文件的其他属性
- 1 $\Rightarrow$ 有一个硬连接
- root $\Rightarrow$ 所属用户 | 之后的 root $\Rightarrow$ 用户所属的组
- 0 $\Rightarrow$ 文件字节数
- 时间 $\Rightarrow$ 最后修改时间
cat textA > textB 我们把A中的内容给拿到B里了,但B里的内容会被overwrite
cat testA >> textB 这次则是追加
touch 文件存在=>修改时间戳|文件不存在=>创建文件
echo 显示一行的内容
rm 删除文件
- rm -rf (r $\Rightarrow$ recursive | f $\Rightarrow$ force) 可以删除目录 子目录和其中的文件一起全部删除
mv 移动文件 也可以改名
- 文件 $\Rightarrow$ 文件 改名字
- 文件 $\Rightarrow$ 目录 移动到目录中(⚠️工作目录)
- 目录 $\Rightarrow$ 目录 | 如果后面的目录存在,就移动到这个目录下|如果不存在就改目录名
- 目录 $\Rightarrow$ 文件 报错
语法: cp[options] source dest
-r 复制目录时的参数 可以把目录下所有的文件都复制。 ⚠️ 如果不加这个参数 目录的复制会直接跳过
su & sudo
- su是直接切换成超级用户 su- / su + 用户名 可以拿来登陆
- 使用sudo命令时不需要知道超级用户的口令 使用的是自己的口令
用户&组
- linux中有三种权限不同的用户: 超级用户 root | 伪用户(不能直接登陆系统) | 普通用户(可以登陆 但只可以管理自己的目录)
- 伪用户存在的意义:在使用特殊服务时 我们会自己以伪用户登陆(比如匿名访问ftp客户端 使用ftp客户)
- 而
组
是用户的集合 用户被加入组来获得额外的存取权限,因为组中所有的用户都可以共享属于该组的文件。 以下介绍私有组
和主组
的概念 - 在linux中 如果创建用户时没有制定他所属的组,那么系统将会建立一个和用户同名的私有组,这个私有组里只有这个用户「这样在这个新用户中创建的文件不会在公共组中被查到」(私有组都只有一个用户)
- 在linux中 用户可以同时属于多个组 但只能在一个主组中(在创建用户时 指定一个标准组 那这个用户就属于这个标准组,否则它自己的私有组就是自己的主组)
用户管理命令
users 查看可登陆用户
- useradd [-options] username
- -d 指定这个用户的主目录 缺省时会在/home创建
- -g 指定新建用户所在主组名称 缺省时创建和用户名相同的组
- -G 指定新建用户所在附加组名称 系统会在这之后创建和用户名相同的组作为新建用户的主组
- usermod 属性修改 (不能修改正在线上的用户的名称、不能修改正在系统上执行程序的用户ID)
- -c comment 账户注释
- -d home_dir 设置用户主目录
- -e expiredate 设置过期日期
- -u uid 修改用户ID 格式:usermod -u NATSU natsumi //把natsumi改成NATSU
- -l login 修改用户名 格式:usermod -l NAT natsumi // 把natsumi改成NATSU
- -g group 强制修改用户的新主组 | -G groups 修改附加组列表
- 比如: usermod -g groupf natsumi //把natsumi加入到groupf组里 (主组)
- usermod -aG sudo natsumi 把组sudo添加到natsumi的附加组列表 这样natsumi可以执行sudo命令 -G是不行的
- -L / -U 锁定、解锁用户账户
- -s shell 设置登录后的shell
- userdel
- -f 强制删除 (现在正登陆的用户也可以删除)
- -r 递归删除 会同时删除用户的主目录
组管理命令 groups [username] 查看用户加入的组
- groupadd
- -g 可以指定新建组的ID
- groupmod 属性修改
- -n 修改组名 和修改名字一样 是先输改动之后的名字 后输改动之前的名字
- groupdel ⚠️ 如果组里有用户 需要先删除用户 再删除这个组
- gpasswd
- -a [username] [groupname] 添加一个成员到组内
- -d [username] [groupname] 从组内删除一个成员
- -M [usernames] [groupname] 设置成员列表
- -A [usernames] [groupname] 设置组的管理员列表
- -r 删除组的密码
- newgrp 切换用户当前的主组(这个切换需要输入密码 并且是暂时的)
用户密码管理 passwd
- 普通用户根据原密码修改自己的密码 而超级用户可以重置包括root在内的所有用户密码
- passwd [-options] [username]
- -d delete 删除密码
- -l lock 锁定账户
- -u unlock 解锁账户
- -S status 显示状态信息
与用户管理相关的文件有
–/etc/passwd 用户名和 UID 保存在此
- 如图 UID < 1000的 是系统用户(伪用户) /sbin/nologin
- 超级用户 UID = 0, GID = 0
–/etc/shadow 用户口令(密码)
- 使用
:
作为分隔符 共有9个字段 - 用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
- 使用
–/etc/group 组和GID
–/etc/gshadow 组口令被保存在
–/etc/login.defs 相关配置参数
–/etc/default/useradd
成批生成用户
newusers [filename] filename 的格式要和 /etc/passwd 一样才行 利用filename文件生成
成批创建密码
chpasswd [filename] filename 每行都应为如下格式: username:passwd
我们还可以使用pwgen命令 它可以批量生成口令
linux文件系统 在linux中不同分区构成一颗唯一的目录树
文件类型
- 普通文件
- 文本文件 行是其基本结构
- 数据文件 (电子表格 数据库)
- 可执行二进制文件
- 目录文件 就是目录 它也是一种文件 存储一组相关文件的位置、大小等与文件有关的信息
- 符号连接文件 指向同一索引文件 使用ls查看时 以字母l开头 -> 指向链接的文件
- 设备文件 外设在linux中也被看作文件 它们被放在/dev 目录中
- /dev/fd0 $\Rightarrow$ 软盘 | /dev/hda $\Rightarrow$ 硬盘
隐藏文件
:以 . 开头 使用ls不显示
- /bin Binaries 存放二进制命令 | /usr 存放普通用户的应用程序、库文件、文档 | /lib Libraries
- /dev Device 设备目录(disk screen)
- /etc 系统配置文件
- /sys System 系统信息 | /tmp Temporary files 临时文件 | /var Variable files 属性经常变化的文件(文件大小、时间、内容经常变化)
文件名通配符 这个很好用
- 号 file * 可以匹配0个和任意多个字符 如file123、fileac 「rm file 这几个文件全都被删除」
- ?号 只和一个字符匹配 file? $\Rightarrow$ file1 但不可以实现file? $\Rightarrow$ file23
- []号 和方括号中的 一个字符匹配(但可以同时输入多个字符) 加入!后的是excluded
- file[1-4] $\Rightarrow$ file1 .2 .3 .4 //
- file[!1234] $\rightarrow$ file 1,2,3,4 之外的其他所有
ln file1 file2 让file1和file2 建立硬链接 | ln -s file1 file2 则是建立软链接
硬连接: file1 和 file2同时指向某个储存空间 (删除file1 对 file2没有影响)
软链接: file2指向file1 而file1才指向一个存储空间 所以file1如果被删除了file2就废了
文件权限
root用户(超级用户)享有最高权力 它可以修改/etc/shadow 账户管理的文件
rwx 在list命令中已经讲解过 但==值得注意的是 在管理目录文件时 x 是指进入目录(使用cd命令)这也是rw命令的基础 没有x命令权限 也不能进行rw== ⚠️ 在只有x权限时 不可以删除文件 也不能列举出文件夹所有文件 比如知道文件名才能访问
在目录中 w权限是最高权限
chown [change owner]改变文件/目录的所有者 ⚠️只有root用户才可以改变文件所有者(文件的所有者可以改变文件所属的组)
- chown natsumi file1 //把file1 的主人换成natsumi
- -R recursive 只适用于目录 | -v verbose 为处理的所有文件显示诊断信息 显示chown命令所做的工作
- chown -R natsumi:group1 /tmp //把/tmp 目录的主人变成 matsuri 和 组 group1
chgrp 改变文件/目录所属的组
chmod 改变文件/目录的权限 同样支持 -R / -v
- linux 不允许用户在创建一个普通文件时 就赋予其可执行权限 必须使用chmod修改
- chmod [who] [+|-|=] [permission] [filename]
- +/- 添加或减少某权限
- = 直接赋予某权限 但取消其他所有权限
- u 主人 g 同组 o 其他 a 所有 (权限有3组 user | 同组 | 其他人) (这个放在 who 一栏 不需要-)
- chmod a+x file1 // 使所有用户都可以执行file1文件
umask 设置文件的缺省生成掩码 「umash规定 不允许 的权限」
- 文件权限的二进制写法: rwx 用0/1 3个二进制表示 然后转十进制数 一共3组
- 缺省状态下 文件的默认权限为 0666(所有人具有读写权限 但无法执行) 文件夹则为0777「⚠️ 这是缺省时的权限 不是缺省时的mask」
- 大多数情况下 root默认mask 0022 普通用户则是 0002 实际权限 = 缺省权限-mask
- 那么实际上的权限就是 root:文件 0644 文件夹0755 | 普通:文件 0664 文件夹 0775
FACL(ACL) 「File Access Control Lists」
如果要细化规定 组内的每个成员具有的不同的权限时 就需要用到ACL权限
getfacl [file/dir]
setfacl
-R recursive| -m 修改ACL | -x 删除ACL | -r 要设置的ACL规则
setfacl -x u:st /project 删除用户的ACL权限
setfacl -b project/ 删除目录上所有的ACL权限
默认的ACL权限只对目录有效
设置默认facl后该目录下新建立的文件和目录都会自动用于ACL权力
setfacl -m d:u:用户名:权限 文件名 更改默认facl
setfacl -R-m u:用户名:权限 文件名 只有已经创建的文件会被更改文件权限 其他的则不会
特殊权限
- 可执行文件
- SUID 使用命令的所属者的权限来运行 (而不是命令执行者的权限) ⚠️ 只对二进制可执行文件生效
- 占用文件主人的x位 变为s 如修改普通用户修改密码 虽然只有root用户可以访问和修改 但由于s位 普通的用户也可以访问/etc/shadow 「可以访问 但是cat读取不了!」
- SGID 使用命令的组权限来运行 占用组的x位 变为 s
- SUID 使用命令的所属者的权限来运行 (而不是命令执行者的权限) ⚠️ 只对二进制可执行文件生效
- 目录的特殊权限
- SGID 设置该权限的目录中创建的文件 会具有该目录的组权限
- Sticky-bit 带有粘滞位的目录中的文件只能被文件的所属用户和root用户删除(无视权限设置)
- 占用 other的x位 变为 t
文件系统
查看分区情况:
•fdisk -l
•df -lh
•lsblk
•blkid
mkfs
lsblk
fdisk /dev/sdc
+5G
vi编辑器
强退 q! //⚠️ !+cmd $\Rightarrow$ 回到SHELL
重做 $\Rightarrow$ ⌃ + r
u $\Rightarrow$ undo
:下
- set nu 加入行号
- set nonu 不要行
- syntax on: 开启语法高亮
- :set number: 显示行号
- :set tabstop=4: 设置 Tab 键宽度
- :set expandtab: 使用空格替代 Tab
- :set softtabstop=4: 设置软件 Tab (自动Tab)宽度为 4
- :set shiftwidth=4: 设置自动缩进宽度为 4
- :set autoindent: 开启自动缩进,通常用于编写程序
- :set textwidth=20设置行的宽度
- :set wrap 设置自动换行
管道与重定向
管道:将前面命令的结果 作为下一个命令的输入来执行 |
echo 平常会使用”” 转义字符 在之前加上\ 就可以正常输出了
tr -c -d -s [“string1”] [“string2”] < input-file
- -c 没有出现在字符串1中的 字母 将被替换为字符串2中的 最后一个字母(ASCII字符才可以)
- -d 删除字符串1中出现了点所有输入字符
- -s 如果没有string2 将string1字符去重 如裹有string2 去重之后再用string2替换1
- input-file 是转换之后的文件名
进程管理
查看进程
- ps process status 静态查看当前的进程
- 输出 PID TTY(终端) 运行时间 ⌘(产生该进行的命令)
- ps -l 获取PID
- top 动态 3s刷新
- P $\Rightarrow$ CPU使用率排序
- M $\Rightarrow$ 内存使用率排序
- N $\Rightarrow$ PID排序
- q 退出top
- pstree
杀死进程
- kill 这个命令向进程发送信号 而不是直接杀死进程
- kill -[sign] PID // kill -1 2246 让2246进程重启 ⚠️ - 不能去 所以 1 实际上是-1
- 1 立即关闭进程然后重启
- 2 终止前台进程
- 9 强制终止
- 15 优雅的退出(程序可以自己选择 退还是不退)
- 18 唤醒暂停的进程
- 19 暂停前台进程 == ctrl+z
- kill -[sign] PID // kill -1 2246 让2246进程重启 ⚠️ - 不能去 所以 1 实际上是-1
- killall
- pkill 利用进程名称杀死进程 可以杀死终端
进程有其ProcessID 「PID」
还有4种识别号:
- real user ID 「RUID」 | real group ID 「RGID」 $\Rightarrow$ 识别正在运行此进程的用户和组
- 一个进程的RUID和RGID就是运行此进程的UID / GID
- effect user ID 「EUID」| effect group ID 「EGID」$\Rightarrow$ 确定一个进程对其访问的文件的权限
- 如果SetUID/SetGID 没有被设置 那么它们
进程优先级
优先级为 -20 - 19 共40级 数字越大 优先级越低 默认时为0
- nice -n 5 top top命令来到优先级5 // 需要在运行命令前调整!
- renice //可以调整正在运行的命令 分为 在top内调整 和 直接renice两种
- 打开top命令 tpye
r
输入调整进程号和优先级值 - 10 18625 将PID为18625的进程优先级调整为10 ⚠️ centos 先输入PID 然后调进程
- renice +10 -u natsumi //这时不在top里 直接输就行
- 打开top命令 tpye
进程调度 只能有一个前台进程 在不执行任何前台操作时 这个进程就是SHELL
通过jobs
查看后台的命令 「只能看自己终端的」 jobs -l 显示PID
-& 调入后台 sleep 10000 & //如果是需要交互的命令 放入后台也无法执行
- find / -name install.log &
- 执行命令时 ⌃+z 也可以放入后台
fg %工作号 $\Rightarrow$ 把暂停的工作恢复到前台(⚠️不是PID 是工作号)
bg%工作号 $\Rightarrow$ 把暂停的工作恢复到后台
-at
- atq 查看没有执行的工作任务
- atrm 删除已经设置的任务
- at -c [jobnumber]
-batch
-cron
About mac terminal
- ohmyzsh自动补全
git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
- open ~/.zshrc 在这个文件里修改
plugins=(git)
=>plugins=(git zsh-autosuggestions)
- cd ~/.oh-my-zsh/themes && ls 查看当前主题