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 的话,则会显示 #。
whoami可以获取当前用户名。hostname可以获取当前计算机名称。
cat, less, more 有什么区别?
cat 会把文件内容全部显示出来,而 less 和 more 则会分页展示,更适合浏览内容较多的文件,less 是 more 的加强版,所以我们现在不需要关心 more,在文件内容较多的情况下,直接使用 less 即可。
less 的快捷键:
- 空格键:前进一页;b 键:后退一页
- 回车键:前进一行;y 键:后退一行
- d 键:前进半页;u 键:后退半页
- q 键:退出
- = 键:显示当前所处文件位置,比如第几行
- / 键:进入搜索模式,按 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.csvcut 命令按照一定规则截取每行中的内容,这里指定了分隔符,用-f指定了要获取分隔后的第一个位置。
stdin, stdout, stderr 的区别?
- 输入至程序的数据,就是标准输入 stdin
- 程序正常输入的数据,以及程序输出错误或诊断的数据,stdout 和 stderr,正常输出的文件描述符为 1,错误输出的文件描述符为 2。
- 涉及到的重定向操作符:
>, >>, 2>, 2>>, 2>&1
> 和 < 的区别?
> 是重定向标准输出,而 < 是指定命令的标准输入,比如 cat < notes.csv 和 cat notes.csv 虽然结果一样,但是执行原理不一样。
cat notes.csv:cat命令接收的输入是文件名,由程序本身自行打开文件,读取内容输出。cat < notes.csv:cat命令接收的输入直接是文件的内容,所以直接输出,而打开文件,并将内容传给命令程序,则是由终端完成。
| 的作用?
可以将一个命令的输出变成下一个命令的输入。
前台进程与后台进程
当一个进程非常耗时,他会一直占据前台,导致你无法输入其他命令,那么就可以在某个命令结尾加上 &,将这个命令放到后台运行,如果某个进程已经开始运行,那么可以使用 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 结合了非对称加密以及对称加密两种方式,首先使用非对称加密,传输对称加密的密钥,之后就一直使用对称加密的密钥来作为加密和解密的手段。
首先服务器有一对公钥和私钥,先把公钥给到客户端,那客户端就使用公钥来加密自己的对称加密的私钥,再把加密的内容给服务器,此时服务器再用自己的私钥解密,就获得了对称加密的私钥,这样做就解决了对称加密中明文传递私钥 的风险。