第一次接触CTF这种东西，看到老大发了一个CTF连接，想尝试一下。拿到手看了看这有点像 PHP 代码，这个 if 判断优先计算1000-778 < ?，左边等于222，小于右边的谁?问号的地方只能输入一个字符?把 maxlength 值改一下，或者去掉，输入比 222 大的数字(估计PHP做了if，不能输入其他字符)得到flag。打算这周从 ichunqiu 的练习入手，先来看看界面。左上角提示有几个实验工具供我们使用，菜刀、net.exe、dedeCMS，按照提示先去下载需要的工具直接使用提供的工具进行爆破我们已经得到帐号密码，但是密码已经加密，而且长得很奇怪(在这里已经跌过几次)，先来了解一下 dedecms 密码加密方式$password = $row['pwd']; $pwd = substr($password, 5, 20);它采取 md5 加密(从网上搜索来看好像是 32 位)，这段 PHP 代码使用字符串截取函数，返回第 6 位开始长度为 20 位的字符串(第一位是从 0 开始数而不是 1)。拿我们的密码来解释一下 abab29e084ff095ce3eb，这是经过函数处理后的密码，也就是说他的前面还有 6 位被截掉 xxxxxxabab29e084ff095ce3ebxxxxxx(我们用x代替被剔除字符串)，从第6位开始为第一位取到第20位停止那么就是我们现在的密码abab29e084ff095ce3eb。我们知道了加密方式后怎么解密？它的方法是前面减去 3 位，后面减去 1 位。现在剩下 16 位的 md5 就可以拿去解密了，下面是另外的情况做个补充。dedecms首先获得某密码的32位MD5加密值,然后去掉后面8位,这 样,拿剩下的24位来做为密码的加密值.这里我们可以想到,32位转16位可以把32位的前8位和后8位去掉,剩下的中间就是其16位的加密值,于是,我 们可以把dedecms中暴出来的那窜24位加密值的前8位去掉,剩下的16位就可以拿去破解了接下来我们只需要找到后台让马儿奔跑起来。扫了下后台没有发现入口网上搜索了一下 dedecms 爆后台得到以下信息/robots.txt/data/admin/ver.txt/data/mysql_error_trace.inc/data/mysql_error_trace.inc 爆出来补robots.txt 是无望了，搜到一篇文章：有了用户名和密码，但是不知道后台地址，如何找后台路径？dedeCMS漏洞：mysqli_error_trace.inc 文件里会残留后台路径。dedeCMS目录中的data/mysqli_error_trace.inc文件，是记录数据库出> 错信息。一般是用于网站存在错误，系统自动记录在该文件中，进一步说，就是> 该文件是记录sql错误信息的文件，类似于日志功能，关键是它会记录后台路径。我想是不是数据库进行连接的拓展更换了所以文件名不一样本扩展自 PHP 5.5.0 起已废弃，并在自 PHP 7.0.0 开始被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换之用我们解出来的密码登录。找到一个上传点，为了安全一般默认是不能让你上传其他文件的，admin 管理员应该有权限进行修改配置。看来不做处理真的无法上传，上传有个提示，可以让我们的马儿开心起来。直接用菜刀连接传一个 cmd 上去用传的 cmd 连接访问桌面上的flag文件居然会拒绝访问(没有权限)用whoami查看一下当前账户(system账户待补充)拒绝访问应该是权限不够，用 cacls filename 查看一下权限应该是可以设置的 cacls 不知道怎么用，后面跟个 /? 查看一下帮助文档cacls filename /G system:F 可以修改权限但是需要确认，shell 中无法输入 Y 这就很尴尬了，百度了方法，可以不用输入确认。先用 cacls filename /E /G system:F编辑 ACL 进行授权。授权成功读取 flag其他方式待补充参考资料：dedecms解密dedecms寻找后台WriteupWriteup2Cacls无需确认的正确写法
目录[TOC]硬盘结构我们这此写的是机械硬盘。来看看构成把，磁盘结构由盘片（Platters，有磁性），轴，马达，磁头（Heads）组成。硬盘数据存贮在盘片（Platters）中。由磁头（读写头）读写数据。每个盘(碟)片，都有两面，一般4个盘片，0-7 面 共 8 面可用，双面进行存贮数据，因此也会相对应每盘片有 2 个磁头。当磁盘旋转时，磁头若保持在一个位置上，则每个磁头都会在磁盘表面划出一个圆形轨迹，这些圆形轨迹就叫做 磁道-A（Track，以轴为中心组成的同心圆），数据就存在两条线之间，整圈磁道分为多段每段叫 扇区-C（Sector），不同盘片上相同编号的磁道组成 柱面-B(Cylinder扇面)，D：簇（扇区组）。盘片是高速旋转时，磁头伸缩(悬浮在盘片上)读取数据，在旋转同时读取AB两个数据时，磁头不一定就刚好停在 A，那么就要等待下一圈，这叫磁盘延时也称寻道时间或寻址时间。那盘片旋转越快磁盘延时就越小，读取数据越快，一般台式机 7200/S，笔记本 5400/S。运行状态 视频引用自维基百科 https://upload.wikimedia.org/wikipedia/commons/c/c5/HardDisk1.ogvMBR（Master Boot Record）主引导记录，位于0 磁道 0 柱面 1 扇区，共 512Byte，由三部分组成，第一部分 446Byte 的 boot loader(启动加载器，存放引导代码)，第二部分 64Byte 的磁盘分区表，每个分区占据 16 字节，第三部分 2Byte 的 magic number，用于检查 MBR 是否有效。在存贮数据的时候，一般把经常读取的数据放到最外围磁道，磁盘分区表共64字节，每个分区占据16字节，主分区：主分区+扩展分区只能 <=4，扩展分区：占用16字节空间，并且值能有一个，扩展分区是一个指针，指向磁盘另外的位置，不能直接存储数据，如果要想存储数据，需在扩展分区上建立逻辑分区，逻辑分区可以有多个。低级格式化：高级格式化：文件系统：可以理解成一种软件。block/inode/super block 和链接文件block：block 是记录文件内容的那个区域(位置)，ext3 文件系统中每个 block 默认大小 4K文件系统：软件(XFS,NTFS,FAT,EXT3,EXT4等)，存贮数据或文件的一种格式，文件系统不存在分区之上，它位于磁盘的某一个位置。文件系统把分区分割成两部分，第一部分存放元数据(metadata)，另一部分存放真实数据。元数据和数据本身没有关系，包括的是数据属性，比如数据归属，数据权限，数据时间戳。这块区域叫 inode(index node)，这些信息也在元数据中占据空间大小，它不包括文件名，每个 block 都有对应的 inode，同一个 inode 可以指向多个文件。磁盘工作原理：存贮数据的时候会对每一个 block 进行扫描，如果数据量大了速度就非常慢。在元数据区域内有一个 block bitmap 区域，用于标记 block 是否被使用，使用了把某一位标记成1(不是整个数据块)，没使用标记成 0，这样就不用去遍历数据块了。super block(超级块)：管理元数据区域内的其他区域删除文件：把数据对应的 inode 和 block 变成 0，实际数据并没删除，但原有 inode 和 block 被覆盖或使用了则无法恢复。新建文件：寻找一个没被使用过的 inode 值和 block，把数据填充进来(占位)，block 会准备多于实际情况所占用的 block，防止磁盘碎片的产生(碎片会使硬盘执行能够降低计算机速度的额外工作)。复制文件：建立新文件移动文件：改变 inode 和 block 的值，不对数据操作。链接文件：分为软连接(符号链接)与硬链接(hard links)语法：ln [options] src_file des_file 选项：-s，创建软连接，不加选项为硬链接-v，显示详细过程先 touch 一个文件 1.txt，可以看到默认硬链接次数为 1，inode是 16797806。用 ln 给 1.txt 个硬链接。做硬链接过程中不会对数据进行改变，硬链接过后操作 A.txt 就相当于操作 1.txt，当然操作 1.txt 也是同理(它们 inode 相同)。如果你不小心删掉了 1.txt 源文件也没事，目标文件 A.txt 还在(还有其他文件指向那个 inode，inode 存在，block 也就存在)。inode 还是一样(指向同一个节点)硬链接次数为 2，硬链接的目标文件不会占用磁盘空间，硬链接有限制：不能跨文件系统(指向一个 inode 节点)，只能对文件链接不能链接目录。来看看软连接软连接时要记得要使用绝对路径，源文件 1.txt 与目标文件 f.txt 的 inode 不一样，所以当你删除 f.txt 时源文件不会受影响。还有两个地方要注意，第一个是目标文件大小这里的大小是指向的是源文件路径字符个数，第二个是目标文件权限，它的权限居然是 777，要注意这个应当是源文件的权限。软连接可以跨文件系统建立，可以为文件或目录建立。再来看一种情况没有源文件，下图是删除源文件后的样子。这里 f.txt 指向的源文件不存在，它会闪烁。我们随便拿一个文件过来命名为 1.txt 为源文件顶替一下。现在恢复正常了，说明软连接只要路径文件名存在就行，并不区分具体文件内容。参考资料机械硬盘构造与优劣硬盘结构硬盘-维基百科
目录[TOC]nsswitch我们知道用户登录时会把用户名转换为 UID，怎么转的？今天来了解一下。在 Linux 中有三种认证机制称之为 3A：authentication，认证机制，资源申请者证明自己本身的一个过程authorization，授权机制，用户是否可以访问一个服务或文件，用户访问服务或文件的能力audition，审计机制把字符解析成数字或把数字解析成字符这种过程叫 名称解析。解析用户名和密码会用到 /etc/passwd 文件，解析网址会用到 DNS 或 /etc/hosts 文件，在 Web 中进行登录使用到数据库(db)、ldap(轻量级目录访问协议)。那在 shell 里输入 passwd 命令它怎么找到 /etc/shadow 文件，应用程序会去调用 nsswitch(name services switch) 对应的库，它的配置文件在 /etc/nsswitch.conf来看看它的语法：info:methodaction methodactioninfoautomount 自动挂载（/etc/auto.master和/etc/auto.misc） bootparams 无盘引导选项和其他引导选项（参见bootparam的手册页） ethers MAC地址 group 用户所在组（/etc/group） hosts 系统信息（/etc/hosts） networks 网络信息（/etc/networks） passwd 用户信息（/etc/passwd） protocols 协议信息（/etc/protocols） publickey 用于安全模式下运行的NFS rpc RPC名称和编号（/etc/rpc） services 服务信息（/etc/services） shadow 映射口令信息（/etc/shadow）methodfiles：搜索本地文件，如/etc/passwd和/etc/hosts nis：搜索NIS数据库，nis还有一个别名，即yp dns：查询DNS（只查询主机）activestatusnotfound：方法已经执行，但是并没有找到待搜索的值。默认的动作是continueSUCCESS：方法已经执行，并且已经找到待搜索的值，没有返回错误。默认动作是return。UNAVAIL：方法失败，原因是永久不可用。举例来说，所需的文件不可访问或者所需的服务器可能停机。默认的动作是continue。TRYAGAIN：方法失败，原因是临时不可用。举例来说，某个文件被锁定，或者某台服务器超载。默认动作是continue。也就是说除了成功return，没有找到都continueactionreturn：返回到调用例程，带有返回值，或者不带返回值。continue：继续执行下一个方法。任何返回值都会被下一个方法找到的值覆盖。搜索顺序如果你想优先查找谁，就尽量往左放，左边优先级大于右边。前面介绍完语法了来看看几个例子吧# Example: #passwd: db files nisplus nis #shadow: db files nisplus nis #group: db files nisplus nisdb files nisplus(nis增强版，是 sun 公司商业软件) nis（network infomation service，一个开源软件），表示从这些文件中从左向右寻找，也就是它的方法，语法中的 action 是对 method 的返回状态的响应。怎么找到相应的 files/service/db？libnss 库（.so）帮我们完成，在 /lib64/ 中我们要查看这些 .so 文件，要用 readelf 命令加上选项 -a(查看所有)关于域名解析成 ip，第一个是 files，会在 host 文件当中会优先寻找 /etc/hosts，从左向右进行寻找，找到即停止 return 值找不到则继续向右寻找，全部都找不到返回 myhostname。#hosts: db files nisplus nis dns hosts: files dns myhostname这是另一种语法，当中的 #services 是 info，nisplus 为方法， [NOTFOUND=return] 表示对前一个方法的响应，如果 stat 为 notfound 就继续向下查找，files 表示方法PAM 验证在登录时调用 login 应用程序再交给 PAM 嵌入式认证模块进行验证。PAM 它本身不会执行验证，需要借助策略和模块来验证，我们用 ldd Service_Path 来看它所需要的库，有的话说明它支持 PAM。[root@localhost ~]# ldd /usr/bin/login | grep libpam libpam.so.0 => /lib64/libpam.so.0 (0x00007f587d389000) libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f587d185000)在 pam.d 下存放着系统支持 pam 的服务配置文件，其中的 ohter 文件是系统中支持的服务没匹配到任何条目时，会匹配 other 中的配置。下面我们看下 login 文件。[root@localhost pam.d]# cat login #%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth include postlogin account required pam_nologin.so account include system-auth password include system-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so第一行 #%PAM-1.0 是 PAM 版本。这个文件有三列，第一列是 type，第二列是 control，第三列是 modules，还有第四个没用到的是 [modules_args]。type：auth(authentication)，是身份验证，验证用户名和密码正确性account，检查用户名和密码有效性(过期，禁用等)password，修改密码时，密码是否符合安全性(长度，大小写等)session，用户会话相关属性control：required，如果匹配失败了不返回错误信息，继续匹配下面的条目直到完成。requirest，如果匹配失败，不匹配下面的条目直接返回错误信息。sufficient，如果匹配成功，不匹配下面的条目直接返回成功信息。optional，不影响最终结果(有没有都一样)include，引用其他的配置文件，把配置权交给引用的文件(引用文件跳出，则整个匹配结束)。substack，引用其他的配置文件，把配置权交给引用的文件(引用文件跳出，仅仅跳出子匹配)。control 还有另一种语法，就是 [user_unknown=ignore success=ok ignore=ignore default=bad]，格式是：value1 = action1 value2 = action2 ……其中 value 可以是下列 Linux PAM 库的返回值：successopen_errsymbol_errservice_errsystem_errbuf_errperm_deniedauth_errcred_insufficientauthinfo_unavailuser_unknownmaxtriesnew_authtok_reqdacct_expiredsession_errcred_unavailcred_expiredcred_errno_module_dataconv_errauthtok_errauthtok_recover_errauthtok_lock_busyauthtok_disable_agingtry_againignoreabortauthtok_expiredmodule_unknownbad_item和default。最后一个 [... default=bad] 能够用来设置上面的返回值无法表达的行为，例如：required [success=ok new_authtok_reqd=ok ignore=ignore default=bad] requisite [success=ok new_authtok_reqd=ok ignore=ignore default=die] sufficient [success=done new_authtok_reqd=done default=ignore] optional [success=ok new_authtok_reqd=op default=ignore]对应 action 值：ignore，忽略执行结果bad，如果失败，结果被用于整个执行栈，后续栈继续执行。die，和 bad 相似，失败直接返回结果，后续栈不执行。ok，如果 PAM_SUCCESS 覆盖之前的值done，和 OK 相似，但是栈直接返回结果reset，重置栈当前状态modules 匹配认证模块我系统是 64 位，认证模块在 /lib64/security/ 下，/etc/security 下有其他支持PAM模块的配置文件比如 access.conf，/usr/share/doc/pam-版本/txts 存放着 PAM 说明文件。每个模块功能不一样，常用模块：pam_env.so，设置环境变量的模块，如果需要额外的环境变量，可以使用 pam_env.so 进行设置，配置文件在 /etc/security/pam.env.confpam_unix.so，提供验证阶段的验证功能，也可提供授权管理pam_secruetty.so，限制系统管理员只能从安全的终端登录，配置文件在 /etc/securettypam_nologin.so，限制普通使用者能否登录主机进行使用，当 /etc/nologin 文件存在时，所有的普通用户都无法登录。pam_cracklib.so，可以限制恶意攻击，检查密码强度pam_pwquality.so，完全兼容 pam_cracklib.so，检查密码，包括设置的密码是否在字典里pam_rootok.so，如果 UID 为 0，直接通过，如 root 用户 su 到普通用户使用此模块pam_listfile.so，验证时使用其他的文件pam_access.so，控制访问的模块，默认配置 /etc/security/access.confpam_limits.so，限制使用者打开文件数量和单个文件大小等ulimit [options] 限额：-H，hard limit 严格的限制，必能超过设置的数值-S，soft limit 警告的限制，超过设定数值系统会发出警告，通常 soft 比 hard 小-a，选项后面不加参数，可以列出系统中所有的限制数值-c，当某个用户程序发生错误的时候，系统会将内存中的应用程序写为文件，这种文件为核心文件(core file)，限制每个核心文件的最大容量-f，此 shell 可以创建的文件的大小，针对当前 shell(单位kb)-l，可以锁定的内存量-u，单一用户可以使用的最大进程量-t，可以使用的最大的 CPU 时间参考资料nsswitch.conf配置文件Linux可插拔认证模块(PAM)
目录[TOC]简介注释#，这是单行注释，并不是所有dbms都支持-- ，这是单行注释(-- 后面有个空格)/*这是多行注释*/大小写问题：在 Liunx 语法中区分大小写，windows 相反。select distinct 列名 from 表名 #distinct 表示从这一列中找出不同的数据(去重)group by 列名 #用于查询后数据分组，加入有11、22、11、三条数据 我们查询进行 group by后就会分为 11、22。select * from users where name=(select name from users wherer fight=80)# 括号内是子查询，查询的结果交给name使用DDL-增创建数据库create database 库名 可选项; #创建名为user的数据库、可选项示范：create database db_name charset utf8; #在创建数据库时指定编码方式 创建表create table 表名 ( 字段名称1 字段属性(类型) 字段选项, 字段名称2 字段属性(类型) 字段选项, .... ..... ..... .... )charset=utf8 engine=Myisam; --在表后面加上字符集与引擎字段：是对数据的说明，一个归类。字段类型：这个字段存储的是什么数据，在创建表示要指定好字段选项：设置字段一些选项，是否可以为空、是否是主键、是否是唯一键、是否加备注等。null | not null，是否可以为空default，是否有默认值auto_increment，是否可以自动增长，值必须是数字才行， 如：给数据一个编号，数据内容可以重复编号不能重复，缩小范围方便查找primary key，设置主键，数据内容不能重复，在查询数据中作为主查询条件，一张表中一个主键，一般是IDunique [key]，设定为唯一(键)，及表中所有行的数据在该字段中的值不能有重复comment，设置备注，给当前字段设置说明信息字段和表名取名多个单词之间用下划线做分隔符。字段类型数值型：存储的数值大小不一样tinyint、smallint、inttinyint带符号的：-128到127tinyint无符号：0-255smallint带符号的：-32768到32767tinyint无符号：0-65535int带符号的：-2147483648到2147483647int无符号：0到4294967295(40亿)字符串：char，最大长度 255varchar，最大长度 65532text，无限制char 和 varchar的区别：定长型和变长型char：定长型，固定长度了，如：char(30)最大存储30的长度，如果没有写到30长度的数据其他的空出来的位置用空格补齐，写入数据超出定义长度只取定义时长度位数超出部分忽略。varchar：变长型，可以变化长度，如：varchar(30)，最大存30长度，没写满30你写多少就存多少，超过30超出部分忽略。日期时间data，支持的范围'1000-01-01'到'9999-12-31'datetime，支持的范围'1000-01-01 00:00:00'到'9999-12-31 23:59:59'向表里添加数据向表里添加一行数据insert into 表名[(字段名1,字段名2,.....)] values(值1,值1,....);向表里添加多行数据(添加数据时值与字段名是一一对应的)insert into 表名[(字段名1,字段名2,.....)] values(值1,值1,....),(值1,值1,....);删删除数据库drop database xxx;导入数据库登录到数据后执行 srouce 命令。MariaDB [(none)]> source /data/xxx.sql删除数据delete from 表名 [where 条件] [order 排序] [limit 限定] truncate table 表名 #删表内所有数据 where #条件必须添加，否则删除所有数据，建议id，原因id唯一性，删除大范围数据 order by #当前表倒序还是正序，默认就升序，降序为 order by desc。 limit #限定范围可选项示范：delete from 表名 where id=1; select * from 表名 order by 字段 desc limit 0,5;注意：delete删除后会把删除的ld号保留，不在让其他数据占用，truncate 删除相反。删除字段alter table 表名 drop 要删除的字段名;DQL-查查询数据库show databases; #显示所有数据库 show create database 库名; #查询数据库创建语句 select database(); #查看当前所在数据库。查询表use xxx(名字); #打开数据库(切换) show tables; #显示当前数据库内所有数据表 show columns from 表名; show create table 表名; #查询创建表时的语句 show collation; #查看校对集 show charset; #查看编码集(字符集)查看表结构desc 表名; describe 表名; #与desc作用一致部分函数。select now(); #当前日期时间 select version(); #查询Mysql版本号 select user(); #查询当前数据库用户查询数据select * from 表名; #查询表里的所有字段(也称列) select 字段1,字段2,字段3,.... from 表名; #查询xxx表里的指定的字段 select 字段 from xxx limit 1; #查询的结果只显示1行数据 select * from where id=1 #查询满足id=1的字段 select count(字段名) from 表名 #用count()字段总个数,但是返回的字段名是count(字段名) select count(字段名) as 别名 from 表名; #用count()字段总个数,字段返回时用我们定义的别名显示。不用 as 也可以设置别名，用空格隔开就行，比如 select count(字段名) 别名 from 表名 select distinct 列1,列2 #distinct对所有列查询出来的数据去重，如果是两列(或多列)，只有列数据相同才会被去重。 select * from user -desc limit 3 offset 5 #limit显示几行 ，offset从第几行开始显示(0是第一行) select * from user -desc limit 3,5 #简化语法，3是offset，5是显示几行(0是第一行)from 子句表示从哪个(或哪些)表中获取数据。where 子句之算数运算符where子句：给条件的查询算数运算符：+-*/%where 子句之比较运算符 select * from stu where id=11+1 -- 此时字段的值等于12 ... where column_name <> value -- 不等于(!=)比较运算符:=><!=>=<=where子句之逻辑运算符... where desc ... where -desc -- desc升序，-desc降序 ... where -desc -- desc升序，-desc降序逻辑运算符：与(and)或(or)非(not)，这里不推荐使用符号。where 子句之 between 语法范围查询。字段名 between 小值 and 大值;用于查询两个值之间的值，包含小与大值where 子句之 in 语法指定查询。单独查询某些语句时。字段名 in (值1,值2,值3,值4,....);select * from buy where shop in (查询语句); #子查询 select * from buy where shop in ('nike','adidas'); #等同于where shop='nike' or shop='adidas',语法更简洁。where 子句之 like 模糊查询字段名 like '要查询的字符'; 如果直接写字符，匹配(相当于精确匹配)的结果左右不能有其他字符字段名 like '%要查询的字符%'; %表示匹配后面的任何字符，建议前后都加上，在现实中有可能左右都有其他字符包含着。DDL-改修改数据库字符集alter database 库名 charset=新字符集 collate=新的校对集无法更改数据库名，字符集与校对集可以分开修改，但建议一起更改。修改表名alter table 旧表名 rename [to] 新表名; #这里的to可选。添加新字段alter table 表名 add 新字段名 字段类型 字段选项;修改表字段(包括字段)alter table 表名 change 旧字段名 新字段名 新字段类型 新字段选项;修改字段类型和选项alter table 表名 modify 要修改的字段名 新的字段类型 新的字段选项修改数据update 表名 set 原有字段='新的值',age=50 [where] update 表名 set 原有字段='新的值',age=50 where id=1;joinjoin 将两张表做连接。SELECT column_name(s) FROM table1 JOIN table2 ON table1.column_name=table2.column_name; -- join将两个表内容相同的数据显示出来，把不同的丢弃掉。 SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name; -- left join，把左表和右表做比对(以左表为基准)，右边表数据在左表中不存在就显示成 NULL，数据一致就合并显示。 -- 或者换句话说左连接是以左表为主（先把左表显示全乎咯），然后拿着主表 table1 中的 column_name 比对副表 table2 中的 column_table2，如果一直就把就把副表 table2 的对应列数据也展示出来，不一致展示成 null。 SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name; -- right join，把右表和左表做比对(以右表为基准)，左边表数据在右表中不存在就显示成NULL，数据一致就合并显示。杂mysql主从备份与双机热备设置锁表(用户和管理员不能写)，设置只读(普通用户不能写)开启远程登录#开启远程登录，密码是数据库密码，'root'@'%'百分号可以写192.168.4.%或192.168.4.1，就是指定那个地址可以登录。 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '数据库密码' WITH GRANT OPTION; #关闭远程登录 drop user 'root'@'%'; -- 如果开启时不是指定%，就填成对应地址。 #开启和关闭远程登录，每次都要刷新权限 flush privileges; 安全防护控制数据库账户权限应当为不同功能设置不同账户权限（最小权限原则），以避免获取数据库 Shell 后利用账户权限进一步提权。现在我这个页面功能只是查数据就没必要删除或增加数据，所以做个限制吧。# 创建账号和密码为 gbb 只能在本地连接的账户。 CREATE USER gbb@localhost IDENTIFIED BY 'gbb'; # 只赋予 test 数据库下 select 所有表的权限 GRANT SELECT ON test.* to 'gbb'@'localhost';授权查询权限尝试使用操作数据。MariaDB [test]> insert into testdatatable values('lisi', 88); MariaDB [test]> delete from testdatatable where name='zhangdsan'; MariaDB [test]> update testdatatable set age=22 where name='zhangdsan';确实只能查数据。设置监听地址为了减小攻击面，数据库端口 3306 似乎不应对外开放才对，再说我们是 WebServer 和 Database 都放在一台服务器上，真实场景很可能是分别各在服务器上，那可以开放端口，不开放程序就没法连接嘛。由于贫穷放在一台就一台吧，现在是要想法子让 3306 不暴露出来。由于不需要应用服务器连接我们，所以只绑定在本地环回端口，编辑 /etc/my.cnf 在 [client-server] 组下添加 bind-address = 127.0.0.1，相反填 0.0.0.0 端口就会绑定到所有网卡上。[root@localhost ~]# netstat -pantu | grep 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2711/mysqld 参考资料distinct去重sql中JoinMariadb开启远程登录
目录[TOC]简介权限可以用来限制某些其他用户的行为，对于属主和 root 这俩账户来看想怎么操作怎么操作，不受限制！这点一定要清楚。在前面学习 ls -l 认识过权限位，2-4位：文件属主权限(owner 所有者)5-7位：文件属组权限（group 所属组），8-10 位：其他用户权限（other 其他非本群组用户）在这里的关于文件 r 是指读取权限，可以用相关命令来查看文件的内容，w 指写权限，可修改文件内容（其他人没有删除此文件权限），x 指执行权限，这个文件能不能被当作可执行文件或脚本来运行。目录中 r 是指可以查看目录中有哪些内容比如执行 ls 命令，w 可以修改目录中内容(文件或目录等)，x 表示这个目录能不能进入，比如可以执行 cd 命令，读取/修改目录下文件内容必须先进入这个目录才能操作。--- 这种符号表示没有权限，在系统中使用二进制(10进制也是000) 000 数字表示，如果有权限中二进制表示为 1(rwx=111)，其十进制表示为 r=4、w=2、x=1。来试试分析下面着张图怎么表示权限，用前面介绍的十进制做加法，第一条文件属主 root 权限是 rw- 换算成二进制=110(十进制=6)，属组和其他用户都没有权限。来看第二行，rwxr-xr-x 属主权限是 rwx，换为二进制是 111(十进制=7)，属组二进制是 101(十进制=5)，其他用户二进制是 101(十进制=5)。第三行 rwxrwxrwx 属主权限是 rwx 二进制为 111(十进制=7) 属组和其他用户都是 7，很简单吧。权限设置更改属主与属组chown username filename，chown 就是 change owner，用于改变文件的属主。-R，递归更改文件属主和属组(连同文件夹和内容一起更改)--reference，复制一个对象属主和属组的属性到目标文件或目录这里的 --reference 选项会将一个对象的归属复制到另一个对象上，注意它不会复制权限只复制归属。要单独修改属组在组名前面添加点或冒号 chown .groupname filename要想同时修改属主和属组可以 chown username:groupname filename(使用.也可以)，点前面留空。单独修改属组chgrp groupname filename-R，递归更改文件属组(连同文件夹和内容一起更改)--reference，复制一个对象属组的属性到目标文件或目录修改文件或目录权限chmod [augo] [+-=] [rwx] fileNamea，(所有用户)、u(文件属主)、g(文件属组)、o(其他用户)+，(为用户添加权限)、-(为用户减少权限)、=(为用户赋予权限)-R，递归更改文件属主和属组(连同文件夹和内容一起更改)示例：chmod u=rwx,go= ./root/a.txt为当前属主添加 wrx 权限，g 是属组，o 是其他用户，留空等于没有权限，多个选项添加用逗号隔开(同时对两个文件或目录请用空格隔开)。知道了前面权限数字的转换现在就用起来，如果想把属主设置为 rwx 属组和其他用户没有权限我们可以用 chmod 700 a.txt，这样就当前属主就有了 rwx 权限，属组与其他用户没有权限读写执行(对于 root 用户普通权限限制对它无效)。一个个手动设置太麻烦，可以用 -R 批量对某个目录包括下面所有文件设置权限，这里 -R 把 test 目录包括下面的文件的权限全部变成可读写。默认权限图中目录默认权限是 755（具有执行权限比如用 cd 命令），文件默认权限是 644（没有执行权限），这个默认权限是由 umask(反掩码)来决定的，反掩码在 /etc/logoin.defs 文件中定义# The permission mask is initialized to this value. If not specified, # the permission mask will be initialized to 022. UMASK 077如果没有手工指定反掩码，权限掩码默认初始化为 022。我们在shell中输入 umask 就能查当前的反掩码啦。这里的 umask 后面跟上数值也可以更改 umask numeric 更改过后按照新的反掩码进行计算。直接来看个实例。新建文件它是这样计算的，默认权限掩码 666 减去默认反掩码 022 就是644(rw-r--r--)-rw-r--r--. 1 root root 0 3月 24 21:04 mask.txt [root@localhost ~]# umask 0022目录的默认权限掩码是 777，减过反掩码后是 755(rwxr-xr-x)。drwxr-xr-x. 2 root root 6 3月 24 21:05 mulu [root@localhost ~]# umask 0022关于默认权限还有个小问题需要注意，下面引用 csdn 一篇博文部分内容。这样做减法对文件来说稍有纰漏，如果在 umask 中有奇数的话，计算完成后在对应奇数位后面加1。假设umask值为：045（其他用户组位为奇数）666 ==>文件的起始权限值045 - ==> umask 的值621 ==>计算出来的权限，由于 umask 最后一位数字是 5，所以在其他用户组位再加 1。001 +622 ==>真实文件权限隐藏权限chattr 查看文件或目录的隐藏权限。Usage: chattr [+-=] [Asaci] filenameOptions:a，只能向文件中追加数据i，任何用户(包括root)不能删除文件、重命名、设定连接、写入数据、追加数据A，不同步访问时间+，添加相应权限-，删除相应权限=，设定相应权限(会清空以前写的权限，把新权限写入)修改文件隐藏权限，在 /、/dev、/tm、/var、/etc 不受保护如果设置了隐藏权限 root 也不能操作。权限中 s 和 t 作用SUID=Set UID，只能出现在二进制程序属主执行位，有权限执行此程序的用户，会在执行过程中临时获得当前程序属主权限。-rwsr-xr-x. 1 root root 27832 6月 10 2014 /bin/passwdSGID=Set GID，只能出现在目录/二进制程序属组执行位上。-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate在程序上，当此程序可执行时在执行过程中会临时获得该程序属组权限完成任务。在目录上，用户在此目录下新建文件/目录的属组将继承当前目录属组。在为设置权限时，不能直接 +s，最终添加的结果是 S，这种权限在运行时将不会使用 sgid 权限来运行：[root@iZ2ze3excf14rd7l4rsgn3Z ~]# ls -ld tmp drwxr--r-- 2 root root 4096 Dec 18 19:36 tmp [root@iZ2ze3excf14rd7l4rsgn3Z ~]# chmod g+s tmp [root@iZ2ze3excf14rd7l4rsgn3Z ~]# ls -ld tmp drwxr-Sr-- 2 root root 4096 Dec 18 19:36 tmp使用 +xs 才是 s：[root@iZ2ze3excf14rd7l4rsgn3Z ~]# chmod g+xs tmp [root@iZ2ze3excf14rd7l4rsgn3Z ~]# ls -ld tmp drwxr-sr-- 2 root root 4096 Dec 18 19:36 tmpSBIT=Sticky Bit，只能出现在目录 other 权限执行位上。当目录拥有 SBIT 权限时，任何普通用户在该目录下建立的文件，只有该用户自己和 root 可以删除。drwxrwxrwt. 8 root root 4096 5月 8 11:11 /tmp总结：出现在程序 owner 上称作 SUID，在程序/目录 group 上叫 SGID，如果在目录 other 上称作 SBIT。参考资料深入浅出linux系统umask值及其对应的文件权限讲解
进行交谈，随着双方话语停息慢慢安静下来，你一句我一句的客套，这让我有些不适应，可能太久不见有些陌生。
目录[TOC]用户介绍Linux 是多用户、多任务的系统，这就涉及到权限的问题了，像电影里的一些门禁系统只有一些大 boos 才能进入对吧，那此时大 boos 就具有操作这个门禁的权限了其他人则没有，那权限其实就是用户对相关应用的控制能力(权限隔离机制)。这么多用户 Linux 是如何区分的？在 Linux 中使用 UID(user id) 来标识。当有多个用户想对某个文件拥有 x 同权限，那么可以给它们分配到同一个组里(逻辑容器 组就是用来包含用户的)，组也同样有id标识叫GID(group id)。用户分类：UID=0，管理员用户UID=1000-65535，普通用户，在有些系统可以支持到四亿多个用户UID=1-999，程序/系统用户组分类：管理员组/普通组基本组：Linux 中新建用户时，没有指定隶属于的组，系统会为这个用户建立一个同名的组，作为该用户的基本组。附加组：方便给用户添加权限我们知道计算机处理数字的能力比处理字符串快，我们刚好刚好相反，那我们在登录系统时输入的用户名会被 Linux 解析成 UID，在系统有这一系列的数据库，像 /etc/passwd 中存放着用户基本信息、/etc/shadow 存放用户影子口令、/etc/group 存放组基本信息，下面来看看这些文件的作用。与用户相关的配置文件/etc/passwd第一列：是用户名第二列：账号的口令，x 代表占位符，实际上加密过了，口令保存在 /etc/shadow 文件中第三列：UID，用户 id 标识号第四列：GID，组标识号第五列：用户描述信息，注释说明。第六列：用户宿主目录或者叫家目录第七列：默认使用的 shell/etc/shadow第一列：是用户名第二列：加密后的密码，当设置为 !! 就暂时无法登陆系统。第三列：最后一次更改密码的时间。第四列：账户多少天内不可以更改密码，为 0 表示没有限制。第五列：表示密码到期，到达指定多少天后必须更改密码，留空表示没有限制，默认为 99999。第六列：假如设置成 5，那么密码到期前倒数 5 天会警告用户密码还剩 5 天即将过期，留空或 0 表示没有限制。第七列：密码到期过后再宽限多少天，留空表示没有限制，到宽限日期用户不允许登录。第八列：到期的时间，时间一到用户就不能够登录，留空将永远不过期。第九列：没有作用，保留以后使用。第二列是密码，格式是 $id$salt$encrypted，它由三部分组成用 $ 隔开，第一部分为加密算法由数字指明加密算法：1，标识为 MD5 加密，已经被破解不安全。2，Blowfish 加密。2a，Blowfish 加密。5，SHA-256 加密。6，SHA-512 加密。第二部分是随机序列号，第三部分是随机序列号和密码共同加密后的字符串，类似签名。加密算法分为对称加密和、对称加密和单向加密三种，对称加密也就是加密和解密都是使用同一把钥匙，非对称加密加密和解密使用不同的秘钥(公钥与私钥)，单向加密散列加密用于提取数据的特征码，常常用来校验数据完成性，它不可逆其次是定长输出(有规定长度)，比如有 md5 是 128 位定长输出（128 指的是 2 进制，通常用 16 进制来表示），sha 是由 160 位、224 位、256 位、384 位、512 位，加密后的数据只要改动就会引起结果（特征码）的巨大变化。/etc/default/useradd创建账户默认值的一些信息，后续可以修改。第一行：可以创建普通组第二行：普通用户宿主(家)目录，会在 home 下生成与用户同名的目录，作为用户宿主目录。第三行：是否开启用户过期停止使用权(过期的宽限期限)，-1 代表不启用，如果写了整数代表用户过期后还可使用 x 天。第四行：设定过期时间，格式：2018027第五行：设定用户的默认 shell第六行：新用户宿主目录模板目录第七行：是否为用户启用邮件通知功能/etc/skel用户宿主(家)目录模板目录，只对新建用户生效。在新建用户后会复制 /etc/skel 目录中的文件到新建用户的宿主目录中。.bash_logout #用户注销时执行的命令 .bash_profile #用户登录系统时执行的命令(用户变量) .bashrc #用户登录新shell时执行的命令/etc/login.defs关于密码的一些限制是在这个文件配置的MALL_DIR /var/spool/mail #用户系统邮件存放目录 PASS_MAX_DAYS 9999 #密码最长使用期限 PASS_MIN_DAYS 0 #最短使用期限(至少使用x天才可以更改密码),0代表不受限制 PASS_MIN_LEN 5 #密码最小长度 PASS-WARN_AGE 7 #密码过期前的警告时间(如果密码最长使用时间是30天,这个会在到期前7天发出警告) UID_MIN 1000 #最小UID UID_MAX 60000 #最大UID SYS_UID_MIN 201 #系统用户最小UID SYS_UID_MAX 999 #系统用户最大UID GID_MIN 1000 #普通组最小GID GID_MAX 60000 #普通组最大GID SYS_GID_MIN 201 #系统组最小GID SYS_GID_MAX 999 #系统组最大GID CREATE_HOME yes #是否创建宿主(home)目录 UMASK 077 #权限反掩码 USERGROUPS_ENAB yes #删除用户时是否删除组 ENCRYPT_METHOD SHA512 #用户密码加密方式用户相关操作添加删除用户语法：useradd [options] 用户名下面是它的选项：-c ，添加注释信息，内容用双引号包起来。-d ，手工指定宿主目录，默认在 /home。-e ，新建用户时，设置用户默认过期时间，格式：YYYY-MM-DD。-g ，指定用户基本组（不适用该选项，新建用户会自动创建同名组作为用户基本组）-G ，新建用户时指定用户的附加组，附加组可以有多个用逗号隔开。-m ，创建宿主目录时，和-k一起使用。-M ，创建用户时，不为用户创建宿主目录。-p ，创建用户时，为用户设置加密的密码(不推荐使用，history 可以查看历史命令）-r ，创建系统用户(不会建立宿主目录，UID和GID使用系统用户 ID，取值范围：1-999）-s ，指定默认 Shell（所指定的 Shell 需要系统支持，/etc/shells 存放着系统支持的 Shell）-u ，自定义 UID-D ，查看和改变默认的值（修改的 /etc/default/useradd 文件中的选项和值）-g，修改组-b，修改宿主目录-f，修改过期是否停用-e，修改过期时间-s，修改默认 shell添加一个用户 aaa 指定它 UID 是 0：useradd -o -u 0 aaa语法：userdel [options] user_name-r，删除用户时删除宿主目录设置密码用户建立过后是没有密码的，我们需要手动设置。语法：passwd [options] 用户名下面是一些选项，不加选项则设置修改当前登录用户的密码。普通用户则需要验证当前密码。-l，锁定用户，暂时会无法登陆系统，锁定会在密码开头加上!!-u，解锁用户-S，查看用户状态，显示 /etc/shadow 字段内容--stin，标准输入，经常在 shell 脚本编程中为用户自动设置密码-d，删除用户密码，删除后允许空密码登录(很危险)-e，设置密码过期，在下次用户登录时会提示密码过期并重新设置密码。-n，设置密码最少使用多少天才可更改密码，修改 /etc/shadow 第四列-x，设置密码最长使用期限，设置修改 /etc/shadow 第五列-w，设置密码到期前警告时间，修改 /etc/shadow 第六列-i，修改过期宽限天数，修改 /etc/shadow 第七列显示更改用户属性和信息语法：usermod [options] user_name命令每次修改的是 /etc/passwd。-c，更改用户的 comment(注释说明)-d，更改用户宿主目录-e，更改用户过期时间，格式：YYYY-MM-DD。-f，修改用户过期宽限天数-g，修改用户基本组-G，修改用户附加组-l，修改用户登录名，只改变 shadow 与 passwd 文件用户名-s，修改用户的 shell，需要系统已经安装的 shell-L，锁定用户-U，解锁用户用户更改用户的 shell语法：chsh [options] user_name-s，后面跟上 shell-l，显示当前系统支持的 shell，可以查看 /etc/shells 文件用户基本信息（finger 待补充）finger [options] user_name，显示用户基本信息，系统可能没安装需要 yum -y install fingerchfn [options] user_name，修改用户基本信息：-o，修改办公室-p，修改办公室phone-h，修改家庭电话号码-f，修改用户名id [options] user_name，显示用户和组的 id，不加选项则显示用户ID、所有组ID：-a，忽略其他系统版本区别-Z，显示安全上下文内容，涉及 selinux。-g，打印基本组 id-u，显示用户 id-G，显示所有组的 id-n，不显示组号，显示组名。与 -u 一起使用chage [options] user_name，修改用户密码的时间信息，最终会改动 /etc/shadow 文件：-l，显示用户详细密码参数-d，修改 /etc/shadow 第三列，格式：YYYY-MM-DD。-m，修改 /etc/shadow 第四列，跟天数-M，修改 /etc/shadow 第五列，跟天数-W，修改 /etc/shadow 第六列，跟天数-I，修改 /etc/shadow 第七列，跟天数-E，修改 /etc/shadow 第八列，格式：YYYY-MM-DD。w，查看哪些用户已登录系统，并且在做什么。临时使用其他用户身份执行命令和切换用户sudo [s|i] execute_command 是临时使用 root 权限来执行命令。当用户或组没有权限执行命令或查看文件时，用这个命令可以暂时提升到 root 权限，前提是在 /etc/sudoers 中有添加用户名或组名，并指定那些命令可以给用户使用。这种机制是白名单，只要在清单中用户能证明自己身份就让你用。用 visudo 编辑 /etc/sudoers 文件，而不是其他编辑器，原因是它会自己检测语法，给添加个 gbb 用户可以执行任何命令：这里的语法格式是：用户名 登录机器=可以使用的用户身份 可以执行的命令用户名是指哪个用户能够使用 sudo 命令，等号左边登录机器是限制能够从哪个 host 登录到当前机器（没错 sudo 还能登录机器去），等号右边是可以使用哪个用户身份执行命令，最后一个是能够执行什么命令。假如我添加：gbbtest ALL=(root, gbb) /bin/bash, ip这就是 gbbtest 可以使用 sudo 命令，运行从任何 host 登录当前系统，能够使用 root 和 gbb 身份执行 /bin/bash 和 /bin/ip 命令。这只是对用户做 sudo 设置，如果想对组做设置只需在前面加上百分号。%wheel ALL=(ALL) ALL这代表 whell 组内所有成员允许以任何用户身份执行任何命令。使用 sudo -l 就能够查看当前用户的 sudo 权限：[gbbtest@iZ2ze3excf14rd7l4rsgn3Z root]$ sudo -l [sudo] password for gbbtest: Matching Defaults entries for gbbtest on iZ2ze3excf14rd7l4rsgn3Z: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User gbbtest may run the following commands on iZ2ze3excf14rd7l4rsgn3Z: (root, gbb) /bin/bash, /sbin/ip用 sudo -l -l 查看更美观格式的输出，也能用 sudo -ll 简写：[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -ll [sudo] password for gbbtest: Matching Defaults entries for gbbtest on iZ2ze3excf14rd7l4rsgn3Z: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User gbbtest may run the following commands on iZ2ze3excf14rd7l4rsgn3Z: Sudoers entry: RunAsUsers: root, gbb Commands: /bin/bash /sbin/ip当一个用户不在 sudoers 里去使用 sudo 命令，会自动发一封 mail 告诉 root 说有人干坏事儿：[gbb@iZ2ze3excf14rd7l4rsgn3Z root]$ sudo -l We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for gbb: Sorry, user gbb may not run sudo on iZ2ze3excf14rd7l4rsgn3Z. [gbb@iZ2ze3excf14rd7l4rsgn3Z root]$ sudo ip -a [sudo] password for gbb: gbb is not in the sudoers file. This incident will be reported.可以看到在命令执行还需要对当前用户的密码做验证。如果不像这么麻烦 在执行命令冒号前加上 NOPASSWD，表明不需要密码即可执行命令。gbbtest ALL=(root, gbb) NOPASSWD:/bin/bash, ip如果想限制只能执行某些命令，可在命令开头加上感叹号就是禁止使用：gbbtest ALL=(gbb) /bin/find, !/bin/whoami此时只能运行 /bin/find 命令：[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -ll [sudo] password for gbbtest: Matching Defaults entries for gbbtest on iZ2ze3excf14rd7l4rsgn3Z: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User gbbtest may run the following commands on iZ2ze3excf14rd7l4rsgn3Z: Sudoers entry: RunAsUsers: gbb Commands: /bin/find !/bin/whoami [gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -u gbb find /etc -iname passwd -exec echo 12 > /tmp/tmptext \; find: ‘/etc/grub.d’: Permission denied find: Failed to change directory: Permission denied find: ‘/etc/sudoers.d’: Permission denied find: ‘/etc/dhcp’: Permission denied find: Failed to change directory: Permission denied find: ‘/etc/ntp/crypto’: Permission denied find: ‘/etc/pki/rsyslog’: Permission denied find: ‘/etc/pki/CA/private’: Permission denied find: ‘/etc/audit’: Permission denied find: ‘/etc/polkit-1/rules.d’: Permission denied find: ‘/etc/polkit-1/localauthority’: Permission denied find: ‘/etc/selinux/final’: Permission denied find: ‘/etc/selinux/targeted/active’: Permission denied find: ‘/etc/audisp’: Permission denied find: ‘/etc/firewalld’: Permission denied find: failed to restore initial working directory: Permission denied [gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ ll /tmp/tmptext -rw-rw-r-- 1 gbbtest gbbtest 0 Dec 7 22:43 /tmp/tmptext执行 whoami 和 ls 则提示不允许执行。[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -u gbb whoami Sorry, user gbbtest is not allowed to execute '/bin/whoami' as gbb on iZ2ze3excf14rd7l4rsgn3Z. [gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -u gbb ls -l /tmp/tmptext Sorry, user gbbtest is not allowed to execute '/bin/ls -l /tmp/tmptext' as gbb on iZ2ze3excf14rd7l4rsgn3Z.sudo -s 直接切换到 root 来使用，但是只能是白名单中指定用户才能，它和 sudo -i 作用一致，直接用 sudo 会有 5 分钟缓存时间，时间一过必须重新使用 sudo 再次执行命令，这样就比较麻烦，不如切到 root。su 后面不跟任何选项参数直接是切换到 root，su username 是直接切换到对应用户但是当前目录不改变，su - username 是直接切换到此用户家目录。su 和 sudo 区别在于 su 只要你能证明口令就行（只看口令不看人），哨兵正站岗抖着腿，看到有人要过哨，哨兵即刻说：天王盖地虎；他说：宝塔正河妖，哟自己人您请。sudo 是设置一个白名单，在这个名单中的用户只要证明你是本人（看了口令又看人）就能使用，上回仅仅核实口令，这回哨兵不仅对过口号还拿着肖像（sudoers）核对了这人模样。组管理在前面有介绍组的分类在这里再细分一下组分类：管理员组/普通用户组/系统用户组基本组：Linux 中新建用户时，没有指定隶属于的组，系统会为这个用户建立一个同名的组，作为该用户的基本组(初始化的组)。附加组：方便给用户添加权限，除了初始化的组在后面添加的都是附加组(也称附属组)。举个例子~你在一家公司运维部了入职，组长需要给你申请一个系统管理账号，敲得飞快说着：新建了账号不具备使用系统的权限，所以得把你的账号添加到运维部管理组内，这样就能够正常工作了。刚上任同事就调到了开发组借用几天，组长说：你去把他账户从运维组移出(这样这位同事的账号就不具有使用运维组机器的权限了)，添加到开发组。与组相关的配置文件/etc/group第一列：组名第二列：组密码占位符(在 /etc/ghadow 中保存组的密码)第三列：组ID号(GID)第四列：组成员，不会显示初始化成员(跟组同名的成员)/etc/gshadow第一列：组名第二列：组密码(!表示密码被锁定)第三列：组管理员(为空表示组内成员都可管理此组)第四列：组成员列表组操作添加/删除/修改组添加组groupadd-g，创建组指定组ID-r，添加系统组删除组groupdel user_name组必须为空才能删除，其次删除用户时系统会删除同名基本组修改组的属性groupmod [options] group_name-g，修改组ID(GID)-n，修改组名为组设置密码，设置组的管理员，添加组成员gpasswd [options] group_name不添加选项，为组添加密码-A，为组设置管理员(为空表示组内成员都可管理此组)-a，为组添加成员(组管理员可以操作的命令)-M，批量添加用户，用逗号隔开-d，删除组成员(组管理员可以操作的命令)-r，删除组密码-R，限制成员访问组(把组内成员权限冻结？)，会组密码设置为!，我好像没有找到恢复选项，那是不是要重新设定密码？，删除密码会把!删除掉为用户修改附加组用户切换到其他组以其他组身份工作，那你创建文件或目录属组就成了你修改的附加组，切换时会提示你输入组密码，只在当前 shell 生效newgrp group_nameexit退出当前shell 为组添加成员显示组成员列表groupmems(有空再补充)
目录[TOC]目录与文件管理mkdirmkdir，make directory(创建空目录)-m，创建目录同时设置权限-p，递归创建新目录-v，显示创建目录的过程-p 示例# 父目录不存在也会被创建 mkdir -p /test/dir1 # 同时创建两个目录 mkdir -p /test/{dir1,dir2}rmdirrmdir xxx，删除xxx目录，不过只能删空的目录，无法删除嵌套目录，换句话说就是目录里不能有任何文件和其他目录ls，list的简写用于列出目录：-l(--long)，以长格式显示属性-h，为文件大小添加单位(显示文件大小带上大小单位)-a，显示目录下所有文件(包含. .. 以.开始的隐藏文件)-A，与-a相同，但是不显示.与..-R，递归显示目录中的内容(会显示子目录中的内容)-r，逆序显示目录内容(默认用ls查看会以26个字母的顺序进行排列，用-r刚好相反)-i，打印这个file的index node值-d，只列出目录lsls -l 文件属性详解-rw-r--r--. 1 root root 1648 oct 14 14:16 initial-setup-ks.cfg 第一位：-，代表普通文件(file)d，代表目录(directory)b，块设备(block)比如硬盘、u盘等c，字符设备(char)键盘鼠标打印机等s，套接字文件(socket)用于进程之间的通信p，命名管道(pipe)l，符号链接文件(symolic link file)第二到十位：权限位(rwx：读写执行)234位，文件属主权限(owner 所有者)567位，文件属组权限(group 所属组)8 9 10位，其他用户权限(other 其他非本群组用户).：文件或目录中使用了SELinux content属性是一个点，如果用了ACL(访问控制列表)是+1：代表文件硬链接的次数第一个root：代表文件属主(owner)第二个root：代表文件属组(group)1648：文件的 byte 大小oct 14 14:16，文件最后被访问的时间戳（stat 命令查看文件时间戳），文件的时间戳：Access，访问的时间戳Modify，文件被修改时间戳(修改文件数据：添加删除数据等)Change，文件被更改时间戳(更改文件属性)initial-setup-ks.cfg：文件名在shell里输入外部命令他们是如何查找到的？环境变量：内存中的命名空间PATH变量：存放系统命令路径，以冒号隔开。查看PATH变量：如果在以上路径中没有找到相关命令(该命令是外部命令)，提示用户command not found，一个命令在以上多个路径中存在，系统会按照从前往后的顺序查找，找到即停止向后查找。hash 查看命令缓存及命中率(一个命令如果执行成功就记录下执行成功的次数与路径，下次查找就优先查找，查找缓存的速度比重新搜索的速度快)treetree，以树状格式列出目录的内容。(tree = ls -R 显示样式不同)cdcd，切换目录(change directory)，cd 不加选项，切换当前用户的宿主目录：-，返回到上一次的工作路径~username，切换到username用户的宿主目录，不指定用户名就是当前用户pwdpwd，打印当前所在的工作目录(print working directory)filefile，查看文件类型，在 Windows 是用拓展名识别文件类型，Linux 就要靠 file 命令，任何文件都可以用 file 查看。语法：file [options] [args]常用选项：-b，显示结果时，不显示文件名-c，显示执行file命令的执行过程(file是如何去判断文件类型)，便于排错或分析file命令执行过程-i，输出MIME类型的字符串-z，显示压缩文件的内容-L，查看软连接对应文件的类型-f，查看文件中文件名的类型dudu -h，查看文件大小cat查看文本文件内容cat，一次查看文件所有内容(跳到文件结尾)语法：cat [options] [args]常用选项：-n，显示文件内容同时显示行号，包括空行-b，和-n功能相同，但不包括空行-S，当文件中有多个空行时，合并为一个空行-E，在显示内容时，结尾添加$符号新建新文件：cat > new_file_name << EOF //EOf:end of file > 内容1 > 内容2 > 内容3 > EOF #结束书写向现有文件中追加数据：cat >> file_name << EOF >内容1 >内容2 >内容3 >EOF把多个文件的内容合并到一个文件：cat file1 file2 > new_file_nametac，与 cat 显示相反，第一行在下面最后一行在上面moremore，可以翻页查看文本文件内容，more +num file_name 可以从 num 行开始查看内容。在使用时一些快捷操作方便查找内容：enter键，向下翻一行space键，向下翻一屏Ctrl+B，向上翻一屏Ctrl+F，向下翻一屏=，显示当前行号vi，调用编辑器!command，调用shell执行命令q，退出more命令lessless，可以翻页查看文本文件内容：-N，显示行号阅读文件时有些操作可以方便找寻数据：enter 键，向下翻一行space 键，向下翻一屏PageDown 键，向下翻一屏PageUp 键，向上翻一屏↑ ↓ 键，向上/向下翻一行/word：在该文件中向下查找 word 关键字n 键，查找下一个N 键，查找上一个?word，在该文件中向上查找 word 关键字:e FilePath，查看下一个文件:p，返回上一个文件:n，返回下一个文件!command，在阅读模式中可以直接执行命令，把对应 command 替换成实际命令即可。headhead 默认查看文本文件的前10行-n，查看文件前n行tailtail 默认查看文本文件的后10行-n，查看文本文件的后n行-f，动态查看文本文件内容，如动态查看日志： tail -f /var/log/messages，也就是说日志内容改变会在你使用命令的的窗口实时显示结合 head 和 tail 可以查看指定行数内容，比如 100 行内容我想查看第 20 行到 40 行的内容怎么办？思路是先用 head -n 40 显示前 40 行，再用 tail -n 20 查看最后 20 行这样就能达到目的。head -n 40 1.txt | tail -n 20文件传输rz 上传文件到服务器sz 下载文件到本机wget 下载文件scp 可以上传和下载。# 将本机 file 用 userName 用户登录到 host 主机，将文件传输到 Absolute Path 中。 scp file userName@host:[Absolute Path] # 使用 userName 用户登录到 host 主机，将 Absolute Path 文件下载到当前用户家目录 scp userName@host:[Absolute Path] ~/使用 scpscp [-P Port] <FilePath> <UserName>@<Host>:<要上传的目标目录>这里给出示例。ubuntu@ip-172-26-7-83:~$ scp -P 22 ./smb.conf root@81.70.14.219:/1.conf The authenticity of host '81.71.13.219 (81.71.13.219)' can't be established. ECDSA key fingerprint is SHA256:HJzqBD2kx6c9w6wkJ2Gb1g0wjfRJ/Rtz0O7Maadd2yU. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '81.71.13.219' (ECDSA) to the list of known hosts. root@81.71.13.219's password: smb.conf 100% 1733 18.9KB/s 00:00使用 scp 将本机当前目录 smb.conf 配置文件，传输到目标 81.71,13.219 主机根目录下，并重新命名为 1.conf（不指定名称，就会以源文件名命名）。如果目标主机默认 SSH 端口不是 22 可以用 -P 选项指定。登录目标机器，查看根目录文件存在。Connecting to 81.71.13.219:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. WARNING! The remote SSH server rejected X11 forwarding request. Activate the web console with: systemctl enable --now cockpit.socket Last login: Tue Feb 14 15:49:29 2023 from 223.104.40.108 [root@VM-24-2-centos ~]# ls / 1.conf bin boot data dev etc home lib lib64 log lost+found media mnt opt proc root run sbin srv sys tmp usr var复制与移动cp，复制文件或目录（copy）语法：cp [options] [src_file] [des_file]-f，强制(forece)复制文件或目录不进行提示-r，递归复制目录-s，为某个文件创建符号链接(软连接)，而不是复制文件-b，覆盖已有的文件前，对目标文件进行备份，在原有文件后面加上~-l，为文件创建硬链接，而不是复制文件-p，复制文件时保留文件的原有属性-d，当复制软连接文件时，把目标文件或目录也会创建为软连接，并指向最原始的文件-i，覆盖目标文件前询问，这是默认操作，相当于 cp = cp -imv 用于移动（move）或重命名文件和目录，当原位置和目标位置是同一目录时是重命名，当原位置和目标位置不是同一目录时是移动：-b，移动前先对源文件进行备份-f，强制覆盖-i，覆盖目标文件前询问-t，将多个文件移动同一个目录，目标目录在前面，后面跟文件。mv -t [directory] file1 file2 ...创建与删除文件rm，删除（remove）文件或目录，与上面 rmdir 的区别是，这个可以删除嵌套目录，来多少删多少：-d，删除单一的空目录(与rmdir功能相同)-f，强制删除-i，删除前进行询问-r，递归删除整个目录，可以删除非空的目录-v，显示命令执行过程touch，创建新文件或修改文件时间戳-a，只改变访问时间(access)，touch -a file_name 会将现在的系统时间写入-d，使用指定时间戳创建新文件，而不是使用系统时间 touch -d "03:00 am" file_name 只能更改过去的时间，改变的是 access 与 change 时间戳-c，不创建文件-t，使用指定格式时间戳创建新文件，而不是使用系统时间-f，解决与 BSD 系列 Unix 系统兼容性-m，只更改变动（modify）时间 touch -m file_name查找which，查看命令所在的绝对路径type -a，完全可以替代 whichwhereis 查看命令所在的路径，源代码，帮助信息文件所在目录-b，只查看文件所在的位置，等同于 which-m，只查看 man 目录下的帮助文件-s，支持看源代码所在的位置locate file_name，查找文件命令。非实时性（模糊匹配），根据自己的数据库查找文件，CentOS 每天更新一次数据库或者 updatedb 手动更新，locate 命令默认是不安装的需要通过 yum -y install mlocate 安装完 locate 后生成 /var/lib/mlocate 目录来存放数据库 /var/lib/mlocate/mlocate.db根文件系统Linux文件类型普通文件纯文本文件(ASCII)，配置文件二进制文件(binary file)，命令数据格式文件(data)，/var/log/wpmpd，目录文件l，链接文件(软链接文件，类似于 Windows 快捷方式)设备文件（存放在 /dev 中）b，block块设备c，character字符集设备，一次性读取，按顺序读取s，socket 套接字文件，通常用在网络上数据连接： IP：PROTp，管道，特殊的文件类型，解决多个程序同时访问一个文件所造成的错误问题file 查看Linux中文件类型语法：file [options] file_nameLinux文件名限制：单个文件或目录名称不能超过255个字符文件名中不能包含特殊字符(/ . - +等)FHS 标准（filesystem hierarchy standard）Linux 中每个目录都有用意，其实是约定每个目录的作用，避免更换使用其他 Liunx 发行版本时增加学习时间成本，也是为了更好的协同开发。/ #根文件文件系统（rootfs：root file system ）。 /bin #二进制，存放一些命令 /boot #存放启动和内核相关文件 /dev #存放设备(硬件)文件 /etc #存放应用程序配置文件 /home #普通用户的家(宿主)目录，默认为/home/USERNAME /lib和/lib64 #存放系统开机时需要用到的函数库及/bin和/sbin命令调用的函数库 /lib/modules #存放内核相关的模块(驱动程序等) /media和/mnt #挂载点，/media挂载移动设备 /mnt挂载临时设备 /opt #第三方软件存放目录(用户自行安装的软件存放处)，现在一般安装到/usr/local下 /proc #为文件系统，数据存放在内存中，存放关于进程的相关信息 /root #管理员的家(宿主)目录 /sbin #存放管理员使用的命令 /srv #service缩写，存放服务数据目录，如可以把www服务的网页放到该目录 /tmp #存放临时文件，所有用户都可以访问创建文件，但是每个用户只能删除自己的文件，大约每个月自动清空一次，或者是重启时清空。 /sys #为文件系统，存放在内存中，记录内核相关的信息，包括目前加载内核模块和内核检测到的硬件设备等 /usr #UNIX SOFTWARTE RESOURCE：存放安装的应用程序 /usr/bin #普通用户使用的命令(和/bin区别为是否与开机有关) /usr/sbin #网络服务器命令，secret binary 的缩写。 /usr/share #存放共享文件目录(在线帮助文件，杂项，时区文件等) /usr/include #存放头文件 /usr/src #释放源代码目录 /var #vary的缩写，存放经常变动的文件，如日志、mail等。 /var/cache #存放应用程序运行时产生的缓存文件 /var/lib #程序运行时，不要使用的数据文件的存放目录 /var/lock #设备或资源一次只能被一个应用程序使用，如果多应用程序使用会产生错误，因为要为设备或资源上锁(存放锁文件) /var/log #存放日志目录(系统，用户登录，服务等) /var/mail #存放个人电子邮件(系统报警产生邮件信息等) /var/run #存放应用程序运行时PID文件(进程号.pid结尾) /var/spool #存放队列数据，排队等待其他用户程序使用的数据，数据通常使用完成后会被删除FHS规定 /etc、/bin、/dev、/lib、/sbin 这五个目录必须要和根目录位于同一文件系统（不可以为这些目录建立独立分区）。df，显示文件系统信息-T，显示文件系统类型，-h=--human-readable，会加上 size 单位-l，是local本地磁盘，不会显示远程磁盘查看日期date 查看操作系统时间-u，显示 UTC 时间-s，设置时间，例如 -s "20:20:20"+%Y-%m-%d，格式化时间cal，查看日历uptime，查看系统运行的总时间参考资料FHS标准文档The Linux Command Handbook
目录[TOC]shell 特性命令历史Linux 会自动记录系统过去执行的命令，并保存在内存的缓冲区中（内存数据在重启后会消失）。在每个用户的 home 目录下，有个隐藏文件 .bash_history 保存当前 Shell 执行的命令历史，当用户正常退出当前 Shell 时，当前 shell 中运行的命令才会保存到此文件中。这个文件你可以直接读取，也可使用 history 查看执行过后的 Linux 命令历史。[root@VM-24-2-centos ~]# history | tail -n 30 1 2022-04-13 13:31:08 ls 2 2022-04-13 13:36:02 cd ..ls 3 2022-04-13 13:31:04 tmux a 4 2022-04-13 13:36:06 ls 5 2022-04-13 21:50:44 mysql -u root -p 6 2022-04-13 21:53:45 mysql -u root -p 7 2022-04-13 21:54:24 mysql -u root -p 8 2022-04-13 21:54:28 mysql -u root -p 9 2022-04-13 21:56:09 mysql -u root -p 10 2022-04-25 18:06:12 vim 1.php 11 2022-04-25 18:07:50 php 1.php history -w 可以将命令历史保存在某个文件中，方便后续查看。[root@VM-24-2-centos test]# history -w history_commend.txt [root@VM-24-2-centos test]# ll -h total 52K -rw------- 1 root root 49K May 19 22:44 history_commend.txt要是想清空历史命令你可以直接删文件，也能用 history -c 清空。[root@VM-24-2-centos test]# history 1 history 2 tests 3 test 4 history [root@VM-24-2-centos test]# history -c [root@VM-24-2-centos test]# history 1 historyhistory -d 选项可以删除某一条命令历史，-d 参数是从删除第几条。[root@VM-24-2-centos test]# test [root@VM-24-2-centos test]# test 1 [root@VM-24-2-centos test]# history 1 test 2 test 1 3 history [root@VM-24-2-centos test]# history -d 2 [root@VM-24-2-centos test]# history 1 test 2 history 3 history -d 2 4 history 到底能够存多少命令？这取决于 HISTSIZE 命令历史大小变量的数值，默认值是 1000 条。[root@VM-24-2-centos test]# echo $HISTSIZE 1000重定向冯诺依曼体系结构：运算器（是 CPU 的功能用于读取系统指令）运算器（CPU 进行）存储器（RAM 内部存储器，易失性存储器）输入设备（Input，用于输入数据比如：键盘、硬盘等）输出设备（Output，用于输出指令执行结果比如：显示器、音箱和硬盘等）计算机总线：地址总线（负责内存寻址）数据总线（负责传输数据）控制总线（负责控制指令）寄存器（CPU 中内部临时存储空间）I/O 设备（负责计算机内部存储和外部存储设备进行交互的设备）程序：指令+数据；那指令是什么？指令是由程序提供，用来加工数据。数据来自可以来自变量、文件、输入设备等。要是没有指定数据来源时会指定到标准输入/输出设备。标准输入（stdin）设备有：键盘，文件描述符为 0，标准输出（stdout）设备有：显示器，文件描述符为 1，标准错误输出（stderr）设备：显示器，文件描述符为 2。三种数据流：标准输入数据流、标准输出数据、流标准错误输出数据流。当在 Linux 中打开一个文件时，内核会反复调用一些输入或出设备，对于文件标识就很重要了，用文件描述符来标识文件，文件加载完成用数字表示（fd：file descriptor文件描述符）。IO 重定向：是当用户没有为指令指定数据来源时，系统要有一个默认来源，有可能是输入或输出设备。重定向是把默认的输入或输出的数据来源，重新定向到其他的文件或设备。输出重定向：>，覆盖输出重定向，也等同于 1>。>>，追加输出重定向。2>，错误覆盖输出重定向。2>>，错误追加输出重定向。&>，混合覆盖输出重定向，即正确、错误都混在一起输出。&>>，混合追加输出重定向。输入重定向：<，输入重定向，等同于 0<。重定向补充标准输出和标准错误输出默认都输出到屏幕。先将标准输出到 file 文件最后再把错误输出到标准输出，这里的标准输出就是前面 file 文件。[test@centos7 ~]$ find /home -iname .bashrc > file 2>&1 #将标准错误输出重定向到标准输出这里的变换等同于上一条。[test@centos7 ~]$ find /home -iname .bashrc > file 1>&2 #将标准输出重定向到错误- 符号意义用于当做 stdout 或 stdin。下面命令 tar -cvf - 减号的位置是当做标准输出，结果会输出到屏幕上 ./saa是输入。[root@centos7 home]# tar cvf - ./saa ./saa ./saa0000644000000000000000000000371013452642177010414 0ustar rootrootabrt adjtime管道管道是用 | 连接多条命令，把前一条命令的输出结果作为后一条命令的输入条件。ls 显示 / 目录下的所有文件与文件夹，并把它传给 tr 转换成大写字母。ls / | tr [a-z] [A-Z]这条命令会把显示 / 目录下的文件与文件夹，并用管道把它传给 tee 命令（tee 它与输出重定向相似，会把文件输出到屏幕上并写入到文件中）进行使用，tee 将 ls 穿过来的内容进行屏幕显示并写入到 show.out 文件。ls / | tee show.out命令别名命令别名就是把一个一个取个外号，以后调用这个外号等同于调用原有命令。注意，执行 alias 命令时，COMMAND最好用 '' 引号引起来，只执行 alias 命令，会列出系统中所有的命令别名。alias COMM_ALIAS=COMMAND取消命令别名。unalias COMM_ALIAS #命令行编辑学会一些快捷键会提高在命令行中的效率，别指望一次性全部记住，当你想到要用的时候回来看看，照着敲，次数多了自然就记住了。这张图忘了从那个 blog 下的，如有侵权请留言，我尽快处理。Ctrl + _，撤销刚刚输入的内容。Ctrl + p，返回上一个执行过的命令。对应键盘 ↑。Ctrl + n，返回一下个命令。对应键盘 ↓。Ctrl + a，从光标位置快速跳到行首。Ctrl + e，从光标位置快速跳到行尾。Alt + f，从光标处往后跳一个单词Alt + b，从光标处往前跳一个单词Ctrl + f，从光标处往后跳一个字符Ctrl + b，从光标处往前跳一个字符Ctrl + u，删除光标前所有字符。Ctrl + k，删除光标后所有字符。Ctrl + h，删除光标前一个字符。Ctrl + d，1.删除光标后一个字符。2.在终端没有字符的情况下退出当前终端（exit 也可以）。Ctrl + w，删除光标前的单词。Alt + d，删除光标后的单词。Ctrl + l，命令全部占满屏幕看的不舒服,清屏（等同于 clear 命令）。Ctrl + i，用来补全和敲两个 tab 作用一致。Ctrl + j，用来执行命令和敲 enter 一致。Ctrl + y，粘贴剪切板内容。Ctrl + c，终止当前命令。Ctrl + z，暂停当前进程，可以用fg恢复进程。Ctrl + Shift + C，复制。Ctrl + Shift + V，粘贴。Ctrl + r，根据你输入的关键词搜索历史命令，搜索不满意可以再次输入关键词继续使用 Ctrl + r 来搜索。不过不能上下翻页这一点算是遗憾。Ctrl + g / Ctrl + c，退出搜索Shift + PageUp / Shift + PageDown，可以在 Shell 中翻页查看已经执行过的命令（在图形化 Shell 窗口可以代替鼠标滑轮呀，纯 CLI Shell 你可没法用鼠标 hhh）!!，执行上一条历史命令。!n，执行命令历史第 n 条命令（n 是命令历史编号）。!-n，执行命令历史中的倒数第 n 条命令（n 是命令历史编号）!word，执行命令历史中最近一次以 word 开头的命令（word 必须能够唯一的标识用户想执行的命令）!?word，之星命令历史中包含 word 的命令。!$，行上一条执行过的命令的参数，最好使用 Alt + .、Esc + . 显示把参数调出来，看清楚再执行。命令行展开命令补齐原理是在 PATH 变量搜索命令并补齐，这需要 PATH 变量必须正常，输入要补齐的字符数一定能够唯一标识这条命令；tab 键补齐。echo $PATH //查看PATH变量的值按 tab 键两次，列出以某个字符开始所有的命令。命令行补齐功能不能补齐选项。路径和文件补齐：在系统路径中查找。命令行通配（Wildcard）*，匹配任意长度的任意字符。?，匹配任意单个字符。[]，匹配指定范围内的任意单个字符。[a-z]、[A-Z]、[0-9]、[a-zA-Z]、[a-zA-Z0-9]，匹配会包含开始字母与结束字母。[^]，匹配指定范围外的任意单个字符。[^a-z]、[^A-Z]，与上面相反，不匹配中括号内的字符。[:space:]，表示空格，在使用时要加上 []，列如 [[:space:]]。[:punct:]，表示所有标点符号。[:lower:]，表示所有小写字母。[:upper:]，表示所有大写字母。[:alpha:]，表示所有字母，包括大小写。[:digit:]，表示所有数字。[:alnum:]，表示所有数字和大小写字母。man 文档的使用获取 Linux 命令的帮助信息最常用的是下面两种方式。内部命令使用 help [command]，外部命令使用 [command] --help，另一个是用 man，前者是简要信息，后者更为详细。man 所有手册存放在 /usr/share/doc 目录。进到内页后的一些操作：↑、↓ 或 Enter 键进行翻行。Enter、Pagedown，向下/上翻页。Pageup，向下翻页。/word，从上往下查找关键字，找到关键字后可以用 n 再次向下查找，N 反之。?word，从下往上查找关键字。q，退出当前帮助信息。既然是手册，当然会有不同的篇章，下面是介绍。1 Executable programs or shell commands ：可执行程序或 shell 命令，普通用户命令 (/bin /usr/bin /usr/local/bin)：binary 二进制 2 System calls (functions provided by the kernel) ：系统调用库。 3 Library calls (functions within program libraries) ：程序库调用。 4 Special files (usually found in /dev) ：设备或特殊文件(硬件设备 放在 /dev)。 5 File formats and conventions eg /etc/passwd 查看配置文件格式 6 Games ：游戏。不知道为什么还存在这种东西。 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)： 杂项 8 System administration commands (usually only for root) ：系统管理员命令(/sbin /usr/sbin /usr/local/sbin)。 9 Kernel routines [Non standard] 以上 section 标题眼熟就好，在实际使用过程中是 man sectionNumber command 这样来找到对应内容，当然也不是每个 section number 都记得很清楚，可以使用 man -a command 来找到所有篇章内容，这样就方便不少。man 内容相关标题说明：NAME #命令名称及简要用法 SYNOPSIS #语法格式，可能包括一些选项的使用 DESCRIPTION #命令和命令选项的详细说明 Exit status #退出状态码 AUTHOR #作者信息 REPORTING BUGS(BUG) #发现bug时如何反馈信息 COPYRIGHT #该命令的版权信息 SEE ALSO #另外参照的帮助信息 OPTIONS #说明该命令每一个选项的详细用法 EXAMPLES #命令使用实例一般看 man 手册都是查命令的详细使用方法，下面是 SYNOPSIS 相关说明：<>，必须使用的选项或参数，不可省略。[]，可以省略的选项或参数。...，可以使用多个选项或参数。|，或，表示在多个[选项1|选项2|选项3]中必须选择一个。{}，表示分组，或是一个范围，这个范围内必须选择一个。info 在线（不是联网）查看帮助，注重命令历史，版权信息等。whatis 查看命令所在的帮助信息目录，该命令在系统启动大约 70m 后会生成 whatis 数据库，如果时间太短，该命令不会执行，我们可以使用 makewhatis 初始化该命令——7.0 中使用 mandb 来更新数据库，6.0 版本使用 makewhatis 更新数据库。不再推荐使用 man为什么？当你熟悉一些命令后，其实就只想知道某个命令的快速用法，但 man 手册中过于冗长，找起来很不方便。tldr 就解决了这个问题，来看看怎么用。安装。官方提供的方式很多，可以查看 How do I use it? 小节根据自己平台已有的工具安装。由于 Linux 自带了 Python 下面示例就用 pip 做安装演示。[root@blog ~]# python3 -m php3 install tldr /usr/bin/python3: No module named php3 [root@blog ~]# python3 -m php install tldr /usr/bin/python3: No module named php [root@blog ~]# php3 install tldr -bash: php3: command not found [root@blog ~]# python3 -m pip install tldr Looking in indexes: http://mirrors.tencentyun.com/pypi/simple Collecting tldr Downloading http://mirrors.tencentyun.com/pypi/packages/bb/bb/16befc247389b3b134c58511de2370784a9fced7873177d468325a4fe877/tldr-3.2.0-py3-none-any.whl (11 kB) Requirement already satisfied: termcolor in /usr/local/lib/python3.6/site-packages (from tldr) (1.1.0) Requirement already satisfied: colorama in ./.local/lib/python3.6/site-packages (from tldr) (0.4.5) Collecting shtab>=1.3.10 Downloading http://mirrors.tencentyun.com/pypi/packages/87/e5/dd5e65376658c1e5462cad6eb3ef317b568cae07f6e1e06a1bf27f38145b/shtab-1.5.7-py2.py3-none-any.whl (13 kB) Installing collected packages: shtab, tldr Successfully installed shtab-1.5.7 tldr-3.2.0 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv查询某个命令用法。这里都是显示英文，其实也可以设置终端，但是比较鸡肋，建议看英文就好，短句不会太难。[root@blog ~]# tldr ls ls List directory contents. More information: https://www.gnu.org/software/coreutils/ls. - List files one per line: ls -1 - List all files, including hidden files: ls -a - List all files, with trailing `/` added to directory names: ls -F - Long format list (permissions, ownership, size, and modification date) of all files: ls -la - Long format list with size displayed using human-readable units (KiB, MiB, GiB): ls -lh - Long format list sorted by size (descending) recursively: ls -lSR - Long format list of all files, sorted by modification date (oldest first): ls -ltr - Only list directories: ls -d */工具提供了指定语言的参数，执行，网络超时，可能是需要梯子才行。[root@blog ~]# tldr --language zh Traceback (most recent call last): File "/usr/local/bin/tldr", line 8, in <module> sys.exit(cli()) File "/usr/local/lib/python3.6/site-packages/tldr.py", line 576, in cli main() File "/usr/local/lib/python3.6/site-packages/tldr.py", line 560, in main options.language File "/usr/local/lib/python3.6/site-packages/tldr.py", line 264, in get_page return get_page_for_platform(command, platform, remote, language) File "/usr/local/lib/python3.6/site-packages/tldr.py", line 164, in get_page_for_platform context=URLOPEN_CONTEXT File "/usr/lib64/python3.6/urllib/request.py", line 223, in urlopen return opener.open(url, data, timeout) File "/usr/lib64/python3.6/urllib/request.py", line 526, in open response = self._open(req, data) File "/usr/lib64/python3.6/urllib/request.py", line 544, in _open '_open', req) File "/usr/lib64/python3.6/urllib/request.py", line 504, in _call_chain result = func(*args) File "/usr/lib64/python3.6/urllib/request.py", line 1392, in https_open context=self._context, check_hostname=self._check_hostname) File "/usr/lib64/python3.6/urllib/request.py", line 1352, in do_open r = h.getresponse() File "/usr/lib64/python3.6/http/client.py", line 1361, in getresponse response.begin() File "/usr/lib64/python3.6/http/client.py", line 311, in begin version, status, reason = self._read_status() File "/usr/lib64/python3.6/http/client.py", line 272, in _read_status line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") File "/usr/lib64/python3.6/socket.py", line 586, in readinto return self._sock.recv_into(b) File "/usr/lib64/python3.6/ssl.py", line 971, in recv_into return self.read(nbytes, buffer) File "/usr/lib64/python3.6/ssl.py", line 833, in read return self._sslobj.read(len, buffer) File "/usr/lib64/python3.6/ssl.py", line 590, in read v = self._sslobj.read(len, buffer) socket.timeout: The read operation timed out最后用 Tianyu Li 的博客中分享的解决方法搞定了。使用 pip3 安装客户端，因为 node 的不支持语言命令行。用 --language 命令设置也没找到正确的参数（垃圾文档），只能用环境变量。设置环境变量 TLDR_LANGUAGE 和 TLDR_CACHE_ENABLED#linux export TLDR_LANGUAGE="zh" export TLDR_CACHE_ENABLED=1 #windows $env:TLDR_LANGUAGE="zh" $env:TLDR_CACHE_ENABLED=1tlrd 使用中文 | X-Ray这里仅仅演示下结果，想自动加载环境变量可以写到 $HOME 下用户的配置文件。[root@blog ~]# export TLDR_LANGUAGE="zh" [root@blog ~]# export TLDR_CACHE_ENABLED=1 [root@blog ~]# tldr ls ls 列出目录中的内容。 更多信息：https://www.gnu.org/software/coreutils/ls. - 列出目录中的文件，每个文件占一行： ls -1 - 列出包含隐藏文件的所有文件： ls -a - 列出所有文件，如果是目录，则在目录名后面加上「/」： ls -F - 列出包含隐藏文件的所有文件信息，包括权限，所有者，大小和修改日期： ls -la - 列出所有文件信息，大小用人类可读的单位表示（KiB, MiB, GiB）： ls -lh - 列出所有文件信息，按大小降序排序： ls -lS - 列出所有文件信息，按修改日期从旧到新排序： ls -ltr - 只列出目录： ls -d */其实大家也要注意，对于还没翻译的命令依旧会显示出原文，具体翻译进度从 https://lukwebsforge.github.io/tldri18n 可以勾选 zh 与 en 进行比对。[root@blog ~]# tldr bully bully Brute-force the WPS pin of a wireless access point. Necessary information must be gathered with `airmon-ng` and `airodump-ng` before using `bully`. More information: https://salsa.debian.org/pkg-security-team/bully. - Crack the password: bully --bssid "mac" --channel "channel" --bruteforce "interface" - Display help: bully --help更新。如果有些命令查不到很可能是人家刚更新，但你安装完工具数据没同步到本地，我们用 -u 选项进行更新。要还是找不到说明人家这个例子还没写。我们能做的是尝试更新，找不到再去其他站点搜搜用法。[root@blog ~]# tldr -u Updated cache for 4883 entries参考资料The Best Keyboard Shortcuts for Bash (aka the Linux and macOS Terminal)20 Linux Command Tips and Tricks That Will Save You A Lot of TimeBash-Oneliner
目录[TOC]CentOS 系统安装去镜像站下载光盘咯，这里选择的是 Minimaill 版本，我猜生产环境中应该不会有人安装 Everything，因为很多工具用不上占用硬盘空间也大，这样硬盘资源没有高效利用上。CentOS7 很好安装图形化跟着引导一步步走就行，这里只需注意开启网卡，否则一会儿连接不到互联网，得手动编辑网卡配置文件开启。区这边我个人设置自动，实际服务器一定要严谨。你也可以学习如何分区，这里偷懒就不演示了，仅仅介绍部分概念。swap 是物理内存不够用时会把一些数据存在硬盘中，这些数据通常是不需要被CPU读取的，这样为物理内存腾出空间，现在内存越来越大都不需要swap了。在服务器中为了保险还是得加上。RAID 是将几块硬盘合在一起使用。RAID0 是两块硬盘逻辑上变成一块硬盘，使用的容量是两块叠加，数据写到两块硬盘上，读取时会很快。RAID1 是一块硬盘做存储一块做备份。RAID5 至少两块盘存数据，另外一块盘存校验信息，如果挂掉一块数据盘，存校验信息拿块盘可以做奇偶校验把数据算出来，存储的一个容量是减掉叫研判剩余的容量。RAID01 先做 raid0 把两块硬盘逻辑上逻辑上变成一块使用，另外两块盘也是一样，raid1 把这些数据镜像到做完 raid0 的其中一块盘做备份。系统安装完成使用 root 用户登录进去，用 ip a 这条命令查看你的 IP。恭喜，搞定第一步系统安装。Linux 设计思想关于 Linux 发展史我这里就不写了，想了解可以去维基百科查 Linux。由很多的小程序组成，每个小程序完成单一的功能，从而实现复杂的任务（HTTP 服务需要安装很多小组件）一切皆文件：所有的外围设备（硬件）或其他程序尽量避免捕获用户接口配置文件保存为纯文本格式（可以用文本编辑器编辑 vim)多用户多任务系统(Liunx 一共 6 个终端，用 Ctrl + alt + F1-F6切换，终端数量可配置，Ctril + alt + F7 是图形化界面如无法切换则需要安装图形化界面（图形终端）什么是 shellshell 是使用者与计算机交互的一个接口（人机交互接口），我们在 shell 中输入命令，shell 把命令传递给内核，内核把命令结果反馈给 shell，眼睛从 shell 中读取命令执行结果。Linux支持的 shell：bash（Linux 默认使用的 shell，全称叫做 Bourne Again Shell)kshcshzsh......认识系统界面内核有哪些作用？内核：图形界面（GUI: graphical user interface）或字符界面（CLI: command line interface）Linux 图形界面有：GNOME（Linux 默认图形界面用 C 语言开发的）、KED（C++ 开发的）、xface（简化的图形界面）进程管理：进程就是你要执行的任务内存管理：文件系统：存储设备上存储数据的一个方式方法 windows上有 NTFS、FAT32，Linux中使用 ext3、ext4、xfs 等网络功能：管理IP地址信息等硬件驱动：安全功能：认识路径绝对路径：从根开始的路径是绝对路径。相对路径：是以你所在的工作目录为参照点（. 代表当前路径 .. 代表上一级路径 ~ 代表用户的宿主目录）Linux 命令分类与格式Linux 内分两种命令：外部命令内部命令外部命令是 Linux 文件系统中存在一个应用程序，我们用 type 命令来分辨所用的命令是什么类型。内部命令是 shell 自带的命令，buildin 关键字说明该命令是内置的，也就所说的内部命令。Linux 下所有命令都有对应格式，使用时按照方式套用即可。命令格式：命令字 [选项] [参数] #中括号表示可以省略 命令字：唯一的，用于实现某一项功能 选项：修改命令的执行方式(实现特定功能) 长选项：--引导，是一个单词(多个长选项不能组合) 短选项：-引导，是一个字符(多个短选项可以组合) 参数：命令作用的对象，你这个命令对谁执行 单看文字一定很懵，我们来看几个小栗子。例如下面 ls 是命令字，作用是查看文件及目录，后面 -a 是一个可选项意思是查看的时候帮我把隐藏文件也显示出来，-a 选项后面的 ./ 是一个参数，表示当前所在的目录。总结这一句话意思是查看当前目录下所有文件包括隐藏文件。ls -a ./如果看懂了那么这次就直接上手两种简单的命令吧。# 关机 poweroff shutdown -h now #-h是指定时间或者多少分钟后关机，立即关机可以不指定参数关机。 # 重启 reboot shutdown -r now有人说用 init 0、init 6 来替代 shutdown、reboot 说是 shutdown等同于拔电源，reboot 等同摁关机键，它们不会在关机前将内存中数据写入到硬盘，因此在生产环境中不懂就别重启服务器。正常关机流程是 关闭进程 -> 关闭服务 -> sync 写入数据 -> 关机，sync 这个命令多用几次，在鸟哥书中并没提到 shutdown 和 reboot 不能用，因为它们也会自动调用 sync 命令。问题在测试过程中 halt 会死机，除了这点外设置定时关机如何取消？