– 精心烘焙的 Linux 指令手册
已经导出, 不会进行更新维护
# Header
主要应付学业使用, 提取内容到独立文档后封存 2024-03-27 原味导出
改编自<决战 linux 之巅>的总结, 原文CSDN
什么, 问我为什么要加上"原味抹茶珍珠"? 这是因为文章是原味的(个人笔记原装, 还热乎), 内容是抹茶味的(我吃吃吃!), 我读起来是要掉小珍珠的(太惨了, OTZ 被利尼克斯拷打的太惨了)
# 知识
# 版本
# 内核版本
内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。
Linux 内核版本又分为稳定版和开发版,两种版本是相互关联,相互循环:
稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些 bug 或加入一些新的驱动程序。
开发版:由于要试验各种解决方案,所以变化很快。
内核源码网址:http://www.kernel.org 所有来自全世界的对 Linux 源码的修改最终都会汇总到这个网站,由 Linus 领导的开源社区对其进行甄别和修改最终决定是否进入到 Linux 主线内核源码中。
# 发行版本
Linux 发行版 (也被叫做 GNU/Linux 发行版) 通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、 SolusOS 等。
# Linux 目录
/ -> /root
-> /bin
-> /boot
....
/:根目录,一般根目录下只存放目录,在 Linux 下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到 home 目录。
/bin: /usr/bin: 可执行二进制文件的目录,如常用的命令 ls、tar、mv、cat 等。
/boot:放置 linux 系统启动时用到的一些文件,如 Linux 的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
/dev:存放 linux 系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
/etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
/home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~
表示当前用户的家目录~, ~~edu
表示用户 edu 的家目录。
/lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
/lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。
/mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
/opt:给主机额外安装软件所摆放的目录。
/proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。
/root:系统管理员 root 的家目录。
/sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如 fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root 使用的命令,一般用户只能"查看"而不能设置和使用。
/tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
/srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
/usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。
/var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其 PID 存放在该目录下。
bin:存放常见可执行命令,链接指向usr/bin
sbin:系统级的可执行命令。root可使用的命令,链接指向usr/sbin
lib:系统所需要的共享库文件,相当于win中的dll
lib64:64位相关的库文件
boot:系统启动引导内容
dev:硬件设备管理文件
etc:系统管理所需要的配置文件和其子目录
home:每个用户子目录的存放点
root:系统管理员(root用户)的主目录
opt:可选目录,给第三方软件提供的位置,第三方软件安装位置
media:识别一些可移动媒体设备(u盘,光驱)
mnt:移动化存储设备的另一个挂载点,和media相似
proc:进程目录,存放进程的映射
run:存放到目前为止的所有运行信息
srv:存放和系统服务相关的内容
sys:系统硬件信息相关的文件
tmp:临时目录,随意存放
usr:存放了应用程序和用户相关的数据和文件
var:可变目录,经常会修改的内容(日志等)
# 用户目录
位于/home/user,称之为用户工作目录或家目录,表示方式:
/home/user
~
每个目录下都有.和..
. 表示当前目录
.. 表示上一级目录,即父目录
根目录下的.和..都表示当前目录
文件的颜色 | 含义 |
---|---|
蓝色 | 目录 |
绿色 | 可执行文件 |
红色 | 压缩文件 |
浅蓝色 | 链接文件 |
灰色 | 其他文件 |
# 启动过程
- 内核的引导
- 运行 init
- 系统初始化
- 建立终端
- 用户登录系统
# 加载内核
当计算机打开电源后,首先是 BIOS 开机自检,按照 BIOS 中设置的启动设备(通常是硬盘)来启动。
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
# 启动初始化进程 init
内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境
init 程序首先是需要读取配置文件/etc/inittab
CentOS 各版本 init 配置文件的位置:
SysV: init, CentOS 5 之前, 配置文件: /etc/inittab。
Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
Systemd: systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。
# 确定运行级别
许多程序需要开机启动。它们在 Windows 叫做"服务"(service),在 Linux 就叫做"守护进程"(daemon)
init 进程的一大任务,就是去运行这些开机启动的程序
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动 Apache,用作桌面就不需要
Linux 允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运
行级别",确定要运行哪些程序。
Linux 系统有 7 个运行级别(runlevel):
运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆
运行级别 2:多用户状态(没有 NFS)
运行级别 3:完全的多用户状态(有 NFS),登陆后进入控制台命令行模式
运行级别 4:系统未使用,保留
运行级别 5:X11 控制台,登陆后进入图形 GUI 模式
运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
# 加载开机启动程序
在 init 的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而
rc.sysinit 是一个 bash shell 的脚本,它主要是完成一些系统初始化的工作,rc.sysinit 是每一个运行级别都要首先运行
的重要脚本。
它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务
// 下面内容太深了, 暂时打住
# 用户登录
一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh 登录
(3)图形界面登录
对于运行级别为 5 的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入 KDE、Gnome 等窗口管理器。
而本文主要讲的还是文本方式登录的情况:当我们看到 mingetty 的登录界面时,我们就可以输入用户名和密码来登录系统了。
Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。
然后 login 会对用户名进行分析:如果用户名不是 root,且存在 /etc/nologin 文件,login 将输出 nologin 文件的内容,然后退出。
这通常用来系统维护时防止非 root 用户登录。只有/etc/securetty 中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 用户可以在任何终端上登录。
/etc/usertty 文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
# login shell
shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的 shell,就叫做 login shell。
(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当
前用户的配置。
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再
读入后面两个文件了。
(2)ssh 登录:与第一种情况完全相同。
(3)图形界面登录:只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。
# 用户账号系统文件
完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。
与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group 等。
# /etc/passwd 文件是用户管理工作涉及的最重要的一个文件
Linux 系统中的每个用户都在/etc/passwd 文件中有一个对应的记录行,它记录了这个用户的一些基本属性。
这个文件对所有用户都是可读的。它的内容类似下面的例子:
# cat /etc/passwd
root:x:0:0:Superuser:/:
daemon:x:1:1:System daemons:/etc:
bin:x:2:2:Owner of system commands:/bin:
sys:x:3:3:Owner of system files:/usr/sys:
adm:x:4:4:System accounting:/usr/adm:
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
auth:x:7:21:Authentication administrator:/tcb/files/auth:
cron:x:9:16:Cron daemon:/usr/spool/cron:
listen:x:37:4:Network daemon:/usr/net/nls:
lp:x:71:18:Printer administrator:/usr/spool/lp:
sam:x:200:50:Sam san:/home/sam:/bin/sh
从上面的例子我们可以看到,/etc/passwd 中一行记录对应着一个用户,每行记录又被冒号(:)分隔为 7 个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
# “用户名"是代表用户账号的字符串
通常长度不超过 8 个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。
为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。
# “口令”一些系统中,存放着加密后的用户口令字
虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd 文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多 Linux 系统(如 SVR4)都使用了 shadow 技术,把真正的加密后的用户口令字存放到/etc/shadow 文件中,而在/etc/passwd 文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”
# “用户标识号”是一个整数,系统内部用它来标识用户
一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录 Shell 等。
通常用户标识号的取值范围是 0 ~ 65 535。0 是超级用户 root 的标识号,1 ~ 99 由系统保留,作为管理账号,普通用户的标识号从 100 开始。在 Linux 系统中,这个界限是 500。
# “组标识号”字段记录的是用户所属的用户组。
它对应着/etc/group 文件中的一条记录。
# “注释性描述”字段记录着用户的一些个人情况。
例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的 Linux 系统中,这个字段的格式并没有统一。在许多 Linux 系统中,这个字段存放的是一段任意的注释性描述文字,用做 finger 命令的输出。
# “主目录”,也就是用户的起始工作目录。
它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。
# Shell
用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即 Shell。
Shell 是用户与 Linux 系统之间的接口。Linux 的 Shell 有许多种,每种都有不同的特点。常用的有 sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
系统管理员可以根据系统情况和用户习惯为用户指定某个 Shell。如果不指定 Shell,那么系统使用 sh 为默认的登录 Shell,即这个字段的值为/bin/sh。
用户的登录 Shell 也可以指定为某个特定的程序(此程序不是一个命令解释器)。
利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些 Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
# 伪用户(pseudo users)
这些用户在/etc/passwd 文件中也占有一条记录,但是不能登录,因为它们的登录 Shell 为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。
常见的伪用户如下所示:
伪 用 户 含 义
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lp lp或lpd子系统使用
nobody NFS使用
# 拥有帐户文件
1、除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet 等,它们也都各自为相关的进程和文件所需要。
由于/etc/passwd 文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的 Linux 系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow 文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。
2、/etc/shadow 中的记录行与/etc/passwd 中的一一对应,它由 pwconv 命令根据/etc/passwd 中的数据自动产生
它的文件格式与/etc/passwd 类似,由若干个字段组成,字段之间用”:“隔开。这些字段是:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
- “登录名"是与/etc/passwd 文件中的登录名相一致的用户账号
- “口令"字段存放的是加密后的用户口令字,长度为 13 个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
- “最后一次修改时间"表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在 SCO Linux 中,这个时间起点是 1970 年 1 月 1 日。
- “最小时间间隔"指的是两次修改口令之间所需的最小天数。
- “最大时间间隔"指的是口令保持有效的最大天数。
- “警告时间"字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
- “不活动时间"表示的是用户没有登录活动但账号仍能保持有效的最大天数。
- “失效时间"字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
下面是/etc/shadow 的一个例子:
# cat /etc/shadow
root:Dnakfw28zf38w:8764:0:168:7:::
daemon:*::0:0::::
bin:*::0:0::::
sys:*::0:0::::
adm:*::0:0::::
uucp:*::0:0::::
nuucp:*::0:0::::
auth:*::0:0::::
cron:*::0:0::::
listen:*::0:0::::
lp:*::0:0::::
sam:EkdiSECLWPdSa:9740:0:0::::
# 用户组的所有信息都存放在/etc/group 文件中。
将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段。
每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。
当一个用户同时是多个组中的成员时,在/etc/passwd 文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。
用户要访问属于附加组的文件时,必须首先使用 newgrp 命令使自己成为所要访问的组中的成员。
用户组的所有信息都存放在/etc/group 文件中。此文件的格式也类似于/etc/passwd 文件,由冒号(:)隔开若干个字段,这些字段有:
组名:口令:组标识号:组内用户列表
- “组名"是用户组的名称,由字母或数字构成。与/etc/passwd 中的登录名一样,组名不应重复。
- “口令"字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
- “组标识号"与用户标识号类似,也是一个整数,被系统内部用来标识组。
- “组内用户列表"是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
/etc/group 文件的一个例子如下:
root::0:root
bin::2:root,bin
sys::3:root,uucp
adm::4:root,adm
daemon::5:root,daemon
lp::7:root,lp
users::20:root,sam
# 批量添加用户
添加和删除用户对每位 Linux 系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用 useradd 一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux 系统提供了创建大量用户的工具,可以让您立即创建大量用户,方法如下:
# (1)先编辑一个文本用户文件。
每一列按照/etc/passwd
密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入 x 号。一个范例文件 user.txt 内容如下:
user001::600:100:user:/home/user001:/bin/bash
user002::601:100:user:/home/user002:/bin/bash
user003::602:100:user:/home/user003:/bin/bash
user004::603:100:user:/home/user004:/bin/bash
user005::604:100:user:/home/user005:/bin/bash
user006::605:100:user:/home/user006:/bin/bash
#
(2)以 root 身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt
中导入数据,创建用户:
# newusers < user.txt
然后可以执行命令 vipw
或 vi /etc/passwd
检查 /etc/passwd
文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。
# (3)执行命令/usr/sbin/pwunconv。
将 /etc/shadow
产生的 shadow
密码解码,然后回写到 /etc/passwd
中,并将/etc/shadow
的shadow
密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password
功能。
# pwunconv
# (4)编辑每个用户的密码对照文件。
格式为:
用户名:密码
实例文件 passwd.txt
内容如下:
user001:123456
user002:123456
user003:123456
user004:123456
user005:123456
user006:123456
#
(5)以 root 身份执行命令 /usr/sbin/chpasswd
。
创建用户密码,chpasswd
会将经过 /usr/bin/passwd
命令编码过的密码写入 /etc/passwd
的密码栏。
# chpasswd < passwd.txt
# (6)确定密码经编码写入/etc/passwd 的密码栏后。
执行命令 /usr/sbin/pwconv
将密码编码为 shadow password
,并将结果写入 /etc/shadow
。
# pwconv
这样就完成了大量用户的创建了,之后您可以到/home 下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。
# 链接
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。
硬连接
硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
# 图形桌面快捷方式
# 软连接
这种方法不能设置快捷方式的图标
在命令行中利用 ln 命令,在桌面目录下创建一个软连接,使其指向某个应用程序,桌面上就会有一个这个应用程序的快捷方式。
以软件 sublime text 为例,其应用程序是/opt/sublime_text/sublime_text,桌面目录是/home/xjh/Desktop,则创建快捷方式如下:
xjh@ubuntu:~$ ln -s /opt/sublime_text/sublime_text /home/xjh/Desktop/subl
xjh@ubuntu:~$ #应用程序的路径 #桌面目录下的快捷方式名称
# 复制快捷方式
通过软件包管理工具安装软件后,一般会在/usr/share/applications 目录下生成快捷方式文件,在桌面环境下表现为一个图标。
直接去对应目录获取即可
# 文件快捷方式
例如在桌面制造 IDEA 链接
创建一个文件, 输入以下内容 (已经修改为我的版本)
[Desktop Entry]
Type=Application
Version=232.9921.47
Name=IDEA
Comment=Run IDEA
Icon=/opt/idea/idea-IU-232.9921.47/bin/idea.png
Exec=/opt/idea/idea-IU-232.9921.47/bin/idea.sh
Terminal=false
Path=
StartupNotify=false
保存后,再次对这个文件重命名,修改为IDEA.desktop
# Shell
了解脚本语言(核心要素: 脚本)
了解 Shell 脚本的基本语法与使用方式
(注意执行权限问题)
# ShellHelloWorld
完成基本 Shell 脚本的编写
任务目标
- 输出文字 HelloLinux
- 交互式完成计算器加法- 计算双数之和
- 完成交互式树洞选择结构: 输入 y/n. 其他的选择 I don’t Know
- 函数, 用作循环测试: 输入 n 个数, 计算这些数的平方和
- 函数(方法)调用 Bash, 任意方法
- 查看并展示每个文件具体内容并演示效果->DDL Fri
现在请帮助完成基本LinuxCentOS系统中Shell脚本的编写, 完成以下任务: 1. 输出文字HelloLinux ; 2, 完成交互式的计算器加法- 计算双数之和;3. 完成交互式内容随机输出功能, 需要有一个选择结构: 用户输入y/n来确定是否继续输出. 如果用户输入了其他的选择则输出I don't Know; 4. 编写函数用作循环功能测试: 让用户输入n个数, 计算这些数的平方和 5. 测试函数调用, 编写任意方法后调用; 请完成上述目标并展示完成目标所需的操作步骤
您好,这是Bing。我可以尝试帮助您完成基本Linux CentOS系统中Shell脚本的编写。以下是一个可能的脚本,您可以根据您的需要进行修改或优化。
#!/bin/bash
# 1. 输出文字HelloLinux
echo "HelloLinux"
# 2. 完成交互式的计算器加法- 计算双数之和
echo "请输入两个数,用空格隔开:"
read a b # 读取用户输入的两个数
sum=$((a+b)) # 计算两数之和
echo "两数之和为:$sum"
# 3. 完成交互式内容随机输出功能, 需要有一个选择结构: 用户输入y/n来确定是否继续输出. 如果用户输入了其他的选择则输出I don't Know
while true # 无限循环
do
echo "请输入y或n:"
read choice # 读取用户输入的选择
if [ "$choice" = "y" ] # 如果用户输入y
then
echo "随机输出一个内容:"
shuf -n 1 content.txt # 从content.txt文件中随机选取一行输出
elif [ "$choice" = "n" ] # 如果用户输入n
then
echo "退出程序"
break # 跳出循环
else # 如果用户输入其他
echo "I don't Know"
fi
done
# 4. 编写函数用作循环功能测试: 让用户输入n个数, 计算这些数的平方和
function square_sum # 定义函数
{
sum=0 # 初始化平方和为0
for num in $@ # 遍历函数的所有参数
do
sum=$((sum+num*num)) # 计算平方和
done
echo "平方和为:$sum" # 输出平方和
}
# 5. 测试函数调用, 编写任意方法后调用
echo "请输入n个数,用空格隔开:"
read -a array # 读取用户输入的数组
square_sum ${array[@]} # 调用函数,传入数组作为参数
首先,您需要选择一个文本编辑器来编写您的脚本代码。您可以使用默认的文本编辑器,也可以使用 Vim、Nano、Emacs 等其他终端或图形界面的文本编辑器。
然后,您需要创建一个扩展名为 .sh 的文本文件,并在其中输入您想要执行的命令和语句。您可以使用 touch 命令来创建一个空文件,或者使用 cat 命令来直接输入内容。
接下来,您需要在脚本的第一行添加一个 shebang 行,它告诉系统您想要使用哪种 shell 来解释执行您的脚本。例如,如果您想要使用 bash shell,您可以在第一行写 #!/bin/bash 。
然后,您需要给您的脚本文件添加可执行权限,以便您可以运行它。您可以使用 chmod 命令来做到这一点,例如 chmod u+x hello.sh 。
最后,您可以使用两种方法之一来运行您的脚本。一种是在脚本文件名前加上 bash 命令,例如 bash hello.sh 。另一种是在脚本文件名前加上 ./ ,例如 ./hello.sh 。如果您想要从任何目录运行您的脚本,您还需要将您的脚本文件所在的目录添加到 PATH 变量中,您可以使用 export 命令来做到这一点,例如 export PATH=$PATH:/home/ay2021/scripts 。
https://www.runoob.com/linux/linux-shell.html
见实验报告
# 重定向命令
重定向命令列表如下:
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command » file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n » file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
« tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
# 输出重定向
重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:
command1 > file1
上面这个命令执行 command1 然后将输出的内容存入 file1。
注意任何 file1 内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用»操作符。
# 输入重定向
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
command1 < file1
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
接着以上实例,我们需要统计 users 文件的行数,执行以下命令:
$ wc -l users
2 users
也可以将输入重定向到 users 文件:
$ wc -l < users
2
注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。
command1 < infile > outfile
同时替换输入和输出,执行 command1,从文件 infile 读取内容,然后将输出写入到 outfile 中。
# 重定向深入讲解
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin 的文件描述符为 0,Unix 程序默认从 stdin 读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为 1,Unix 程序默认向 stdout 输出数据。
- 标准错误文件(stderr):stderr 的文件描述符为 2,Unix 程序会向 stderr 流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将 stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以这样写:
$ command 2>file
如果希望 stderr 追加到 file 文件末尾,可以这样写:
$ command 2>>file
2 表示标准错误文件(stderr)。
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
或者
$ command >> file 2>&1
如果希望对 stdin 和 stdout 都重定向,可以这样写:
$ command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
# Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
它的基本的形式如下:
command << delimiter
document
delimiter
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:
- 结尾的 delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
- 开始的 delimiter 前后的空格会被忽略掉。
# 实例
在命令行中通过 wc -l 命令计算 Here Document 的行数:
wc -l << EOF
欢迎来到
河北小学
EOF
我们也可以将 Here Document 用在脚本中,例如:
#!/bin/bash
cat << EOF
欢迎来到
河北小学
EOF
执行
# /dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
注意: 0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。
# 环境
指虚拟机运行环境
# 网络模式
# 桥接
在网络网卡上安装了一个桥接协议,让这块网卡处于混杂模式,可以同时连接多个网络的做法。
桥接下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样放在这个交换机当中,所以所有桥接下网卡与网卡都是交换模式的,相互可以访问而不干扰。
# Host-only
(仅与主机通信)
虚拟机使用 VMnet1 网卡与主机单独组网,主机对于虚拟机相当于路由器
# NAT
虚拟机使用 VMnet8 网卡与主机单独组网,主机对于虚拟机相当于路由器,VMnet8 网卡通过 NAT 地址转换协议与物理机网卡通信
# 指令
# 直属
# 通用
Linux 命令格式: []代表可选
command [-options] [parameter1] …
command: 命令名;
[-options]:选项,可用来对命令进行控制,也可以省略,
parameter1 …:传给命令的参数:可以是零个一个或多个
# 终端操作
# 帮助
**help ** 一般是 linux 命令自带的帮助信息
如:ls --help
man(manual)
man 是 linux 提供的一个手册,包含了绝大部分的命令、函数使用说明; 手册分成很多章节(section),使用 man 时可以指定不同的章节来浏览。
例:man ls ; man 2 printf
man 中各个 section 意义如下:
- Standard commands(标准命令)
- System calls(系统调用,如 open,write)
- Library functions(库函数,如 printf,fopen)
- Special devices(设备文件的说明,/dev 下各种设备)
- File formats(文件格式,如 passwd)
- Games and toys(游戏和娱乐)
- Miscellaneous(杂项、惯例与协定等,例如 Linux 档案系统、网络协定、ASCII 码;environ 全局变量)
- Administrative Commands(管理员命令,如 ifconfig)
man 是按照手册的章节号的顺序进行搜索的。
man 设置了如下的功能键:
注意:实际上,我们不用指定第几个章节也用查看,如,man ls
功能键 | 功能 |
---|---|
空格键 | 显示手册页的下一屏 |
Enter 键 | 一次滚动手册页的一行 |
b | 回滚一屏 |
f | 前滚一屏 |
q | 退出 man 命令 |
h | 列出所有功能键 |
/word | 搜索 word 字符串 |
# 历史记录
当系统执行过一些命令后,可按上下键翻看以前的命令,history 将执行过的命令列举出来
history 保留了最近执行的命令记录,默认可以保留 1000。历史清单从 0 开始编号到最大值。
历史清单从 0 开始编号到最大值。
history N 显示最近N条命令
history -c 清除所有的历史记录
history -w xxx.txt 保存历史记录到文本xxx.txt
# Ctrl 组合键
Ctrl+c | 结束正在运行的程序 |
---|---|
Ctrl+d | 结束输入或退出 shell |
Ctrl+s | 暂停屏幕输出【锁住终端】 |
Ctrl+q | 恢复屏幕输出【解锁终端】 |
Ctrl+L | 清屏,等同于 Clear |
ctrl+a | 当前光标到行首 |
---|---|
ctrl+e | 当前光标到行尾 |
ctrl+u | 删除当前光标到行首 |
ctrl+k | 删除当前光标到行尾 |
Ctrl+y | 在光标处粘贴剪切的内容 |
---|---|
Ctrl+r | 查找历史命令【输入关键字,就能调出以前执行过的命令】 |
Ctrl+t | 调换光标所在处与其之前字符位置,并把光标移到下个字符 |
Ctrl+x+u | 撤销操作 |
Ctrl+z | 转入后台运行 |
# 权限管理
用户能够控制一个给定的文件或目录的访问程度,一个文件或目录可能有读、写及执行权限:
通常,Unix/Linux 系统只允许文件的属主(所有者)或超级用户改变文件的读写权限。
- 读权限(r) :对于文件,具有读取文件内容的权限;对于目录,具有浏览目录的权限。
- 写权限(w) :对于文件,具有修改文件内容的权限;对于目录,具有删除、移动目录内文件的权限。
- 可执行权限(x): 对于文件,具有执行文件的权限;对于目录,该用户具有进入目录的权限。
# 显示
# stat
显示 inode 的内容
# lsattr
查看特殊权限
# lsattr /etc/passwd
# 改变
# chmod
修改文件权限
两种使用格式:字母法与数字法
字母法:chmod u/g/o/a +/-/= rwx 文件
[ u/g/o/a ]
- u user 所有者
- g group 用户组
- o other 表示其他以外的人
- a all 表示这三者皆是
[ + - = ]
- +增加权限
- -撤销权限
- =设定权限
rwx
- r read 表示可读取,没有意味着不能通过 ls 查看这个目录的内容
- w write 表示可写入,没有意味着不能在目录下创建新的文件
- x excute 表示可执行,没有意味着不能通过 cd 进入这个目录
数字法:“rwx” 这些权限也可以用数字来代替
- r 读取权限 “4”
- w 写入权限 “2”
- x 执行权限 “1”
-
-
无权限 "0"
-
如执行:chmod u=rwx,g=rx,o=r filename 就等同于:chmod u=7,g=5,o=4 filename
chmod 777 file:所有用户拥有读、写、执行权限
如果想递归所有目录加上相同权限,需要加上参数“ -R ”
chmod 777 test/ -R 递归 test 目录下所有文件加 777 权限
# chown
修改文件所有者
# chgrp
修改文件所属组
# chattr
设置特殊权限
凌驾于 r、w、x、suid、sgid 之上的权限。
- -i 锁定文件,不能编辑,不能修改,不能删除,不能移动,可以执行
- -a 仅可以追加文件,不能编辑,不能删除,不能移动,可以执行
# 特殊
linux 共 12 位权限,除了 9 位基础权限还有 3 个特殊权限
# setUID(suid)
命令功能: 临时使用命令的属主权限执行该命令。即如果文件有 suid 权限时,那么普通用户去执行该文件时,会以该文件的所属用户的身份去执行。
SetUID(简写 suid):会在属主权限位的执行权限上写个 s。 如果该属主权限位上有执行权限,则会在属主权限位的执行权限上写个 s(小写); 如果该属主权限位上没有执行权限,则会在属主权限位的执行权限上写个 S(大写)
由于 passwd 具有 s 权限,普通用户使用该命令的时候,就会以该命令的属主身份 root 执行该命令,于是能够顺利修改
普通用户不具备修改权限的 /etc/shadow 文件
希望普通用户 user1 可以删除某个自己没有权限删除的文件的操作方法:
- sudo 给 user1 授权 rm 权限
- rm 设置 suid
- 修改被删除文件上级目录的权限
总结
- 让普通用户对可执行的二进制文件,临时拥有二进制文件的属主权限
- 如果设置的二进制文件没有执行权限,那么 suid 的权限显示就是 S(大写字母 S)
- 特殊权限 suid 仅对二进制可执行程序有效,其他文件或目录则无效
- suid 极其危险,如果给 vim 或者 rm 命令设置了 setUID,那么任何文件都能编辑或者删除了,相当于有 root 权限了
# setGID(sgid)
命使得多个用户之间共享一个目录的所有文件变得简单。
当某个目录设置了 sgid 后,在该目录中新建的文件不在是创建该文件的默认所属组。
如果该属组权限位上有执行权限,则会在属组主权限位的执行权限上写个 s(小写字母); 如果该属组权限位上没有执行权限,则会在属组主权限位的执行权限上写个 S(大写字母 S)。
# 预设
# sticky(sbit)
粘滞位
只对目录有效,对某目录设置粘滞位后,普通用户就算有 w 权限也只能删除该目录下自己建立的文件,而不能删除其他用户建立的文件
如果该其他用户权限位上有执行权限,则会在其他用户权限位的执行权限上写个 t(小写);如果该其它用户权限位上没有执行权限,则会在其他用户权限位的执行权限上写个 T(大写)
系统中存在的/tmp 目录是经典的粘滞位目录,谁都有写权限,因此安全成问题,常常是木马第一手跳板。
# umask
掩码
用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由 umask 值决定的。
对于 root 用户,系统默认的 umask 值是 0022;对于普通用户,系统默认的 umask 值是 0002。执行 umask 命令可以查看当前用户的 umask 值。
改变新文件的权限
umask 值一共有 4 组数字,其中第 1 组数字用于定义特殊权限,一般不予考虑,与一般权限有关的是后 3 组数字。
默认情况下,对于目录,用户所能拥有的最大权限是 777;对于文件,用户所能拥有的最大权限是目录的最大权限去掉执行权限,即 666。因为 x 执行权限对于目录是必须的,没有执行权限就无法进入目录,而对于文件则不必默认赋予 x 执行权限。
对于 root 用户,他的 umask 值是 022。当 root 用户创建目录时,默认的权限就是用最大权限 777 去掉相应位置的 umask 值权限,即对于所有者不必去掉任何权限,对于所属组要去掉 w 权限,对于其他用户也要去掉 w 权限,所以目录的默认权限就是 755;当 root 用户创建文件时,默认的权限则是用最大权限 666 去掉相应位置的 umask 值,即文件的默认权限是 644。
通过 umask 命令可以修改 umask 值,比如将 umask 值设为 0077
永久修改 umask
umask 命令只能临时修改 umask 值,系统重启之后 umask 将还原成默认值。如果要永久修改 umask 值,可修
改 /etc/bashrc 或 /etc/profile 文件。
例如要将默认 umask 值设置为 027,那么可以在文件中增加一行 umask 027
# 文件管理
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示
- nl 显示的时候,顺道输出行号
- more 一页一页的显示文件内容
- less 与 more 类似,但可以往前翻页
- head 只看头几行
- tail 只看尾巴几行
# 显示
# cat-tac
基本显示
cat [-AbEnTv]
/tac 刚好相反
- -A : 相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
- -v : 列出一些看不出来的特殊字符
- -E : 将结尾的断行字节 $ 显示出来;
- -T : 将 [tab] 按键以 ^I 显示出来;
- -b : 列出行号,空白行不标行号
- -n : 列出行号,连同空白行也会有行号
# 分页
# nl
显示行号
nl [-bnw] 文件
- -b : 指定行号指定的方式,主要有两种:
-b a : 表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t : 如果有空行,空的那一行不要列出行号(默认值); - -n : 列出行号表示的方法,主要有三种:
-n ln : 行号在荧幕的最左方显示;
-n rn : 行号在自己栏位的最右方显示,且不加 0 ;
-n rz : 行号在自己栏位的最右方显示,且加 0 ; - -w : 行号栏位的占用的位数。
# more-less
分屏显示
More
- Space 向下翻一页;
- Enter 向下翻『一行』;
- /字串 在这个显示的内容当中,向下搜寻『字串』这个关键字;
- :f 立刻显示出档名以及目前显示的行数;
- q 离开
- b 或 [ctrl]-b 代表往回翻页,不过这动作只对文件有用,对管线无用。
Less
- 空白键 向下翻动一页;
- [pagedown] 向下翻动一页;
- [pageup] 向上翻动一页;
- /字串 向下搜寻『字串』的功能;
- ?字串 向上搜寻『字串』的功能;
- n 重复前一个搜寻 (与 / 或 ? 有关!)
- N 反向的重复前一个搜寻 (与 / 或 ? 有关!)
- q 离开
# head-tail
取首/尾 n 行
head [-n number] 文件
- -n : 后面接数字,代表显示几行
tail [-n number] 文件
- -n :后面接数字,代表显示几行的意思
- -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测
# 创建
- 使用 touch 命令
- 使用 vi 和 vim 命令
- 使用>、»命令
- 使用 cp 命令
- 使用 cat 命令间接
# touch
同时创建两个
touch XXX, XXX
批量创建文件
touch test{01..10}.sh
更改文件 test.sh 时间为当前时间(test.sh 已存在)
touch test.sh
# vi/vim
使用编辑器打开
vi test.sh
vim test.sh
# ls + >、>>
输出重定向将结果写入文件
可将本应显示在终端上的内容保存到指定文件中。 如:ls > test.txt ( test.txt 如果不存在,则创建,存在则覆盖其内容 )
单箭头输出重定向会覆盖原来的内容,»输出重定向则会追加到文件的尾部。
# grep
将结果写入文件
ps -ef | grep java > test.sh
ps -ef | grep java >> test.sh
# echo
将结果写入文件
echo $PATH > test.sh
echo $PATH >> test.sh
# ln
建立链接文件
软链接:ln -s 源文件 链接文件
硬链接:ln 源文件 链接文件
软链接(常用)类似于 Windows 下的快捷方式,如果软链接文件和源文件不在同一个目录,源文件要使用绝对路径,不能使用相对路径
硬链接只能链接普通文件不能链接目录。 两个文件占用相同大小的硬盘空间,即使删除了源文件,链接文件还是存在
# 目录
- 绝对路径:
路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。 - 相对路径:
路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。
- ls(英文全拼:list files): 列出目录及文件名
- cd(英文全拼:change directory):切换目录
- pwd(英文全拼:print work directory):显示目前的目录
- mkdir(英文全拼:make directory):创建一个新的目录
- rmdir(英文全拼:remove directory):删除一个空的目录
- cp(英文全拼:copy file): 复制文件或目录
- rm(英文全拼:remove): 删除文件或目录
- mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
# ls
列出目录的内容
Linux 文件或者目录名称最长可以有 265 个字符,“.”代表当前目录,“..”代表上一级目录,以“.”开头的文件为隐藏文件需要用 -a 参数才能显示。
ls [-aAdfFhilnrRSt] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
选项与参数:
- -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
- -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
- -l :长数据串列出,包含文件的属性与权限等等数据(常用) 直接用 ll
将目录下的所有文件列出来(含属性与隐藏档)
[root@www ~]# ls -al ~
列出的信息的含义
一行: 文件类型(1) + 权限 3 组(9) + 目录/链接个数 + 所有者以及组 + 大小 + 修改日期 + 名称 + (*)
含义:
第 1 个字母代表文件的类型
- “d” 代表文件夹
- “-” 代表普通文件
- “c” 代表硬件字符设备
- “b” 代表硬件块设备
- “s” 表示管道文件
- “l” 代表软链接文件。
后 9 个字母分别代表三组权限:
第一段表示文件创建者/所有者对该文件所具有的权限,第二段表示创建者/所有者所在的组的其他用户所具有的权限,第三段表示其他组的其他用户所具有的权限。
r(Read,读取权限):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
w(Write,写入权限):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
x(eXecute,执行权限):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
另外,这里还有 2 个很特殊的属性,平时不怎么常见,这里也顺带解释一下:
s 或 S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备 SUID 权限的文件,黑客经常利用这种权限,以 SUID 配上 root 帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。
t 或 T(Sticky):/tmp 和 /var/tmp 目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。
综合起来可得,对于 back_init 文件,其创建者/所有者具有可读可写可执行的权限,其创建者/所有者所在的组的其他用户具有可读可写可执行的权限,其他组的其他用户则具有可读可执行但不可写的权限。
再然后一个是目录/链接个数
对于目录文件,表示它的第一级子目录的个数。注意此处看到的值要减 2才等于该目录下的子目录的实际个数(要加上.目录和..目录)
之后一对
所有者及组
文件的所有者/创建者(owner)及其所在的组(group)
数值
文件大小,单位为字节。
如果是目录,则表示该目录符所占的大小,并不表示该目录下所有文件的大小
修改日期
最后修改的日期时间
文件名称 字体颜色
在大多数的 linux shell 窗口中,还能用颜色来区分不同文件的属性:
灰白色表示普通文件;
亮绿色表示可执行文件;
亮红色表示压缩文件;
灰蓝色表示目录;
亮蓝色表示链接文件;
亮黄色表示设备文件;
另
凡是文件名后面带了一个星号(*)的,都是在说明这是一个可执行文件
通配符 | 含义 |
---|---|
* | 所有字符 |
? | 任意字符 |
X* */** X | 查找…开头/结尾的 |
X?/?X | 查找..位置字符任意,…开头结尾的 |
[ ] | 匹配字符组中的任意一个 里面配合 - 来表示范围 |
\ | 转义字符 |
# cd
(切换目录)
Change Directory
Linux所有的目录和文件名大小写敏感
cd [相对路径或绝对路径]
- cd == cd ~
- cd ~ 切换到当前用户的主目录(/home/用户目录)
- cd . 切换到当前目录
- cd .. 切换到上级目录
- cd - 进入上次所在的目录
#使用 mkdir 命令创建 runoob 目录
[root@www ~]# mkdir runoob
#使用绝对路径切换到 runoob 目录
[root@www ~]# cd /root/runoob/
#使用相对路径切换到 runoob 目录
[root@www ~]# cd ./runoob/
# 表示回到自己的家目录,亦即是 /root 这个目录
[root@www runoob]# cd ~
# 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思;
[root@www ~]# cd ..
# pwd
(显示目前所在的目录)显示当前路径
Print Working Directory 显示目前所在目录的命令。
[root@www ~]# pwd [-P]
选项与参数:
- -P :显示出确实的路径,而非使用链接 (link) 路径。
实例:单纯显示出目前的工作目录:
[root@www ~]# pwd
/root <== 显示出目录啦~
实例显示出实际的工作目录,而非链接档本身的目录名而已。
[root@www ~]# cd /var/mail <==注意,/var/mail是一个链接档
[root@www mail]# pwd
/var/mail <==列出目前的工作目录
[root@www mail]# pwd -P
/var/spool/mail <==怎么回事?有没有加 -P 差很多~
[root@www mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是链接档,链接到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以链接档的数据显示,而是显示正确的完整路径啊!
# mkdir
make directory 创建目录
mkdir [-mp] 目录名称
新建目录的名称不能与当前目录中已有的目录或文件同名,并且目录创建者必须对当前目录具有写权限
- -m : 指定被创建目录的权限,而不是根据默认权限 (umask) 设定
- -p : 递归创建所需要的目录
//递归创建实例:
mkdir -p test1/test2/test3/test4
//指定被创建目录的权限
mkdir t2 -m 711
# rm
删除文件或目录
使用 rm 命令要小心,因为文件删除后不能恢复。为了防止文件误删,可以在 rm 后使用-i 参数以逐个确认要删除的文件
rm -fr 包治百病
- -i 以进行交互式方式执行
- -f 强制删除,忽略不存在的文件,无需提示
- -r 递归地删除目录下的内容,删除文件夹时必须加此参数
# rmdir
删除空目录
rmdir [-p] 目录名称
- -p : 从该目录起,一次删除多级空目录
将 mkdir 实例中创建的目录(/tmp 底下)删除掉!
[root@www tmp]# ls -l <==看看有多少目录存在?
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
[root@www tmp]# rmdir test <==可直接删除掉,没问题
[root@www tmp]# rmdir test1 <==因为尚有内容,所以无法删除!
rmdir: `test1': Directory not empty
[root@www tmp]# rmdir -p test1/test2/test3/test4
[root@www tmp]# ls -l <==您看看,底下的输出中test与test1不见了!
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。
不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录。
# cp
(复制文件或目录)
# cp [-adfilprsu] 来源档(source) 目标档(destination)
# cp [options] source1 source2 source3 .... directory
选项与参数:
- **-a ** 该选项通常在复制目录时使用,它保留链接、文件属性,并递归地复制目录,简单而言,保持文件原有属性。
- **-d ** 若来源档为链接档的属性(link file),则复制链接档属性而非文件本身;
- **-f ** 为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
- **-i ** 交互式复制,在覆盖目标文件之前将给出提示要求用户确认
- **-l ** 进行硬式链接(hard link)的链接档创建,而非复制文件本身;
- **-p ** 连同文件的属性一起复制过去,而非使用默认属性(备份常用);
- **-r ** 递归持续复制,用於目录的复制行为;(常用)
- **-s ** 复制成为符号链接档 (symbolic link),亦即批量创建快捷方式
- **-u ** 若 destination 比 source 旧才升级 destination !
- **-v ** 显示拷贝进度
用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖
# mv
移动文件
移动文件或目录,也可以给文件或目录重命名
- -f 禁止交互式操作,如有覆盖也不会给出提示
- -i 确认交互方式操作,如果 mv 操作将导致对已存在的目标文件的覆盖,系统会询问是否重写,要求用户
答以避免误覆盖文件 - -v 显示移动进度
- -u 若目标文件已经存在,且 source 比较新,才会升级 (update)
复制一文件,创建一目录,将文件移动到目录中
[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest
将某个文件移动到某个目录去,就是这样做!
将刚刚的目录名称更名为 mvtest2
[root@www tmp]# mv mvtest mvtest2
# 搜索
# grep
文本搜索
强大的文本搜索工具,允许对文本文件进行模式查找。如果找到匹配模式,grep 打印包含模式的所有行
grep [-选项] '搜索内容串' 文件名
- -r 递归的方式查找
- -v 打印出不符合条件行的内容
grep 命令中输入字符串参数时,最好引号或双引号括起来。例如: grep ‘a’ 1.txt 。
在当前目录中,查找前缀有test字样的文件中包含 test 字符串的文件,并打印出该字符串的行:
grep test test*
以递归的方式查找符合条件的文件:
查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容
grep -r update /etc/acpi #以递归的方式查找“etc/acpi”
查找文件名中包含 test 的文件中不包含test 的行:
grep -v test*
# find
查找文件
在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件并且将查找到的子目录和文件全部显示
find path -option [ -print ] [ -exec -ok command ] {} \;
-
-perm xxxx 权限为 xxxx 的文件或目录
-
-user 按照文件属主来查找文件。
-
-size n n 单位,b:512 位元组的区块,c:字元数,k:kilo bytes,w:二个位元组
-
-mount, -xdev 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-
-amin n 在过去 n 分钟内被读取过
-
-anewer file 比文件 file 更晚被读取过的文件
-
-atime n 在过去 n 天内被读取过的文件
-
-cmin n 在过去 n 分钟内被修改过
-
-cnewer file 比文件 file 更新的文件
-
-ctime n 在过去 n 天内被修改过的文件
-
-empty 空的文件
-
-gid n or -group name gid 是 n 或是 group 名称是 name
-
-ipath p, -path p 路径名称符合 p 的文件,ipath 会忽略大小写
-
-name name, -iname name 文件名称符合 name 的文件。iname 会忽略大小写
-
-type 查找某一类型的文件:
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l - 符号链接文件
f - 普通文件 -
-exec 命令名{} \ (注意:“}”和“\”之间有空格)
实例
显示当前目录中大于20字节并以.c结尾的文件名
find . -name "*.c" -size +20c
将目前目录其其下子目录中所有一般文件列出
find . -type f
将目前目录及其子目录下所有最近 20 天内更新过的文件列出
find . -ctime -20
查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
find . -type f -perm 644 -exec ls -l {} \;
查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;
从根目录查找类型为符号链接的文件,并将其删除:
find / -type l -exec rm -rf {} \
从当前目录查找用户tom的所有文件并显示在屏幕上
find . -user tom
在当前目录中查找所有文件以.doc结尾,且更改时间在3天以上的文件,找到后删除,并且给出删除提示
find . -name *.doc -mtime +3 -ok rm {} \;
在当前目录下查找所有链接文件,并且以长格式显示文件的基本信息
find . -type l -exec ls -l {} \;
在当前目录下查找文件名有一个小写字母、一个大写字母、两个数字组成,且扩展名为.doc的文件
find . -name '[a-z][A-Z][0-9][0-9].doc'
# locate
查找
locate 命令会去保存文档和目录名称的数据库内,查找文件或目录。
一般情况我们只需要输入 locate your_file_name 即可查找指定文件
-d 或–database= 配置 locate 指令使用的数据库。locate 指令预设的数据库位于/var/lib/mlocate 目录里,文档名为 mlocate.db
locate 与 find 的区别: find 是去硬盘找,locate 只在/var/lib/slocate 资料库中找。
locate 的速度比 find 快,它并不是真的查找,而是查数据库,一般文件数据库在/var/lib/mlocate/mlocate.db 中,所
以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库(updatedb)
# 归档
# tar
归档管理
把一系列文件归档到一个大文件中,也可以把档案文件解开以恢复数据。
tar [参数] 打包文件名 文件
tar 命令参数很特殊,其参数前面可以使用“-”,也可以不使用
注意:除了 f 需要放在参数的最后,其它参数的顺序任意
- -c 生成档案文件,创建打包文件
- -v 列出归档解档的详细过程,显示进度
- -f 指定档案文件名称,f 后面一定是.tar 文件,所以必须放选项最后
- -t 列出档案中包含的文件
- -x 解开档案文件
- -z 调用 gzip 实现压缩
tar 命令中-z 选项可以调用 gzip 实现了一个压缩的功能,实行一个先打包后压缩的过程
压缩用法:tar [zcvf] 压缩包包名 文件1 文件2 ...
解压用法: tar [zxvf] 压缩包包名
例如: tar zcvf test.tar.gz 1.c 2.c 3.c 4.c把 1.c 2.c 3.c 4.c 压缩成 test.tar.gz
解压到指定目录:-C (解压时可以不指定-z 选项)
tar xvf test.tar.gz -C number/
# gzip
bzip2
文件压缩解压
tar与gzip命令结合使用实现文件打包、压缩。 tar只负责打包文件,但不压缩,用gzip压缩tar打包后的文件,其扩展名一般用xxxx.tar.gz
gzip [选项] 被压缩文件
- -d 解压文件
- -r 压缩文件
bzip2 命令跟 gzip 用法类似
压缩用法:tar jcvf 压缩包包名 文件...(tar jcvf bk.tar.bz2 *.c)
解压用法:tar jxvf 压缩包包名 (tar jxvf bk.tar.bz2)
# zip
unzip
文件压缩解压
通过 zip 压缩文件的目标文件不需要指定扩展名,默认扩展名为 zip
压缩文件:zip [-r] 目标文件(没有扩展名) 源文件
解压文件:unzip -d 解压后目录文件 压缩文件
# 管道
|
管道命令是’|’,一个命令的输出可以通过管道做为另一个命令的输入, |的左右分为两端,从左端写入到右端通过它可以对数据进行连续处理
管道命令仅处理标准输出,对于标准错误输出,将忽略
管道命令右边命令,必须能够接收标准输入流命令才行,否则传递过程中数据会抛弃。
常用来作为接收数据管道命令有: less,more,head,tail,而 ls, cp, mv 就不行
# 综合
使用 ls、grep 和 wc 这三个命令来统计某个路径下文件或者文件夹的数量。例如:
- 统计当前目录下文件的个数(不包括目录):ls -l | grep “^-” | wc -l
- 统计当前目录下文件的个数(包括子目录):ls -lR| grep “^-” | wc -l
- 查看某目录下文件夹 (目录)的个数(包括子目录):ls -lR | grep “^d” | wc -l
- 统计当前文件夹下叫某某的文件的数量:find . -name filename | wc -l
- 统计当前文件夹下指定类型的文件的数量:find -name “*.js” | wc -l
使用 find 命令获取所有文件,然后使用 wc 命令计算数量。例如:
- 统计某个目录中的文件数(包括子目录):find directory_path -type f | wc -l
- 递归统计出文件夹下所有文件的数目:find /path/to/folder -name “*.java” | wc -l
- 递归统计出文件夹下所有子文件夹的数目:find /path/to/folder -type d | wc -l
# wc
统计字数
可以计算文件的 Byte 数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-",则 wc 指令会从标准输入设
备读取数据
wc [-lwm] [filename],[filename2],...
- -l: 统计行数
- -w: 统计英文单词
- -m: 统计字符数
默认的情况下,wc 将计算指定文件的行数、字数,以及字节数
示例
$ wc testfile # testfile文件的统计信息
3 92 598 testfile # testfile文件的行数为3、单词数92、字节数598
# cut
列选取命令
- -d : 后面接分隔字符。与 -f 一起使用;
- -f : 依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
- -c : 以字符 (characters) 的单位取出固定字符区间
cut 以行为单位,根据分隔符把行分成若干列,这样就可以指定选取哪些列了
示例
cut -d '分隔字符' -f 选取的列数
echo $PATH|cut -d ':' -f 2 --选取第2列
echo $PATH|cut -d ':' -f 3,5 --选取第3列和第5列
echo $PATH|cut -d ':' -f 3-5 --选取第3列到第5列
echo $PATH|cut -d ':' -f 3- --选取第3列到最后1列
echo $PATH|cut -d ':' -f 1-3,5 --选取第1到第3列还有第5列
# grep
行选取命令
grep [-cinv] '查找的字符串' filename
在 grep 命令中输入字符串参数时,最好引号或双引号括起来。例如: grep ‘a’ 1.txt
- -v 显示不包含匹配文本的所有行(相当于求反)
- -n 显示匹配行及行号
- -i 忽略大小写
- -c 计算找到的行数
grep 搜索内容串可以是正则表达式(略)
实例:
显示所有以“h”结尾的行
grep h$
匹配所有以“a”开头且以“e”结尾的,中间包含 2 个字符的单词
grep '<a..e>'
# sort
排序
sort [-fbMnrtuk] [file or stdin]
- -f : 忽略大小写的差异,例如 A 与 a 视为编码相同;
- -b : 忽略最前面的空格符部分;
- -M : 以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
- -n : 使用『纯数字』进行排序(默认是以文字型态来排序的);
- -r : 反向排序;
- -u : 就是 uniq ,相同的数据中,仅出现一行代表;
- -t : 分隔符,默认是用 [tab] 键来分隔;
- -k : 以哪个区间 (field) 来进行排序
默认是以第一个字符升序排序:
# cat /etc/passwd | sort
以第 3 列排序:
cat /etc/passwd | sort -t ':' -k 3
使用数字排序:
cat /etc/passwd | sort -t ':' -k 3n
倒序排序:
cat /etc/passwd | sort -t ':' -k 3nr
# uniq
去重
- -i : 忽略大小写字符的不同;
- -c : 进行计数
- -u : 只显示唯一的行
该命令用于排完序之后,对排序结果进行去重
$ last | cut -d ' ' -f 1 | sort | uniq
示例
排序之后删除了重复行,同时在行首位置输出该行重复的次数:
#sort testfile | uniq -c
仅显示存在重复的行,并在行首显示该行重复的次数:
#sort testfile | uniq -dc
# tee
同时输出多个文件
从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
一般情况下用重定向实现,需要同时输出多个文件时可以使用该命令。
-a 或–append 附加到既有文件的后面,而非覆盖它
# tr
替换指定的字符
不指定参数时,即表示替换指定的字符为另一个字符,支持指定的字符集合
- -d, –delete:删除指定的字符
- -s, –squeeze-repeats:缩减连续重复的字符成指定的单个字符
示例
将文件testfile中的小写字母全部转换成大写字母
cat testfile |tr a-z A-Z
或
cat testfile |tr [:lower:] [:upper:]
删除指定的字符:
$ cat t|tr -d 'dv'
# join
文件按行连接
将两个文件中指定栏位相同的行连接起来。即按照两个文件中共同拥有的某一列,将对应的行拼接成一行
注意:在使用 join 之前所处理的文件要事先经过排序
# paste
将多个文件对应行链接在一起
paste [-s][-d <间隔字符>][文件...]
-d<间隔字符>或–delimiters=<间隔字符> 用指定的间隔字符取代跳格字符。
-s 或–serial 串列进行而非平行处理。
[文件…] 指定操作的文件路径
# split
文件切割
该指令将大文件分割成较小的文件,在默认情况下将按照每 1000 行切割成一个小文件
- -<行数> : 指定每多少行切成一个小文件
- -b<字节> : 指定每多少字节切成一个小文件
- -C<字节> : 与参数”-b"相似,但是在切 割时将尽量维持每行的完整性
- [输出文件名] : 设置切割后文件的前置文件名, split 会自动在前置文件名后再加上编号
# xargs
参数代换
不是所有的命令都支持管道,如 ls,对于不支持管道的命令,可以通过 xargs 让其有管道命令的效果
xargs 用作替换工具,读取输入数据重新格式化后输出
# 特殊
# 用户管理
用户管理包括用户与组账号的管理。
在 Unix/Linux 系统中,不论是由本机或是远程登录系统,每个系统都必须拥有一个账号,并且对于不同的系统资源拥有不同的使用权限。
Unix/Linux 系统中的 root 账号通常用于系统的维护和管理,它对 Unix/Linux 操作系统的所有部分具有不受限制的访问权限。
在 Unix/Linux 安装的过程中,系统会自动创建许多用户账号,而这些默认的用户就称为“标准用户”。
在大多数版本的 Unix/Linux 中,都不推荐直接使用 root 账号登录系统。
实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改。
- 用户口令的管理。
- 用户组的管理。
# 用户
# whoami
查看当前用户
查看当前系统当前账号的用户名。可通过 cat /etc/passwd 查看系统用户信息
# who
查看登录用户
who 命令用于查看当前所有登录系统的用户信息
- -m 或 am I 只显示运行 who 命令的用户名、登录终端和登录时间
- -q 或–count 只显示用户的登录账号和登录用户的数量
- -u 在登录时间后显示该用户最后一次操作到当前的时间间隔
- -u 或–heading 显示列标题
# exit
退出登录账户
如果是图形界面,退出当前终端;
如果是使用ssh远程登录,退出登陆账户;
如果是切换后的登陆用户,退出则返回上一个登陆账号。
# useradd
添加用户账号
在 Unix/Linux 中添加用户账号可以使用 adduser 或 useradd 命令,因为 adduser 命令是指向 useradd 命令的一个链接,因此,这两个命令的使用格式完全一样。
useradd [参数] 新建用户账号
- -c comment 指定一段注释性描述。
- -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m 选项,可以创建主目录。
- -g 用户组 指定用户所属的用户组。
- -G 用户组,用户组 指定用户所属的附加组。
- -s Shell 文件 指定用户的登录 Shell。
- -u 用户号 指定用户的用户号,如果同时有-o 选项,则可以重复使用其他用户的标识号。
相关说明:
Linux 每个用户都要有一个主目录,主目录就是第一次登陆系统,用户的默认当前目录(/home/用户);
每一个用户必须有一个主目录,所以用 useradd 创建用户的时候,一定给用户指定一个主目录;
如果创建用户的时候,不指定组名,那么系统会自动创建一个和用户名一样的组名。
若创建用户时未指定家目录,后期可通过 usermod -d /home/abc abc 指定
useradd -d /home/abc abc -m
创建abc用户,如果/home/abc目录不存在,就自动创建这个目录,同时用户属于abc组
useradd -d /home/a a -g test -m
创建一个用户名字叫a,主目录在/home/a,如果主目录不存在,就自动创建主目录,同时用户属于test组
cat /etc/passwd
查看系统当前用户名
useradd -s /bin/sh -g group –G adm,root gem
此命令新建了一个用户gem,该用户的登录Shell是 `/bin/sh`,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。
这里可能新建组:`#groupadd group及groupadd adm`
增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。
Linux 提供了集成的系统管理工具 userconf,它可以用来对用户账号进行统一管理。
# usermod
修改用户
常用的选项包括 -c, -d, -m, -g, -G, -s, -u 以及-o 等 ,这些选项的意义与 useradd 命令中的选项一样,可以为用户指定新的资源值
- usermod -g 用户组 用户名 修改用户所在组
- usermod -d 家目录 用户名 改用户的家目录位置
另外,有些系统可以使用选项:-l 新用户名
这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
例如:
# usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户 sam 的登录 Shell 修改为 ksh,主目录改为/home/z,用户组改为 developer。
# userdel
删除用户: 将/etc/passwd 等系统文件中的该用户记录删除,必要时还删除用户的主目录。
删除 abc 用户,但不会自动删除用户的主目录
userdel [-r] 用户名
-r 用户名 删除用户,同时删除用户的主目录
# passwd
设置用户密码
超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令
passwd [选项] 用户名
- -l 锁定口令,即禁用账号。
- -u 口令解锁。
- -d 使账号无口令。这样用户下一次就不再允许了
- -f 强迫用户下次登录时修改口令。
普通用户修改自己的口令时,passwd 命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。
# su
切换用户
- su 切换到 root 用户
- su root 切换到 root 用户
- su - 切换到 root 用户,同时切换目录到/root
- su - root 切换到 root 用户,同时切换目录到/root
- su 普通用户 切换到普通用户
- su - 普通用户 切换到普通用户,同时切换普通用户所在的目录
su 后面可以加“-”会将当前的工作目录自动转换到切换后的用户主目录
# sudo
以 root 身份执行指令
sudo 命令可以临时获取 root 权限
使用权限:在 /etc/sudoers 中有出现的使用者
sudoers 文件配置语法
user MACHINE=COMMANDS
用户 登录的主机=(可以变换的身份) 可以执行的命令
# 组管理
# groupadd
添加、删除组账号
cat /etc/group 查看用户组
# groupmod
修改用户组的属性
groupmod [选项] 用户组
-g GID 为用户组指定新的组标识号。
-o 与-g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同。
-n 新用户组 将用户组的名字改为新名字
示例
将组group2的组标识号修改为102:
groupmod -g 102 group2
将组group2的标识号改为10000,组名修改为group3:
groupmod –g 10000 -n group3 group2
此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
groupadd group1
# newgrp
如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。
用户可以在登录后,使用命令 newgrp 切换到其他用户组,这个命令的参数就是目的用户组
newgrp root
这条命令将当前用户切换到 root 用户组,前提条件是 root 用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成
# groupdel
删除一个已有的用户组
groupdel 用户组
# 系统管理
# 日期
# cal
查看当前日历
-y 显示整年日历
# date
显示或设置时间
设置时间格式(需要管理员权限)
date [MMDDhhmm[[CC]YY][.ss]] +format
MM 为月,DD 为天,hh 为小时,mm 为分钟;CC 为年前两位,YY 为年的后两位,ss 为秒
显示时间格式(date ‘+%y,%m,%d,%H,%M,%S’)
# 进程
# ps
查看进程信息
- -a 显示终端上的所有进程,包括其他用户的进程
- -u 显示进程的详细状态
- -x 显示没有控制终端的进程
- -w 显示加宽,以便显示更多的信息
- -r 只显示正在运行的进程
常见用法
- ps -e 查看所有进程信息(瞬时的)
- ps -u root -N 查看所有不是 root 运行的进程
- ps ax 显示所有进程状态状态
- ps -ef |grep xxx 显示含有 xxx 的进程
更多命令选项
- ps a 显示现行终端机下的所有程序,包括其他用户的程序。
- ps -A 显示所有程序。
- ps c 列出程序时,显示每个程序真正的指令名称,而不包含路 径,参数或常驻服务的标示。
- ps -e 此参数的效果和指定"A"参数相同。
- ps e 列出程序时,显示每个程序所使用的环境变量。
- ps f 用 ASCII 字符显示树状结构,表达程序间的相互关系。
- ps -H 显示树状结构,表示程序间的相互关系。
- ps -N 显示所有的程序,除了执行 ps 指令终端机下的程序之外。
- ps s 采用程序信号的格式显示程序状况。
- ps u 以用户为主的格式来显示程序状况。
- ps x 显示所有程序,不以终端机来区分。
pstree
以树状图显示进程关系
特别表明在运行的进程:
pstree -apnh //显示进程间的关系
同时显示用户名称:
pstree -u //显示用户名称
# top
动态显示进程
能够在运行后,在指定的时间间隔更新显示信息。-d 参数可以指定显示信息更新的时间间隔
在 top 命令执行后,可以按下按键得到对显示的结果进行排序
- M 根据内存使用量来排序
- P 根据 CPU 占有率来排序
- T 根据进程运行时间的长短来排序
- U 可以根据后面输入的用户名来筛选进程
- K 可以根据后面输入的 PID 来杀死进程。
- q 退出
- h 获得帮助
更高级的命令是 htop,但需要安装
# kill
终止进程
指定进程号的进程,需要配合 ps 使用
信号值从 0 到 15,其中 9 为绝对终止,可以处理一般信号无法终止的进程
kill [-signal] pid
# 电源
# reboot,shutdown,init
-
reboot 重新启动操作系统
-
shutdown –r now 重新启动操作系统,shutdown 会给别的用户提示
-
shutdown -h now 立刻关机,其中 now 相当于时间为 0 的状态
-
shutdown -h XXX 系统在今天的 XXX 会关机
-
shutdown -h +10 系统再过十分钟后自动关机
-
init 0 关机
-
init 6 重启
# 环境
# which
查找$PATH 中设置命令及安装文件目录所在位置
# export
设置或显示环境变量
在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。
export 的效力仅限于该次登陆操作
export [-fnp][变量名称]=[变量设置值]
- -f 代表[变量名称]中为函数名称。
- -n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
- -p 列出所有的 shell 赋予程序的环境变量。
# 磁盘管理
Linux 磁盘管理常用三个命令为 df、du 和 fdisk
- df(英文全称:disk free):列出文件系统的整体磁盘使用量
- du(英文全称:disk used):检查磁盘空间使用量
- fdisk:用于磁盘分区
# 空间查看
# df
检测磁盘空间, 可以显示所有文件系统对节点和磁盘块的使用情况
df [-ahikHTm] [目录或文件名]
- -a 列出所有的文件系统,包括系统特有的 /proc 等文件系统;
- -k 以 KBytes 的容量显示各文件系统;
- -m 以 MBytes 的容量显示各文件系统;
- -h 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
- -H 以 M=1000K 取代 M=1024K 的进位方式;
- -T 显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
- -i 不用硬盘容量,而以 inode 的数量来显示
实例 1
将系统内所有的文件系统列出来!
[root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3823112 5585444 41% /
/dev/hdc3 4956316 141376 4559108 4% /home
/dev/hdc1 101086 11126 84741 12% /boot
tmpfs 371332 0 371332 0% /dev/shm
在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来!
实例 2
将容量结果以易读的容量格式显示出来
[root@www ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /
/dev/hdc3 4.8G 139M 4.4G 4% /home
/dev/hdc1 99M 11M 83M 12% /boot
tmpfs 363M 0 363M 0% /dev/shm
实例 3
将系统内的所有特殊文件格式及名称都列出来
[root@www ~]# df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/hdc2 ext3 9920624 3823112 5585444 41% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devpts devpts 0 0 0 - /dev/pts
/dev/hdc3 ext3 4956316 141376 4559108 4% /home
/dev/hdc1 ext3 101086 11126 84741 12% /boot
tmpfs tmpfs 371332 0 371332 0% /dev/shm
none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs
实例 4
将 /etc 底下的可用的磁盘容量以易读的容量格式显示
[root@www ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /
# du
检测目录所占磁盘空间
统计目录或文件所占磁盘空间的大小,该命令的执行结果与 df 类似,du 更侧重于磁盘的使用状况
du [-ahskm] 目录或文件名
du 没有加任何选项时,只列出当前目录下的所有文件夹容量(包括隐藏文件夹)
- -a 列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
- -h 以人们较易读的容量格式 (G/M) 显示;
- -s 列出总量而已,而不列出每个各别的目录占用容量;
- -S 不包括子目录下的总计,与 -s 有点差别。
- -k 以 KBytes 列出容量显示;
- -m 以 MBytes 列出容量显示;
实例 1
只列出当前目录下的所有文件夹容量(包括隐藏文件夹):
[root@www ~]# du
8 ./test4 <==每个目录都会列出来
8 ./test2
....中间省略....
12 ./.gconfd <==包括隐藏文件的目录
220 . <==这个目录(.)所占用的总量
直接输入 du 没有加任何选项时,则 du 会分析当前所在目录里的子目录所占用的硬盘空间。
实例 2
将文件的容量也列出来
[root@www ~]# du -a
12 ./install.log.syslog <==有文件的列表了
8 ./.bash_logout
8 ./test4
8 ./test2
....中间省略....
12 ./.gconfd
220 .
实例 3
检查根目录底下每个目录所占用的容量
[root@www ~]# du -sm /*
7 /bin
6 /boot
.....中间省略....
0 /proc
.....中间省略....
1 /tmp
3859 /usr <==系统初期最大就是他了啦!
77 /var
通配符 * 来代表每个目录。
与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据。
# 分区
# fdisk
磁盘分区表操作工具
fdisk [-l] 装置名称
-l :输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来
离开 fdisk 时按下 q ,那么所有的动作都不会生效!相反的, 按下 w 就是动作生效的意思
使用 p 可以列出目前这颗磁盘的分割表信息,这个信息的上半部在显示整体磁盘的状态
实例 1
列出所有分区信息 fdisk -l
实例 2
找出你系统中的根目录所在磁盘,并查阅该硬盘内的相关信息
[root@www ~]# df / <==注意:重点在找出磁盘文件名而已
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3823168 5585388 41% /
[root@www ~]# fdisk /dev/hdc <==仔细看,不要加上数字喔!
Command (m for help): <==等待你的输入!
输入 m 后,就会看到底下这些命令介绍
Command (m for help): m <== 输入 m 后,就会看到底下这些命令介绍
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition <==删除一个partition
l list known partition types
m print this menu
n add a new partition <==新增一个partition
o create a new empty DOS partition table
p print the partition table <==在屏幕上显示分割表
q quit without saving changes <==不储存离开fdisk程序
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit <==将刚刚的动作写入分割表
x extra functionality (experts only)
# 维护
# mkfs
磁盘格式化(make filesystem)
mkfs [-t 文件系统格式] 装置文件名
-t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)
查看 mkfs 支持的文件格式:mkfs [tab]
实例 1
查看 mkfs 支持的文件格式
[root@www ~]# mkfs[tab][tab]
mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.msdos mkfs.vfat
按下两个[tab],会发现 mkfs 支持的文件格式如上所示。
实例 2
将分区 /dev/hdc6(可指定你自己的分区) 格式化为 ext3 文件系统:
[root@www ~]# mkfs -t ext3 /dev/hdc6
mke2fs 1.39 (29-May-2006)
Filesystem label= <==这里指的是分割槽的名称(label)
OS type: Linux
Block size=4096 (log=2) <==block 的大小配置为 4K
Fragment size=4096 (log=2)
251392 inodes, 502023 blocks <==由此配置决定的inode/block数量
25101 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=515899392
16 block groups
32768 blocks per group, 32768 fragments per group
15712 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (8192 blocks): done <==有日志记录
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# 这样就创建起来我们所需要的 Ext3 文件系统了!简单明了!
# fsck
磁盘检验
file system check 用来检查和维护不一致的文件系统
若系统掉电或磁盘发生问题,可利用 fsck 命令对文件系统进行检查。
fsck [-t 文件系统] [-ACay] 装置名称
选项与参数:
- -t : 给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数
- -s : 依序一个一个地执行 fsck 的指令来检查
- -A : 对/etc/fstab 中所有列出来的 分区(partition)做检查
- -C : 显示完整的检查进度
- -d : 打印出 e2fsck 的 debug 结果
- -p : 同时有 -A 条件时,同时有多个 fsck 的检查一起执行
- -R : 同时有 -A 条件时,省略 / 不检查
- -V : 详细显示模式
- -a : 如果检查有错则自动修复
- -r : 如果检查有错则由使用者回答是否修复
- -y : 选项指定检测每个文件是自动输入 yes,在不确定那些是不正常的时候,可以执行 # fsck -y 全部检查修复。
实例 1
查看系统有多少文件系统支持的 fsck 命令:
[root@www ~]# fsck[tab][tab]
fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.msdos fsck.vfat
实例 2
强制检测 /dev/hdc6 分区:
[root@www ~]# fsck -C -f -t ext3 /dev/hdc6
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
vbird_logical: 11/251968 files (9.1% non-contiguous), 36926/1004046 blocks
如果没有加上 -f 的选项,则由于这个文件系统不曾出现问题,检查的经过非常快速!若加上 -f 强制检查,才会一项一项的显示过程。
# mount
磁盘挂载与卸除 umount
mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下
-n :不升级 /etc/mtab 情况下卸除
实例 1
用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!
[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6
[root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
.....中间省略.....
/dev/hdc6 1976312 42072 1833836 3% /mnt/hdc6
磁盘卸载命令 umount
语法:
umount [-fn] 装置文件名或挂载点
选项与参数:
- -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
- -n :不升级 /etc/mtab 情况下卸除。
卸载/dev/hdc6
[root@www ~]# umount /dev/hdc6
# 多机交互
# 防火墙
# firewall
firewall-cmd 是 Linux 中专门用于控制防火墙的命令
开放指定 8080+80+3306+端口
- firewall-cmd –zone=public –add-port=6379/tcp –permanent
关闭指定端口
- firewall-cmd –zone=public –remove-port=8080/tcp –permanent
立即生效
- firewall-cmd –reload
查看开放的端口
- firewall-cmd –zone=public –list-ports
# systemctl
systemctl 是管理 Linux 中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作
查看防火墙状态
- systemctl status firewalld、 firewall-cmd –state
暂时关闭防火墙
- systemctl stop firewalld
永久关闭防火墙
- systemctl disable firewalld
开启防火墙
- systemctl start firewalld
# 网络
# netstat
查看网络状态
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
- -a 或–all 显示所有连线中的 Socket。
- -A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
- -c 或–continuous 持续列出网络状态。
- -C 或–cache 显示路由器配置的快取信息。
- -e 或–extend 显示网络其他相关信息。
- -F 或–fib 显示 FIB。
- -g 或–groups 显示多重广播功能群组组员名单。
- -h 或–help 在线帮助。
- -i 或–interfaces 显示网络界面信息表单。
- -l 或–listening 显示监控中的服务器的 Socket。
- -M 或–masquerade 显示伪装的网络连线。
- -n 或–numeric 直接使用 IP 地址,而不通过域名服务器。
- -N 或–netlink 或–symbolic 显示网络硬件外围设备的符号连接名称。
- -o 或–timers 显示计时器。
- -p 或–programs 显示正在使用 Socket 的程序识别码和程序名称。
- -r 或–route 显示 Routing Table。
- -s 或–statistice 显示网络工作信息统计表。
- -t 或–tcp 显示 TCP 传输协议的连线状况。
- -u 或–udp 显示 UDP 传输协议的连线状况。
- -v 或–verbose 显示指令执行过程。
- -V 或–version 显示版本信息。
- -w 或–raw 显示 RAW 传输协议的连线状况。
- -x 或–unix 此参数的效果和指定”-A unix"参数相同。
- –ip 或–inet 此参数的效果和指定”-A inet"参数相同。
# ifconfig
查看或配置网卡信息
# ping
测试远程主机/网络连通性
# hostname
修改主机名&ip 地址
显示主机名:hostname
临时修改:hostname xxx
永久修改: 对于centos系统 vim /etc/sysconfig/network
修改 IP 地址
ifconfig eth0 192.168.12.22(重启后无效)
# 远程连接
# ssh
远程免密登陆
假如 A 要登陆 B, 在 A 上操作:
首先生成密钥对, 再将 A 自己的公钥拷贝并追加到 B 的授权列表文件 authorized_keys 中
ssh-keygen (提示时,直接回车即可)
ssh-copy-id B
# scp
远程文件复制
用于 Linux 之间复制文件和目录,scp 是 secure copy 的缩写是 linux 系统下基于 ssh 登陆进行安全的远程文件
拷贝命令
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
使用 scp 命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则 scp 命令是无法起作用的。
-P 参数来设置命令的端口号:
#scp 命令使用端口号 4588
scp -P 4588 remote@xiaoxiaoming.xyz:/usr/local/sin.sh /home/administrator
从本地复制到远程命令格式:
复制文件
scp local_file remote_username@remote_ip:remote_folder
或者
scp local_file remote_username@remote_ip:remote_file
或者
scp local_file remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file
复制文件夹
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
从远程复制到本地:
scp root@xiaoxiaoming.xyz:/home/root/others/music /home/space/music/1.mp3
scp -r xiaoxiaoming.xyz:/home/root/others/ /home/space/music/
# 软件
# 类型
# 源码包
优点:
开源:如果有足够能力,可以修改源代码
可以自由选择所需的功能
软件是编译安装,所以更加适合自己的系统,更加稳定也效率高
卸载方便:直接删除文件夹
缺点:
安装过程步骤较多,尤其是安装较大的软件集合(如:LAMP 环境搭建),容易出现拼写
错误
编译时间较长,安装比二进制安装时间长
因为是编译安装,安装过程中一旦报错新手很难解决
# rpm 包
二进制包:与源代码区别就是源代码包经过编译成为机器能直接识别的二进制包
优点:
包管理系统简单,只需要几个命令就可以实现包的安装、升级、查询和卸载
安装速度比源码包快
缺点:
经过编译,不可以看到源代码
功能选择不如源代包灵活
依赖性
# 依赖性
默认安装位置
# 管理
# 依赖性问题
推荐下载低版本的
# 查询软件是否安装
使用:
rpm -q 包名
选项:
-q(query) 查询
-a(all) 所有
# YUM
小黄狗
yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。
基于 RPM 包管理,能够从指定的服务器(YUM 服务器, 也就是软件集合, 有软件包索引和依赖关系数据)
自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
方便便捷,依赖自动解决(不用自己去配了)
# 管理
# 查询可用软件列表
yum list
yum search 关键字
# 更新
国内 yum 源
网易(163)yum 源是国内最好的 yum 源之一 ,无论是速度还是软件版本,都非常的不错。
将 yum 源设置为 163 yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到。
首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载对应版本 repo 文件, 放入 /etc/yum.repos.d/
CentOS7 :http://mirrors.163.com/.help/CentOS7-Base-163.repo
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
mv CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
运行以下命令生成缓存
yum clean all
yum makecache
除了网易之外,国内还有其他不错的 yum 源,比如中科大和搜狐。
中科大的 yum 源,安装方法查看:https://lug.ustc.edu.cn/wiki/mirrors/help/centos
sohu 的 yum 源安装方法查看: http://mirrors.sohu.com/help/centos.html
优先选择哪个 YUM 源?(选做)
# 命令
# yum
yum [options] [command] [package ...]
- options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为"yes”),-q(不显示安装的过程)等
等。 - command:要进行的操作。
- package:操作的对象。
实例:
-
列出所有可更新的软件清单命令: yum check-update
-
更新所有软件命令: yum update
-
仅安装指定的软件命令: yum install <package_name>
-
仅更新指定的软件命令: yum update <package_name>
-
显示包信息: yum info <package_name>
-
列出所有可安裝的软件清单命令: yum list
-
删除软件包命令: yum remove <package_name> (会同时卸载依赖)
-
查找软件包 命令: yum search
-
清除缓存命令:
yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers
# 安装
==yum 会自动安装依赖,很方便==
yum -y install 包名
选项:
install 安装
-y 自动回答yes
# 升级
此时注意如果不加包名:会出现把所有软件包都升级包括 Linux 内核,但是 Linux 升级完成后需要在本地进行配置,如果是远程服务器管理的话,你会出现==服务器永远启动不了==
yum -y updata 包名
选项:
updata 升级
-y 自动回答yes
# 卸载
==yum 卸载会把依赖也卸载,要注意==
yum -y remove 包名
选项:
remove 卸载
-y 自动回答yes
# RPM
Red Hat 公司随 Redhat Linux 推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装
可以看到 软件名-版本号-适应硬件架构
- noarch 适合任何版本
- X86/64
RPM 默认安装路径:
RPM 包默认安装路径 | 文件含义 |
---|---|
/etc | 配置文件安装目录 |
/usr/bin | 可执行的命令安装目录 |
/usr/lib | 程序所使用的函数库保存位置 |
/usr/share/doc | 基本的软件使用手册保存位置 |
usr/share/man | 帮助文件保存位置 |
# 管理
# 命令
- rpm -ivh <rpm 包名> 安装软件
- rpm -e <rpm 包名> 卸载安装
- rpm -qi <rpm 包名> 显示软件安装信息
- rpm -qa | grep xxx 查询软件是否安装(包括相关依赖)
- rpm -Uvh <rpm 包名> 升级一个 rpm
具体参数详解:
-
-i, –install 安装包
-
-v, –verbose 列出更多详细信息,安装进度
-
-h, –hash 安装时列出 hash 标记 (与 -v 连用)
-
-e, –erase 卸载安装包
-
-U, –upgrade=+ 升级包
- –replacepkge 无论软件包是否已被安装,都强行安装软件包
- –test 安装测试,并不实际安装
- –nodeps 忽略软件包的依赖关系强行安装(其他也可用)
- –force 忽略软件包及文件的冲突
-
-q, –query 查询
- -a, –all 查询/校验所有的安装包
- -p, –package 查询/校验一个安装文件
- -l, –list 列出安装文件
- -d, –docfiles 列出所有文档文件
- -f, –file 查询/校验安装包中所包含的文件
# 压缩包
# 管理
# 解压后直接使用
解压完最好先看 README.md
使用对应压缩命令,把软件解压后直接使用
# 命令
# 示例
安装源码包前一定要有==gcc 编译器==
阅读下面 yum 安装 gcc 很方便。
一起输入命令,回车执行命令
>1
.tar压缩格式
压缩:
tar 选项[-zcf] [压缩后文件名] [目录]
-c 打包
-v 显示详细信息
-f 指定文件名
-z 打包同时压缩
解压:
tar -zxvf 包名
-x 解包
-v 显示详细信息
-f 指定解压文件
-z 解压缩
>2
.zip压缩格式
压缩:
zip 选项[-r] [压缩后文件名] [文件或目录]
-r 压缩目录
解压:
基本格式:unzip [选项] file[.zip]
-Z 以形如 ls -l 的格式显示目标文件内容
-Z1 仅显示压缩文件内容的文件名
-l 显示压缩文件中包括时间、占用空间和文件名等信息
-t 在内存中解压文件并进行文件的完整性校验(CRC校验)
-f 将磁盘上已经存在且内容新于对应磁盘文件的压缩内容解压出来
-n 解压缩时不覆盖已存在的文件(而是跳过)
-q 安静模式,仅解压缩而不输出详细信息
-d dir 将文件解压至dir指定的文件夹中
>3
.bz2压缩格式
压缩:
bzip2 选项[-k] [文件]
-k 产生压缩文件后保留原文件
解压:
bzip2 选项[-k] [文件]
指令选项:(默认功能为压缩)
-k 产生压缩文件后
-c 将输出写至标准输出
-d 进行解压操作
-v 输出压缩/解压的文件名和压缩比等信息
-k 在压缩/解压过程中保留原文件
-digit digit部分为数字(1-9),代表压缩速度,digit越小,
则压缩速度越快,但压缩效果越差,digit越大,
则压缩速度越慢,压缩效果越好。默认为6.
>4
.gz压缩格式
基础格式: gzip [Options] file1 file2 file3
指令选项:(默认功能为压缩)
-c 将输出写至标准输出,并保持原文件不变
-d 进行解压操作
-v 输出压缩/解压的文件名和压缩比等信息
-digit digit部分为数字(1-9),代表压缩速度,digit越小,
则压缩速度越快,但压缩效果越差,
digit越大,则压缩速度越慢,压缩效果越好。
默认为6.
# IDEA 安装 HW
压缩包或可执行文件安装
例如安装压缩包: idea.tar.gz
时候的操作
mkdir -p /opt/idea && tar -zxvf ./idea.tar.gz -C /opt/idea
到/opt/idea 启动!
./idea.sh
==配置 IDEA 环境变量==
目的是无论终端在哪个工作目录,都可以通过./idea.sh 指令启动 IDEA,不用进入到 IDEA 的环境目录了。
我们先假设我们解压后的目录为 idea-IC-213.6777.52(这个文件名与你下载的 IDEA 版本有关系,可能跟我的不一致,自行替换为自己的目录),查看这个解压目录名称的指令为:
ls /opt/idea
idea-IU-232.9921.47
记录下这个文件名,然后将其添加至环境变量中:
我们通过 vim 指令对环境变量文件进行编辑:
vim ~/.bashrc
然后将如下的内容添加至~/.bashrc
文件的最后一行( !!!注意替换掉对应的目录名!!! )。
export IDEA_HOME=/usr/local/src/idea/idea-IU-232.9921.47
export PATH=:$PATH:${IDEA_HOME}/bin
通过:wq
进行保存即可
接着我们让系统重新加载我们修改好的环境变量:
source ~/.bashrc
在任意目录下输入idea.sh
启动 IDEA 图形化界面了
看来 Idea 需要跟随终端进行啊
# VIM
# 注意
惊叹号 (!) 常常具有『强制』的意思
首先,不要相信 vim 是地表最强编辑器之类的鬼话。vim 在控制台应用里有一定应用,但其产生的 swp 文件可能造成信息泄露,所以不管是在开发环境还是在生产环境大量使用 vim 都是强烈不建议的,投入大量时间研究其插件体系也是极大的浪费。
# 模式
命令模式 command-mode 用于输入指令,如:保存、运行、切换标签、切割屏幕等
插入模式 insert-mode 也即编辑模式,用于编辑文本
可视模式 visual-mode 相当于高亮选取文本后的正常模式
正常模式 normal-mode 用于查看文本,也可复制、粘贴、撤销、重做等, 也可称为底线命令模式(Last line mode)
命令
用户刚刚启动 vi/vim,便进入了命令模式。 任何时候,不管用户处于何种模式,只要按一下 ESC 键,即可使 Vi 进入命令模式;
此状态下敲击键盘动作会被 Vim 识别为命令,输入 : 可切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:按下 i,切换到输入模式
输入
在命令模式下输入插入命令 i、附加命令 a 、打开命令 o、修改命令 c、取代命令 r 或替换命令 s 都可以进入文本输入模式。
在该模式下,用户输入的任何字符都被 Vi 当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键 ESC 即可。
底行
在命令模式下按下:(英文冒号)就进入了底行命令模式。
==按:冒号即可进入 last line mode==
:set nu 列出行号
:set nonu 取消行号
:#7 跳到文件中的第7行
/keyword 查找字符 按n向下
?keyword 查找字符 按N向下
:n1,n2/word1/word2/gc 替换指定范围单词,c表示提示
:w 保存文件
:w filename 以指定的文件名另存
:n1,n2 w [filename] 将 n1 到 n2行另存
:r [filename] 读入另一个文件加到光标所在行后面
:! ls /home 在vi当中察看ls输出信息!
:q 离开vi
:wq 和 :ZZ 和 :x 保存并退出vi
! 强制执行
:% s/^/#/g 来在全部内容的行首添加 # 号注释
:1,10 s/^/#/g 在1~10 行首添加 # 号注释
==从 command mode 进入 Insert mode==
按i在当前位置编辑
按a在当前位置的下一个字符编辑
按o插入新行,从行首开始编辑
按R(Replace mode):R会一直取代光标所在的文字,直到按下 ESC为止;(常用)
==按 ESC 键退回 command mode==
h←j↓k↑l→ 前面加数字移动指定的行数或字符数
# 直属
翻页 bu 上下整页,ud 上下半页
ctrl+b:上移一页
ctrl+f:下移一页
ctrl+u:上移半页
ctrl+d:下移半页
行定位
Xgg 或 XG:定位第 X 行首字符
G:移动到文章的最后
7H:当前屏幕的第 7 行行首
M:当前屏幕中间行的行首
7L:当前屏幕的倒数第 7 行行首
当前行定位
$:移动到光标所在行的“行尾”
0 或^:移动到光标所在行的“行首”
w:光标跳到下个单词的开头
e:光标跳到下个单词的字尾
b:光标回到上个单词的开头
编辑
x:剪切当前字符
7x:剪切从当前位置起 7 个字符
大写的 X,表示从前面一个字符开始往前计算
dd:剪切光标所在行。
7dd:从光标所在行开始剪切 7 行
d7G 删除光标所在到第 7 行的所有数据
yw:复制当前单词
7yw:复制从当前位置起 7 个单词
yy:复制当前行
6yy:从当前行起向下复制 6 行
y7G 复制游标所在列到第 7 列的所有数据
p:粘贴
u:撤销
ctrl+r:取消撤销
cw:删除当前单词(从光标位置开始计算),并进入插入模式
c7w:删除 7 个单词并进入插入模式
多行编辑
按 ctrl+V 进入块模式,上下键选中快,按大写 G 选择到末尾,上下左右键移动选择位置
按大写 I 进去编辑模式,输入要插入的字符,编辑完成按 ESC 退出
选中要替换的字符后,按 c 键全部会删除,然后输入要插入的字符,编辑完成按 ESC 退出
按 shift+V 可进入行模式,对指定行操作
# 文件
vim filename 打开或新建一个文件,并将光标置于第一行的首部
vim -r filename 恢复上次 vim 打开时崩溃的文件
vim -R filename 把指定的文件以只读方式放入 Vim 编辑器中
vim + filename 打开文件,并将光标置于最后一行的首部
vi +n filename 打开文件,并将光标置于第 n 行的首部
vi +/pattern filename 打幵文件,并将光标置于第一个与 pattern 匹配的位置
vi -c command filename 在对文件进行编辑前,先执行指定的命令
# 插入模式
i 在当前光标所在位置插入,光标后的文本相应向右移动
I 在光标所在行的行首插入,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令
o 在光标所在行的下插入新的一行。光标停在空行首,等待输入文本
O 在光标所在行的上插入新的一行。光标停在空行的行首,等待输入文本
a 在当前光标所在位置之后插入
A 在光标所在行的行尾插入,相当于光标移动到行尾再执行 a 命令
esc 键 退出编辑模式
r 替换只会取代光标所在的那一个字符一次
R 替换会一直取代光标所在的文字,直到按下 ESC 为止
# 命令模式
# 编辑命令
快捷键 | 功能描述 |
---|---|
↑ 或 ctr + p | 上一条命令 |
↓ 或 ctr + n | 下一条命令 |
ctr + b | 移动到命令行开头 |
ctr + e | 移动到命令行结尾 |
ctr + ← | 向左一个单词 |
ctr + → | 向右一个单词 |
# 移动光标
-
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
-
向下移动 30 行 “30j” 或 “30↓” 的组合按键
-
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
-
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n 表示空格光标向右移动这一行的 n 个字符 -
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
-
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个文档的最后一行(常用) -
nG n 为数字。移动到这个文件的第 n 行(可配合 :set nu)
gg 移动到这个文档的第一行,相当于 1G
n n 为数字。光标向下移动 n 行(常用)
jkhl 基本上下左右
gg 光标移动到文档首行
G 光标移动到文档尾行
^或* 光标移动到行首第一个非空字符
home 键或 0 或者 g0 光标移动到行首第一个字符
g* 光标移动到行尾最后一个非空字符
end 或或者 g 或者 g 或者 g 光标移动到行尾最后一个字符
gm 光标移动到当前行中间处
b/B 光标向前移动一个单词(大写忽略/-等等特殊字符)
w/W 光标向后移动一个单词(大写忽略/-等等特殊字符)
e/E 移到单词结尾(大写忽略/-等等特殊字符)
ctrl+b 或 pageUp 键 翻屏操作,向上翻
ctrl+f 或 pageDn 键 翻屏操作,向下翻
数字+G 快速将光标移动到指定行
`. 移动到上次编辑处
数字+上下方向键 以当前光标为准,向上/下移动 n 行
数字+左右方向键 以当前光标为准,向左/右移动 n 个字符
H 移动到屏幕顶部
M 移动到屏幕中间
L 移动到屏幕尾部
z+Enter 键 当前行在屏幕顶部
z+ . 当前行在屏幕中间
z+ - 当前行在屏幕底部
shift+6 光标移动到行首
shift+4 光标移动到行尾
- 移动到上一行第一个非空字符
+ 移动到下一行第一个非空字符
) 向前移动一个句子
( 向后移动一个句子
} 向前移动一个段落
{ 向前移动一个段落
count l 移动到 count 列
counth 向左移动 count 字符
countl 向右移动 count 字符
countgo 移动到 count 字符
# 选中内容
v | 进行字符选中 |
---|---|
V 或 shift+v | 进行行选中 |
gv | 选中上一次选择的内容 |
o | 光标移动到选中内容另一处结尾 |
O | 光标移动到选中内容另一处角落 |
ctr + V | 进行块选中 |
# 字符转换
~ | 转换大小写 |
---|---|
u | 变成小写 |
U | 变成大写 |
# 删除
-
x, X x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace])
nx n 为数字,连续向后删除 n 个字符。例如 10x 表示连续删除 10 个字符
-
dd 删除光标所在的一整行(常用)
D 删除光标位置到行尾的内容,删除之后,下一行不上移
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行
-
d1G 删除光标所在行到首行的所有数据
dG 删除光标所在行到最后一行的所有数据
d$ 删除光标所在位置到该行的最后一个字符
d0 删除光标所在位置到该行的最前面一个字符
-
:a1,a2d 删除从 a1 行到 a2 行的文本内容
# 撤销&复原&重复
- u 撤销操作,相对于普通编辑器里面的 ctrl+z
- Ctrl+r 恢复操作,相对于普通编辑器里面的 ctrl+y
- . 就是小数点!可重复前一个动作
- U(大写) 撤销所有编辑
# 剪切&复制&粘贴
- yy 复制光标所在行
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行 - y1G 复制光标所在行到第一行的所有数据
yG 复制光标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据 - p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行!
- dd 剪切光标所在行
数字+dd 以光标所在行为准(包含当前行),向下剪切指定行数
D 剪切光标所在行
合成行
J: 将光标所在行与下一行的数据结合成同一行
搜索
-
/word 向光标之下寻找一个名称为 word 的字符串。
?word 向光标之上寻找一个字符串名称为 word 的字符串。
-
n 代表重复前一个搜寻的动作,根据前面输入的/word 还是?word 向下或向上搜索下一个匹配的字符串。
N 表示反向搜索,与 n 的搜索方向相反。
替换
:n1,n2s/word1/word2/g 在第 n1 与 n2 行之间寻找 word1 并替换为 word2
:1,$s/word1/word2/g $表示最后一行,%s 表示所有行。
或
:%s/word1/word2/g
g -> gc gc 中的 c 表示取代前显示提示字符给用户确认 (confirm) !
# ==末行模式==
# 文件
:w 保存编辑数据
:w! 若文件属性为『只读』时,强制写入该文件(和权限有关)
:q 离开
:q! 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存文件
:wq 储存后离开
:wq! 强制储存后离开
ZZ 若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:w [filename] 另存为到 filename 文件
:r [filename] 将另一个文件『filename』的数据加到光标所在行后面
x! 保存文本,并退出 Vim 编辑器
:n1,n2 w [filename] 将 n1 到 n2 行的内容储存成 filename 这个文件。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!
:set nu 会在每一行的前缀显示该行的行号
:set nonu 取 取消行号显示
查看当前已经打开的所有文件::files
(%a 表示激活状态,#表示上一个打开的文件)
切换到指定文件::open 文件名
切换到上一个文(back previous)::bp
切换到下一个文件(back next)::bn
# 查找
“/关键词”
用N
、n
可以切换上下结果;输入nohl
,可以取消高亮
快捷键 | 功能描述 |
---|---|
/abc | 从光标所在位置向前查找字符串 abc |
/^abc | 查找以 abc 为行首的行 |
/abc$ | 查找以 abc 为行尾的行 |
?abc | 从光标所在位置向后查找字符串 abc |
n 或; | 向同一方向重复上次的查找指令 |
N 或, | 向相反方向重复上次的查找指定 |
# 替换
r 替换光标所在位置的字符
R 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束
:s/a1/a2 替换当前光标所在行第一处符合条件的内容
:s/a1/a2/g 替换当前光标所在行所有的 a1 都用 a2 替换
:%s/a1/a2 替换所有行中,第一处符合条件的内容
:%s/a1/a2/g 替换所有行中,所有符合条件的内容
:n1,n2 s/a1/a2 将文件中 n1 到 n2 行中第一处 a1 都用 a2 替换
:n1,n2 s/a1/a2/g 将文件中 n1 到 n2 行中所有 a1 都用 a2 替换
# 可视模式
可视模式下,选中的区域是由两个端点来界定的(一个在左上角,一个在右下角),在默认情况下只可以控制右下角的端点,而使用 o 按键则可以在左上角和右下角之间切换控制端点
v 进入字符可视化模式: 文本选择是以字符为单位的。
V 进入行可视化模式: 文本选择是以行为单位的。
Ctrl+v 进入块可视化模式 : 选择一个矩形内的文本。
-
A 在选定的部分后面插入内容
I 在选定的部分前面插入内容
d 删除选定的部分
c 删除选定的部分并进入插入模式(有批量替换效果)
r 把选定的部分全部替换为指定的单个字符 -
>> 向右缩进一个单位,更适合行可视化模式
-
<< 向左缩进一个单位,更适合行可视化模式
-
gu 选中区域转为小写
gU 选中区域转为大写
g~ 大小写互调
# 拓展操作
# 代码颜色显示
:syntax on/off
# 内置计算器
a.进入编辑模式
b.按“ctrl+r,光标变成引号,,输入=,光标转到最后一行
c.输入需要计算的内容,按下 enter 后,计算结果回替代上一步中的引号,光标恢复
# 配置
a.文件打开时,末行模式下输入的配置为临时配置,关闭文件后配置无效
b.修改个人配置文件,可以永久保存个人配置(~/.vimrc,如果没有可以自行创建)
c.修改全局配置文件,对每个用户生效(vim 自带,/etc/vimrc)
注:个人配置文件优先级更高,当个人配置和全局配置发生冲突时,系统以当前用户的个人配置文件为准
# 异常退出
在编辑文件后,未正常保存退出时,会产生异常退出交换文件(.原文件名.swp)
将交换文件删除后,再次打开文件时,无提示:“#rm -f .原文件名.swp”
# 别名机制
自定义指令
Linux 中,存在一个别名映射文件: ~/.bashrc
修改文件内容,可以自定义指令,重新登录账号后生效
# 文件快捷方式
对于深层文件,可以创建文件快捷方式,便于后续操作:#ln -s 源路径 新路径
# 退出方式
(1)在 vim 中退出文件编辑模式,可以使用:q 或者:wq
(2)建议使用:x:使用效果等同于 wq,如果文件有改动则先保存后退出;但是如果文件没有做修改,会直接退出,不会修改文件更新时间,避免用户混淆文件的修改时间