gitstats/_posts/2019-12-28-linux-guide-basi...

363 lines
20 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout: post
title: "开源世界旅行手册:基础知识"
date: 2019-12-28 10:28:00
author: "Viletyy"
header-style: text
tags:
- Linux
---
## 基础知识
### Shell
可能您早已能够熟练的使用 GUI图形用户界面例如您可以使用鼠标双击一个图标来打开或者执行它。
我们来看这个过程: 您使用鼠标定位桌面上的一个程序图标,按下左键两次。系统读取鼠标指针的位置,并且判断该位置下图标的涵义,根据预设的双击动作,运行程序或者打开文件。
这一套 GUI 系统,便是一种 Shell它的作用是实现人机交互。如果我们不能够控制电脑那么电脑还不如电视机好玩不是么电视机也可以选择频道电视机的遥控器也是一种人机交互的界面不过相对于电脑确实是相当简单了
易于上手、界面直观是 GUI 的优点,但是 GUI 并不意味着简单!或许您有类似经历: 桌面上有几十个程序的启动图标,也知道它们的名字,但是翻出一个来,并不是一件轻松的事情。
我的 Windows 系统中,桌面上摆满了各种图标,每当启动一个程序的时候,我都很是困扰。后来尝试了 音速启动 这类程序启动管理器,效果却不遂人意。(在我的不懈努力下,这个难道最终得到了解决: 将快捷方式名称简化,放到特定目录下,使用 Win+R 组合键呼出 运行 对话框,键入快捷方式的名称来运行该程序。比如 反恐精英 的快捷方式为 cs ,我把它放在 Windows 目录下; 运行 cs 命令,就可以去维护世界和平了。
这么多快捷方式,统统放到 Windows 目录下,非常混乱。因此,我在 D盘 建立了一个名为 path 的目录,并把它的路径加入到环境变量的 path 项中,快捷方式放在 D:\path 目录中。即便重装系统,只要在环境变量中重新加入此路径,原来的程序大多可以直接以命令来运行……我的许多朋友强烈要求我帮他们设定这种启动方式,因为这确实很方便:))
在 Linux 下,所有的程序都可以通过命令运行。虽然 Linux 也有 GUI但是它并不比 Windows 的 GUI 更优秀!上面只是简单的介绍了 CLI命令行界面相对 GUI 的优越之处,使用 CLI 还有更多的好处,您会慢慢体会到的。
当然了在您的印象中CLI 一定非常的不友善,缺少亲和力,冷漠而拒人于千里之外……您和 CLI 之间甚至有代沟的存在
### 命令
坦白的说,冷不丁见到那么老长的一串命令,谁都会毛骨悚然。
也许您使用过DOS留下这种印象命令先放一边光是正确的输入目录、文件名都够瞧的。而且DOS不区分大小写要是像Linux一样区分大小写那多恐怖啊
其实Linux命令行具有补全功能非常实用。假设有这样一个命令
```shell
command path/file
```
如果只有一个以`c`起始的命令,键入`c`,再按一次`tab`键,系统将自动补全该命令余下的部分。只要`c` `tab`两次按键,就可以完成`command`的输入。
现在我们来了解命令的语法结构,这一部分相当重要,您可得看仔细。
我们知道,任何语言都有特定的语法结构,以我们的中文为例:
```shell
我们①郑重地②推荐③您Linux④
```
 这个句子的语法尽管简单,却是大部分的命令行采用的句型。让我们看一下,这个句子里都有些什么。
① 主语Linux命令的执行者当然是用户所以主语一概省略。
② 状语用来修饰谓语。与之相对应Linux命令可以使用选项来精细调节程序的行为。为了与命令的操作对象相区别选项前通常要加-或者--符号。原则上,在命令名后,选项的位置可以随意,但是为了养成一个良好的习惯,我们建议您在命令名后直接跟选项。
③ 一个动词作为谓语而存在。Linux命令中这一步是必须的。这一部分也是不同命令之间最根本的区别方式所以它通常作为命令名写在最前面。键入date命令您可以查看当前的日期。
④ 这两个部分都是宾语,它们是命令的操作对象。大部分的命令只有一个操作对象,也有一些命令是双宾语结构的,具有一个直接宾语和间接宾语。比如拷贝这个命令`cp`copy`cp a b `表示把文件a拷贝为文件b`cp a /home` 表示把当前目录下的a文件拷贝到/home目录下。命令的不同部分使用空格分隔连续的空格视为一个空格
分隔符我们的汉语是象形文字没有分隔符。但是所有的拼音文字中都用空格作为分隔符来分隔单词。Linux命令中同样使用空格作分隔符。
上面的那句话翻译成Linux的命令应该是这个样子的
```shell
推荐 --①郑重地 您 Linux
```
① 按照传统,“-”后跟选项缩写,“--”后跟选项全称。不过也有例外
Linux的命令也蛮简单吧
### Linux程序、进程
或许您会这样想Linux命令的句型确实不难但是那么多命令我这么知道它们都是作什么的呢而且不同的系统中可以使用的命令似乎也不太一样这真让人困惑。。。
其实Linux的命令运行的是Linux系统中的程序。只要您已安装了程序您就可以通过命令来运行它并且可以使用选项来精细的调整它的运行状态。也可以通过点击启动图标来运行不过启动图标不能够方便的调整选项并不是很方便。
举一个例子:
```shell
mplayer -shuffle -loop 3 -playlist mymp3.list
```
可能您运行上面命令系统会提示您无法找到命令那是因为您没有安装mplayer这个程序。mplayer是我见过的支持格式最多的播放器几乎任何已知格式的多媒体文件都可以使用mplayer来播放。它包含一个图形界面的前端您可以在菜单中找到它鼠标点击运行也可以通过执行命令来运行它的命令行版本。
如果您的系统中没有mplayer播放器我们建议您安装一个。关于程序的安装参阅第16章 软件管理。
上面命令中mplayer调用了mplayer播放器程序。选项-shuffle表示随机播放-loop表示循环播放后面的3为循环的次数如果为0则为一直播放。-playlist 表示播放列表中的曲目。我们可以把mp3的路径放到mymp3.list文件中让mplayer来播放它们。
**进程**,为运行中的程序,是程序在内存中的镜像。
好了现在您已经了解了Shell、命令、程序、进程的概念您基本上也就了解了LinuxLinux系统真是非常简洁而且容易理解
但只知道这些,您并不能顺畅使用。接下来的章节中,我们来进一步介绍它的细节。
### 路径
路径分为绝对路径和相对路径。
绝对路径的起始点为根目录`/`,例如/usr/local/bin就是绝对路径它指向系统中一个绝对的位置不受其他因素影响。
相对路径的起始点为当前目录,如果您现在位于/usr目录那么相对路径local/bin所指示的位置为/usr/local/bin
也就是说相对路径所指示的位置除了相对路径本身还受到当前位置的影响。例如Linux系统中常见的目录/bin, /usr/bin, /usr/local/bin, 如果只有一个相对路径bin那么它指示的位置可能是上面目录中任意一个也可能是其他目录。
如果我告诉您到bin目录寻找一个文件您可能搞不清楚是哪一个bin目录。只有当前位置确定相对路径指示的位置才能够确定。
现在我说,/usr/local目录下它的相对路径bin中有某个文件这样就比较明确了。
在相对路径中,`.`表示当前目录,`..`表示当前目录的上一级目录。
假设您安装了一个程序它的主程序没有被放置到上面三个bin目录中的任何一个或者其他系统能够找到的地方您就得告诉系统它的可执行文件在哪里。
可以使用绝对路径,例如: **/home/user/bin/可执行文件**
或者定位到/home/user/bin目录使用相对目录来定位它 **./可执行文件**
路径相关命令:
```shell
cd (change directory) # 更改目录
pwd (print working directory) # 显示当前路径
ls (list) # 显示当前目录中的文件列表
```
请尝试一下操作:
```shell
cd /etc # 进入 “/etc/”目录,这里使用的是绝对路径
pwd # 显示当前路径,这个命令返回结果“/etc”
cd init.d # 进入 “/etc”目录的子目录“init.d”这里使用的是相对路径
cd .. # 进入上一级目录“/etc”
cd ../home # “/etc”目录的上一级目录为“/”它的子目录“home”为“/home”
cd - # 回到上一次的目录,我们在“/etc”目录跳转到“/home”目录所以这次是回道“/etc”目录
cd ~ # "~"代表当前用户的“$HOME”目录也就是“/home/{用户名}”目录。
ls # 在任何时候您都可以使用“ls”命令来了解当前目录下都有哪些文件。
```
远程路径:
远程路径的表示方法为 **协议://用户名:密码@位置/路径:端口**
大多数的远程路径可以使用默认端口匿名访问,由此用户名、密码、端口通常不需要填写,例如:
```shell
http://linuxtoy.org
```
要求身份验证的远程路径,您可以使用下面的方式访问:
```shell
ftp://user:passwd@ftp.linuxtoy.org:21
```
### 软件
Linux中没有注册表这个概念。安装软件理论上讲只要拷贝所有相关文件并运行它的主程序就可以了。
按照传统一个软件通常分别拷贝到同级目录下的bin、etc、lib、share等文件夹。
**bin**:可执行文件,程序的可执行文件通常在这个目录下。在环境变量中设定搜索路径,就可以直接执行,不需要定位其路径。
**etc**:配置文件,大部分系统程序的配置文件保存于/etc目录便于集中修改。
**lib**:库文件,集中在一起,方便共享给不同程序。相较不同的软件单独保存库文件,能够节约一些磁盘空间。
**share**:程序运行所需要的其他资源,例如图标、文本。这部分文件是专有的,不需要共享;而且目录结构相对复杂,混放在一起比较混乱,所以单独存放。
还有一些软件占用一个单独的目录所有的资源都在这个目录中。类似于Windows下的绿色软件不推荐在Linux系统下这样做。
- 执行时,系统找不到可执行文件(搜索所有路径,资源开销过大,是不现实的),需要定位其位置,像这样/home/user/bin/可执行文件,不够方便。
- 许多系统软件需要写作运行,配置文件分别保存,定位它们非常麻烦
- 如果程序使用的库文件,像图形库文件,都单独存放,那么磁盘空间的浪费会非常严重。
有一些大型软件,或者您部署的重要应用,您可以将它们单独安装在一个文件夹下。(通常源码安装支持这种方式)
### 配置方式
Linux下没有类似注册表的系统系统和软件都可以通过纯文本的配置文件进行设置。
事实上,图形界面的配置工具,通常就是以图形界面的方式修改配置文件,适合设置一些比较简单的程序。如果软件有几千个可以配置的选项,全部做成菜单,想象一下。。。开始发抖吧。。。
图形界面的配置工具可以看作特定配置文件专用编辑器。您一样可以使用通用文本编辑器来编辑配置文件比如Nano、Gedit、Knote、Vim或者Emacs等等。不考虑阅读、修改配置文本所占用的时间直接修改配置文件甚至更迅速在以后的章节中如果我们提示您修改某一文件例如/etc/fstab。您可以使用任何顺手的文本编辑器打开它。
如果只是要修改某一常用选项并且时常修改比如主机的IP地址。使用文本编辑器您要找到相应的配置文件还要在配置文件中找到相应的选项会浪费掉您的时间和耐性。
图形配置工具经常会受各种因素制约,比如网络服务器中不提供图形服务,图形界面不够稳定。。。这时,您可以使用命令行的配置工具来完成这些工作。
例如修改主机IP地址可以使用ifconfig这个程序执行下面的命令
```shell
ifconfig eth0 192.168.0.1
```
### 隐藏文件
Linux下名称中第一个字符为`.`的文件或者文件夹,系统会将它们隐藏起来。传统上,这种文件大多是用户的配置文件。
您可以尝试以下操作:
```shell
cd ~ # 进入您的用户目录
ls # 查看当前目录下的文件列表
ls -a # 查看所有文件列表(包括隐藏文件)
```
- 如果您只想查看隐藏文件而不包括这两个特殊目录您可以使用ls命令的选项 `-A`(ls -A)
- 每个目录下都包含两个特殊目录 `.``..`您也许猜到了, `.`代表当前目录, `..`代表上一级目录。
现在,您可以看多许多文件名以`.`起始的文件或者文件夹了吧?使用`ls`命令无法显示它们。
### 文件类型
Linux系统主要根据文件头信息来判断文件类型扩展名并非决定因素。
现在使用`ls -l` 命令,查看详细信息格式的文件列表,您将会看到如下内容:
```shell
total 5
drwxr-x--- 4 user group 4096 Mar 10 00:37 filename
drwxr-xr-x 21 user group 4096 Mar 10 20:16 文件名
-rw------- 1 user group 524 Mar 10 00:40 a
-rw-r--r-- 1 user group 24 Jun 11 2000 b
drwx------ 2 user group 4096 Mar 9 11:06 c
```
共显示了七列信息,从左至右依次为:权限、文件数、归属用户、归属群组、文件大小、创建日期、文件名称
```shell
d①rwxr-xr-x②
```
① 其中要特别留意的是第一列:
| 符号 | 含义 |
| ---- | ------------ |
| - | 普通文件 |
| d | 文件夹 |
| l | 符号链接 |
| b | 块设备文件 |
| c | 字符设备文件 |
| s | 套接文件 |
| p | 管道文件 |
② 剩下的9个字符分为三组分别是归属用户、归属群组、其他用户对于该文件的权限。我们看它的格式
| 符号 | 含义 |
| ---- | ------ |
| r | 可读 |
| w | 可写 |
| x | 可执行 |
- 它们的顺序不能颠倒,某一位置为空(-),则表示不具有相应的权限。
- Linux下的可执行文件并不是由扩展名例如 .exe决定的而是由其可执行权限位决定。
- 目录是一种特殊类型的文件。拥有目录的执行权限才可以进入这个目录!
### 权限
我们已经知道了文件的权限分为r可读、w可写、x可执行三种类型而一个文件可以针对归属用户归属群组其他用户或群组分别设定权限。
这种权限管理方式灵活、简单、严密、明晰。尽管如此在最初的阶段可能会有一点小小的不适。因为它无所不在而您习惯了的Windows的权限管理却不是这样非常混乱大多数时间形同虚设偶尔用到却让人伤透脑筋
使用`chmod`命令更改文件的权限,使用`chown`来更改文件的归属。例如:
```shell
chmod 755 xxx
chmod a+x xxx
chown user:group xxx #用来更改文件的归属用户。也可以同时更改其归属群组
chqrp group xxx # 用来更改文件的归属群组
```
上面命令中的755和a+x是两种类型的表达式
我们将在“权限管理”一节中详细介绍
#### 执行命令的权限
有一些命令普通用户也可以执行但是只有root用户才能执行成功这是为什么呢
例如在系统中增加一个新用户useradd我们看看这个命令的程序文件
```shell
ls -l /usr/sbin/useradd
-rwxr-xr-x 1 root root 56156 2006-04-03 21:37 /usr/sbin/useradd
```
所有的用户都可以执行?
这是因为useradd命令是修改/etc/passwd文件的一个工具来看看这个文件
```shell
ls -l /etc/passwd
-rw-r--r-- 1 root root 1835 2006-06-24 17:58 /etc/passwd
```
原来只有root用户才能写入修改结果非root用户执行useradd命令当然不会有结果。
### 用户
在Linux系统中有两种用户普通用户、root用户
root用户拥有对系统的完全控制权。实际上这没有看上去那样的美妙你必须对自己的行为负全部的责任。Linux继承了Unix的设计哲学系统毫无保留的执行你下达的命令哪怕这个命令是“向我开炮
普通用户只可以做系统允许的事情。尽管可以执行大多数命令但是root专有的命令却不能成功的执行因为这些命令往往关联着只有root才可以处理的文件。也就是说普通用户通常只可以处理自己$HOME目录下的文件。详见“执行命令的权限”一节。
而作为root用户可能会因为误操作给系统带来破坏作为普通用户可以做的事情又太少了点。
#### 执行命令的身份
默认情况下,您的命令提示符末尾$,这表示您将以普通用户的身份执行命令
您可以使用su switch user这命令来切换其他用户。
例如`su root`切换到root用户如果su命令后面没有参数那么这个命令默认切换到root用户
当您执行su这个命令系统会提示您输入密码请输入管理员的密码。这个时候您会发现命令提示符末尾变成了#您将以root用户的身份执行命令。
许多Linux系统随机设定系统root密码。这样更安全一些这个时候您可以执行sudo命令输入当前用户密码后暂时以root用户的身份执行命令。前提是sudoer列表中要包含您的ID
> 使用visudo需要root权限可以将普通用户加入到sudoer列表中。
但即便是用sudo来执行也不能保证系统不会在您的误操作下一命呜呼更安全的办法是直接赋予用户某种操作的权限。
```shell
gpasswd -a user audio
```
这个命令将user加入到audio群组您拥有了使用音频设备的权限。
事实上Linux中一切皆文件包括设备文件。
``` shell
ls -l /dev/sound
crw-rw---- 1 root audio 14, 4 10-04 09:41 audio
crw-rw---- 1 root audio 14, 3 10-04 09:41 dsp
crw-rw---- 1 root audio 14, 2 10-04 09:41 midi
crw-rw---- 1 root audio 14, 0 10-04 09:41 mixer
```
可以看到和音频有关的设备文件除了root用户可以使用audio群组中的用户也可以使用
#### 群组
群组分为两种,主组和辅组。在/etc/passwd文件中与用户相关联的是主组每个用户只可以加入一个主组/etc/group文件中则记录了每一个辅组所包含的用户同一个用户可以被多个辅组所包含。
这样看起来有点乱,但却可以提供更大的灵活性。例如:
```shell
crw-rw---- 1 root audio /dev/sound/audio
brw-rw---- 1 root optical /dev/cdrom
```
先假设一名用户只可以属于一个群组你是系统管理员你管理的用户要求听点音乐你把他加入了audio组于是该用户把CD放进了光驱结果一点反映也没有于是为了让他使用cdrom不得不让他拥有root权限你将不能防范他可能作出的破坏。
而一名用户可以属于多个群组能够很好的解决这个问题你可以让用户既属于audio群组又属于optical群组这样他就可以用cdrom来听音乐却没有root权限。
------
参考资料:
- [开源世界旅行手册](https://i.linuxtoy.org/docs/guide/)