Linux 入门

239 阅读8分钟

Unix,Posix,Linux 有什么区别?

Unix 是比较早期是一个操作系统,但是是商业化的,并不是开源免费的。Posix 是一套操作系统标准接口定义,如果用 Java 来类比的话,可以写为 class Linux implements Posix,那 Linux 是一个免费开源的基于 Posix 标准的操作系统。我们熟悉的 MacOS 也可以想象成是 class MacOS implements Posix。由于 Linux 和 MacOS 遵循一套标准,所以开发人员会觉得 MacOS 比较友好。

ls 结果中类似 drwxr-xr-x 的字符串是什么含义?

这个字符串的位数是固定的,每位的作用也是固定的,第一位 d 表示文件类型,可以是 d 或者是 -,d 是文件夹,- 是文件,其他还有几种类型。后面的每三位为一组,分别是所有者的权限,用户组的权限,其他人的权限。 rwx 分别代表读、写、执行。有一个比较特殊的点:使用 ls -al 可以看到表示当前目录和上级目录的 ...,他们的也有读、写、执行这些权限,那对于一个文件夹来说,读表示可以浏览目录文件内容,执行表示可以进入这个目录。

终端中的 [zihao@localhost ~]$ 是什么意思?

这个字符串是命令行提示字符串zihao 表示当前登录的用户名,@ 是分隔符,localhost 是当前计算机的名称,~ 表示当前路径,~ 就表示 Linux 系统中用户的 “家” 目录。$ 表示当前是普通用户,如果是 root 的话,则会显示 #

image.png

  • whoami 可以获取当前用户名。
  • hostname 可以获取当前计算机名称。

cat, less, more 有什么区别?

cat 会把文件内容全部显示出来,而 less 和 more 则会分页展示,更适合浏览内容较多的文件,less 是 more 的加强版,所以我们现在不需要关心 more,在文件内容较多的情况下,直接使用 less 即可。

less 的快捷键:

  1. 空格键:前进一页;b 键:后退一页
  2. 回车键:前进一行;y 键:后退一行
  3. d 键:前进半页;u 键:后退半页
  4. q 键:退出
  5. = 键:显示当前所处文件位置,比如第几行
  6. / 键:进入搜索模式,按 n 键跳到下一个结果,按 shift-n 键返回上一个搜索结果

head 和 tail 有什么区别?

head 用来显示文件的开头几行,tail 命令用来显示文件的最后几行,两个命令都可以使用 -n 5 参数来表示具体显示的行数。不过这不是 tail 命令的亮点,-f 参数可以实时追踪文件的更新,即想要查看那种会不停被写入的日志文件的场景。

文件的硬链接和软链接有什么区别?

  • 硬链接:让两个文件名指向同一个文件内容,无论通过哪个文件名修改,都会影响到同一份文件内容。硬链接无法作用于文件夹,如果用 js 代码来表示的话:
const a = {name: '123'}
const b = a // 使用新的一个变量 b 来接收 a 指向的对象地址
b.name = '666'
console.log(a) // {name: '666'}

无论单独删除 file1,还是 file2,都不会对对方造成影响,因为大家都指向了文件内容。

命令是:ln file1 file2

  • 软链接:file2 相当于 file1 的快捷方式,如果删除 file1,那么 file2 会变成”死链接“,因为 file2 并不指向文件内容。 命令是:ln -s file1 file2,即硬链接的基础上增加 -s 参数。

用户与群组

Linux 系统中有用户与群组的概念,默认情况下,我们会有一个 root 用户,以及 root 群组,假设我们创建了一个账号,叫 zihao,那么默认 zihao 是属于 zihao 群组的,即默认情况一个用户的创建,会同时创建一个同名群组。

  • sudo 用 root 身份运行某些命令
  • sudo su 切换至 root 用户
  • useradd <username> 添加用户
  • passwd <username> 修改某个用户的密码
  • userdel <username> 删除用户。默认不会删除家目录,可以加上 -r 参数来同时删除家目录
  • groupadd <groupname> 添加群组
  • usermod -g <groupname> <username> 改变某个用户的群组
  • usermod -G <groupname>,<groupname> <username> 给一个用户添加多个群组,群组用逗号分隔
  • usermod -aG <groupname> <username> 默认行为是覆盖用户的群组,如果指定 -a 参数则是追加
  • groups <username> 获取用户的群组信息
  • groupdel <groupname> 删除群组
  • chown <username> <filename> 改变某个文件的所有者,-R 参数可以递归地设置子目录与文件
  • chgrp <groupname> <filename> 改变某个文件的群组
  • chmod <number> <filename> chmod 777 <filename> 每一位数字就表示设置某一类人的权限,7 则是三位数字的二进制和。

如何查找文件?

  • locate <filename> 用来查找包含名称的文件及目录,不过这个命令并不是在目录中搜索,而是在文件数据库搜索,所以可能搜不到最近新建的文件,Linux 系统默认是 24 小时更新一次文件数据库。
  • find [searchWhere] -name <filename> 这个命令也是用来搜索,不过这个是通过搜索硬盘来查找。 find 是精确搜索,locate 是模糊搜索。我们用 "xxx", "xxx", "xxx" 来实现 find 的模糊搜索。find 功能相对来说比较强大,可以格式化输出,按访问时间,文件大小等方式查找。

处理数据的常用命令

  • grep <text> <filename> 简单的用法是在文件中查找包含关键字的行。
  • cut -d , -f 1 notes.csv cut 命令按照一定规则截取每行中的内容,这里指定了分隔符,用 -f 指定了要获取分隔后的第一个位置。

stdin, stdout, stderr 的区别?

  • 输入至程序的数据,就是标准输入 stdin
  • 程序正常输入的数据,以及程序输出错误或诊断的数据,stdout 和 stderr,正常输出的文件描述符为 1,错误输出的文件描述符为 2。
  • 涉及到的重定向操作符:>, >>, 2>, 2>>, 2>&1

> 和 < 的区别?

> 是重定向标准输出,而 < 是指定命令的标准输入,比如 cat < notes.csvcat notes.csv 虽然结果一样,但是执行原理不一样。

  • cat notes.csvcat 命令接收的输入是文件名,由程序本身自行打开文件,读取内容输出。
  • cat < notes.csvcat 命令接收的输入直接是文件的内容,所以直接输出,而打开文件,并将内容传给命令程序,则是由终端完成。

| 的作用?

可以将一个命令的输出变成下一个命令的输入。

前台进程与后台进程

当一个进程非常耗时,他会一直占据前台,导致你无法输入其他命令,那么就可以在某个命令结尾加上 &,将这个命令放到后台运行,如果某个进程已经开始运行,那么可以使用 Ctrl + Z 先把这个进程转换成后台停止进程,再通过 bg 命令重新让这个进程恢复运行。fg 则是将某个后台进程,重新放到前台运行。

归档与压缩

Linux 中,一般是用 tar 命令将多个文件归档成单个文件,然后再用 gzip 或者是 bzip2 压缩这个文件。

  • tar -cvf test.tar test/ 其中 c 表示创建,v 表示显示详情,f 表示文件

  • tar -tf test.tar 显示归档中的所有文件,但并不解开

  • tar -xvf test.tar 解开归档

  • gzip test.tar | bzip2 test.tar 压缩归档

  • gunzip test.tar.gz | bunzip2 test.tar.bz2 解压压缩文件

  • tar -zcvf test.tar.gz test/ 将归档与压缩合并成一步,-z 表示使用 gzip 压缩 tar -jcvf test.tar.bz2 test/

  • tar -zxvf test.tar.gz 可以直接把 gz 文件中的文件提取出来,类似的还有 tar -jxvf test.tar.bz2

SSH 是对称加密还是非对称加密?

  • 对称加密:假如我们是传输方,我们会使用一个密钥来加密我们的信息,而接收方,也通过同样的一个密钥来解密我们的信息:
const secretKey = "xxx"

// 传输方
const message = "123"
const decodeMessage = 加密(message, sercretKey)

// 接收方
const encodeMessage = 解密(decodeMessage, secretKey)

所以对称的意思是指加密和解密使用同一个密钥,那对称加密的一个缺陷就是:必须要谨慎地传递密钥。

  • 非对称加密:在对称加密中,是使用一个密钥来完成加密解密,而在非对称加密中,是使用一个密钥加密,使用另外一个密钥解密。一个被叫做公钥,用来加密;一个被叫做私钥,用来解密。
// 传输方
const publicKey = 'zzz'
const message = "123"
const decodeMessage = 加密(message, publicKey)

// 接收方
const privateKey = "xxx"
const encodeMessage = 解密(decodeMessage, privateKey)

SSH 结合了非对称加密以及对称加密两种方式,首先使用非对称加密,传输对称加密的密钥,之后就一直使用对称加密的密钥来作为加密和解密的手段。

首先服务器有一对公钥和私钥,先把公钥给到客户端,那客户端就使用公钥来加密自己的对称加密的私钥,再把加密的内容给服务器,此时服务器再用自己的私钥解密,就获得了对称加密的私钥,这样做就解决了对称加密中明文传递私钥 的风险。