linux 教程 01 新手体验
常用命令
echo 命令
echo 命令用于在终端输出字符串或变量提取后的值,格式为 “echo [字符串 | $变量]”。
例如,把指定字符串 “hello linux” 输出到终端屏幕的命令为:
1 | echo hello linux |
下面,我们使用 “$变量” 的方式提取变量 SHELL 的值,并将其输出到屏幕上:
1 | echo $SHELL |
echo 输出空格
1 | echo " " |
date 命令
date 命令用于显示及设置系统的时间或日期,格式为 “date [选项] [+指定的格式]”。
只需在强大的 date 命令中输入以 “+” 号开头的参数,即可按照指定格式来输出系统的时间或日期,这样在日常工作时便可以把备份数据的命令与指定格式输出的时间信息结合到一起。例如,把打包后的文件自动按照“年-月-日”的格式打包成 “backup-2017-9-1.tar.gz”,用户只需要看一眼文件名称就能大概了解到每个文件的备份时间了。date 命令中常见的参数格式及作用如表所示。
按照默认格式查看当前系统时间的 date 命令如下所示:
1 | date |
Thu May 11 10:54:06 CST 2023
按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的 date 命令
1 | date "+%Y-%m-%d %H:%M:%S" |
将系统的当前时间设置为 2017年9月1日8点30分的 date 命令如下所示:
1 | date -s "20170901 8:30:00" |
date 命令中的参数 %j 可用来查看今天是当年中的第几天。
1 | date "+%j" |
1、输出当前年月日
echo $(date +%F)
2022-12-13
2、输出当前时间(时分)
echo $(date +%R)
09:59
3、输出当前时间(时分秒)
echo $(date +%T)
09:59:13
4、输出星期
echo $(date +%A)
Tuesday
5、组合输出日期时间
5.1 输出年月日
echo $(date +%Y/%m/%d)
2022/12/13
其中
%Y参数: 年
%m参数: 月
%d参数: 日
5.2 输出时分秒
echo $(date +%H:%M:%S)
09:59:40
其中
%H参数: 时
%M参数: 分
%S参数: 秒
5.3 输出年月日时分秒
echo $(date +%F%n%T)
2022-12-13 09:59:52
%n参数: 空格
%F参数: 年月日
%T参数: 时分秒
reboot 命令
reboot 命令用于重启系统,其格式为 reboot。
由于重启计算机这种操作会涉及硬件资源的管理权限,因此默认只能使用 root 管理员来重启。‘
poweroff 命令
poweroff 命令用于关闭系统。
该命令与 reboot 命令相同,都会涉及硬件资源的管理权限,因此默认只有 root 管理员才可以关闭电脑.
wget 命令
wget 命令用于在终端中下载网络文件,格式为 “wget [参数] 下载地址”。
ps 命令
ps 命令用于查看系统中的进程状态,格式为“ps [参数]”。
估计读者在第一次执行这个命令时都要惊呆一下—怎么会有这么多输出值,这可怎么看得过来?其实,刘遄老师通常会将 ps 命令与第 3 章的管道符技术搭配使用,用来抓取与某个指定服务进程相对应的 PID 号码。
Linux 系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在 Linux 系统中,有 5 种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。
R(运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
T(停止):进程收到停止信号后停止运行。
如前面所提到的,在 Linux 系统中的命令参数有长短格式之分,长格式和长格式之间不能合并,长格式和短格式之间也不能合并,但短格式和短格式之间是可以合并的,合并后仅保留一个-(减号)即可。另外 ps 命令允许用于用户不强制加上-(减号),因此也可直接写成 ps aux 的样子。
top 命令
top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。
top 命令相当强大,能够动态地查看系统运维状态,完全将它看作 Linux 中的“强化版的 Windows 任务管理器”。
pidof 命令
pidof 命令用于查询某个指定服务进程的 PID 值,格式为 “pidof [参数] [服务名称]”。
每个进程的进程号码值(PID)是唯一的,因此可以通过 PID 来区分不同的进程。例如,可以使用如下命令来查询本机上 sshd 服务程序的 PID:
1 | pidof sshd |
kill 命令
kill 命令用于终止某个指定 PID 的服务进程,格式为 “kill [参数] [进程PID]”。
接下来,我们使用kill命令把上面用pidof命令查询到的PID所代表的进程终止掉,其命令如下所示。这种操作的效果等同于强制停止sshd服务。
1 | [root@linuxprobe ~]# kill 2156 |
killall 命令
killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [服务名称]”。
通常来讲,复杂软件的服务程序会有多个进程协同为用户提供服务,如果逐个去结束这些进程会比较麻烦,此时可以使用 killall 命令来批量结束某个服务程序带有的全部进程。下面以 httpd 服务程序为例,来结束其全部进程。由于 RHEL7 系统默认没有安装 httpd 服务程序,因此大家此时只需看操作过程和输出结果即可,等学习了相关内容之后再来实践。
1 | [root@linuxprobe ~]# pidof httpd |
如果我们在系统终端中执行一个命令后想立即停止它,可以同时按下 Ctrl + C 组合键(生产环境中比较常用的一个快捷键),这样将立即终止该命令的进程。或者,如果有些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个 & 符号,这样命令将进入系统后台来执行。
系统状态检测命令
接下来会逐个讲解与网卡网络、系统内核、系统负载、内存使用情况、当前启用终端数量、历史登录记录、命令执行记录以及救援诊断等相关命令的使用方法。
ifconfig 命令
ifconfig
命令用于获取网卡配置与网络状态等信息,格式为 “ifconfig [网络设备] [参数]”。
使用 ifconfig 命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet 参数后面的IP地址、ether 参数后面的网卡物理地址(又称为MAC地址),以及 RX、TX 的接收数据包与发送数据包的个数及累计流量(即下面加粗的信息内容):
uname 命令
uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。
在使用 uname 命令时,一般会固定搭配上-a参数来完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
[root@linuxprobe ~]# uname -a
1 | Linux linuxprobe.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux |
顺带一提,如果要查看当前系统版本的详细信息,则需要查看 redhat-release 文件,其命令以及相应的结果如下:
1 | [root@linuxprobe ~]# cat /etc/redhat-release |
uptime 命令
uptime 用于查看系统的负载信息,格式为 uptime。
uptime 命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近 1 分钟、5 分钟、15 分钟内的压力情况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过 1,在生产环境中不要超过 5。
1 | [root@linuxprobe ~]# uptime |
free 命令
free 用于显示当前系统中内存的使用量信息,格式为“free [-h]”。
为了保证 Linux 系统不会因资源耗尽而突然宕机,运维人员需要时刻关注内存的使用量。在使用 free 命令时,可以结合使用 -h 参数以更人性化的方式输出当前内存的实时使用量信息。
who 命令
who 用于查看当前登入主机的用户终端信息,格式为 “who [参数]”。
这三个简单的字母可以快速显示出所有正在登录本机的用户的名称以及他们正在开启的终端信息。
last 命令
last 命令用于查看所有系统的登录记录,格式为 “last [参数]”。
使用 last 命令可以查看本机的登录记录。但是,由于这些信息都是以日志文件的形式保存在系统中,因此黑客可以很容易地对内容进行篡改。千万不要单纯以该命令的输出信息而判断系统有无被恶意入侵!
目录操作
创建目录
使用 mkdir 命令创建目录
mkdir $HOME/testFolder
使用 cd 命令切换目录
cd $HOME/testFolder
移动 mv
使用 mv 命令移动目录 mv $HOME/testFolder /var/tmp
移除 rm
使用 rm -rf 命令删除目录 rm -rf /var/tmp/testFolder
查看目录下的文件
使用 ls 命令查看 /etc 目录下所有文件和文件夹 ls /etc
文件操作
创建文件
使用 touch 命令创建文件
touch ~/testFile
复制文件
使用 cp 命令复制文件
cp ~/testFile ~/testNewFile
删除文件
使用 rm 命令删除文件, 输入 y 后回车确认删除
rm ~/testFile
查看文件内容
使用 cat 命令查看 .bash_history 文件内容
cat ~/.bash_history
过滤, 管道与重定向
过滤
- 过滤出 /etc/passwd 文件中包含 root 的记录
1 | grep 'root' /etc/passwd |
- 递归地过滤出 /var/log/ 目录中包含 linux 的记录
1 | grep -r 'linux' /var/log/ |
管道
简单来说, Linux 中管道的作用是将上一个命令的输出作为下一个命令的输入, 像 pipe 一样将各个命令串联起来执行, 管道的操作符是 |
比如, 我们可以将 cat 和 grep 两个命令用管道组合在一起
1 | cat /etc/passwd | grep 'root' |
过滤出 /etc 目录中名字包含 ssh 的目录(不包括子目录)
1 | ls /etc | grep 'ssh' |
重定向
可以使用 > 或 < 将命令的输出重定向到一个文件中
echo 'Hello World' > ~/test.txt
运维常用命令
ping 命令
对 cloud.tencent.com 发送 4 个 ping 包, 检查与其是否联通
ping -c 4 cloud.tencent.com
netstat 命令
netstat 命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等
netstat -atunlp,各参数含义如下:
-t : 指明显示 TCP 端口
-u : 指明显示 UDP 端口
-l : 仅显示监听套接字(LISTEN 状态的套接字)
-p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序
-n : 不进行 DNS 解析
-a 显示所有连接的端口
列出所有处于监听状态的 tcp 端口 netstat -lt
查看所有的端口信息, 包括 PID 和进程名称 netstat -tulpn
ps 命令
过滤得到当前系统中的 ssh 进程信息
ps aux | grep 'ssh'
记录
Linux 配置 DNS
1、编辑 DNS 配置文件
vim /etc/resolv.conf
2、添加 DNS 配置信息:
1 | nameserver 114.114.114.114 |
3、然后执行重启
systemctl restart network
权限管理
whoami
将输出当前当前伪终端的登录用户名
who am i
则会输出三列
- 第一列表示打开当前伪终端的登录用户名(要查看当前登录用户的用户名,去掉空格直接使用 whoami 即可);
- 第二列的 pts/0 中 pts 表示伪终端,所谓伪是相对于 /dev/tty 设备而言的,还记得上一节讲终端时的那七个使用 [Ctrl]+[Alt]+[F1]~[F7] 进行切换的 /dev/tty 设备么,这是“真终端”,伪终端就是当你在图形用户界面使用 /dev/tty7 时每打开一个终端就会产生一个伪终端,pts/0 后面那个数字就表示打开的伪终端序号,你可以尝试再打开一个终端,然后在里面输入 who am i,看第二列就变成 pts/1 了;
- 第三列则表示当前伪终端的启动时间。
who 命令其它常用参数
参数 说明
1 | -a 打印能打印的全部 |
用户和组
创建用户 sudo adduser zhangsan
设置密码 sudo passwd 123456
查看用户的所在用户组 groups gp123
其中冒号之前表示用户,后面表示该用户所属的用户组。这里可以看到 shiyanlou 用户属于 shiyanlou 用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组(差不多就相当于家长的意思)。
默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入 sudo 用户组从而获取 root 权限
使得该用户获得 root 组权限
1 | sudo usermod -G sudo zhangsan |
删除用户和用户组
1 | sudo deluser likai --remove-home |
注:使用 --remove-home 参数在删除用户时候会一并将该用户的工作目录一并删除。如果不使用那么系统会自动在 /home 目录为该用户保留工作目录。
su,su- 与 sudo 的区别
su <user>
可以切换到用户 user,执行时需要输入目标用户的密码sudo <cmd>
可以以特权级别运行 cmd 命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码。su - <user>
命令也是切换用户,但是同时用户的环境变量和工作目录也会跟着改变成目标用户所对应的。
文件权限
ls -lh
查看(-h 便于人类可阅读)文件大小ls -a
显示除了 .(当前目录)和 …(上一级目录)之外的所有文件,包括隐藏文件(Linux 下以 . 开头的文件为隐藏文件)。ls -asSh
显示所有文件大小,并以普通人类能看懂的方式呈现
其中小 s 为显示文件大小,大 S 为按文件大小排序,-h 便于人类可阅读。
若需要知道如何按其它方式排序,可以使用 man ls 命令查询。
变更文件所有者
使用的是 chown
命令, 使用以下命令变更文件所有者为 shiyanlou。
sudo chown shiyanlou iphone13
修改文件权限
方式一: 直接指定
1 | chmod 600 iphone11 |
方式二: 加减权限
1 | chmod 600 iphone11 |
adduser 和 useradd 的区别是什么
答:useradd 只创建用户,不会创建用户密码和工作目录,创建完了需要使用 passwd <username>
去设置新用户的密码。
adduser 在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。
其实 useradd、userdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作。
参考
Linux 基础入门(新版)_Linux - 实验楼
https://www.shiyanlou.com/courses/1
刘瑞老师 《Linux就该这么学》
https://www.linuxprobe.com/chapter-00.html
云服务器 ECS 使用手册
https://help.aliyun.com/product/25365.html