本文参考:Linux 入门 - SAST skill docs
§1 What is Linux?
Linux 是一种自由和开放源码的类 UNIX 操作系统,Linux 也是自由软件和开放源代码软件发展中最著名的例子,只要遵循 GNU,任何个人和机构都可以自由地使用 Linux 的所有底层源代码,这使得它得到来自全世界软件爱好者和组织的开发支持。
狭义的Linux单指其内核,而平时说的Linux指的是其发行版本,还包括安装工具、系统配置、图形桌面界面、各种 GNU 软件等。常见的 Linux 发行版有 Debian、Ubuntu、Fedora、CentOS、Arch Linux 等。笔者使用的是WSL Ubuntu。其他使用Linux的方法有Linux系统、虚拟机(Virtualbox、Docker)、服务器远程连接(SSH、RDP)。
为什么更推荐 Linux 作为程序员的开发环境?
开发环境和服务器环境一致
绝大多数网站后端、云服务器、Docker 容器、科研计算服务器都运行 Linux。如果在 Windows 本地开发、最后部署到 Linux,可能遇到换行符 CRLF 和 LF 不同、Shell 命令不同、权限机制不同、某些依赖只在 Linux 上正常运行等问题。
安装开发工具更统一
Linux 安装工具通常可以直接使用包管理器,很多工具不需要到处找安装包、点击安装向导、设置环境变量。
命令行和自动化能力强
Linux Shell 不只是“输入命令的黑框”,它可以把多个程序像积木一样组合。这种自动化能力在大型项目、科研实验、服务器运维中非常重要。
Git、SSH、Docker 等工具属于 Linux 的“主场”
Git、SSH、Docker、Kubernetes、GCC、CMake、Make 等工具都与 Unix/Linux 生态关系很深。它们在 Windows 上也能使用,但在 Linux 中通常文档中的命令可以直接复制、路径和权限行为更符合预期、不需要额外的兼容层、与远程服务器操作方式一致、Shell 脚本兼容性更好。
§2 Shell 101
Shell:一种软件,我们可以将它视为“用户到内核之间的中介”,它接受并解析(英语:Parse)用户输入命令行的指令,并调用内核所提供的对应服务。分为图形界面和命令行界面两种,比如 Windows 的文件浏览器、程序管理器都可以算是 GUI Shell,但用 Linux 时我们一般说的都是 CLI Shell。
常见的 Shell 包括 sh、bash、zsh、fish 等。
Linux终端提示符:training@SAST-Training:~$
含义:
- 身份:
training - 主机名:
SAST-Training - 当前工作目录:
~(指的是home/username) - 美元符号表示当前用户不是
root(反之是#)
解析命令的过程:每输入一个命令,Shell解析、运行,将结果输入终端。
最基本的命令:
1 | training@SAST:~$ echo "Hello Linux!" |
Shell 的命令由空格分割,第一个是要运行的程序(如上例 echo),后面跟它的参数(如上例 "Hello World!")。
基本指令:
| Command | Description |
|---|---|
| 目录相关 | |
| pwd | 当前目录 |
| cd | 切换目录 |
| ls | 查看目录列表 |
| mkdir | 创建目录 |
| find | 在层级目录下搜索文件 |
| 文件相关 | |
| man | 了解软件具体命令用法 |
| tldr | 更清晰的man |
| touch | 创建 |
| mv | 移动(可用于重命名) |
| cp | 拷贝 |
| rm | 删除 |
| chmod | 更改文件权限 |
| chown | 更改文件所属 |
| echo | 输出提供的文本 |
| file | 查看文件类型 |
| cat | 将文件内容输出到标准输出 |
| 用户和组相关 | |
| useradd | 创建用户 |
| groupadd | 创建组 |
| passwd | 更改密码 |
| chpasswd | 批量更改密码 |
| su | 一般用于切换用户 |
| sudo | 一般用于执行 root 权限指令 |
查看文件系统:
基本的表示:/ 表示根路径,~ 表示家路径(/home/username/,如果是 root 则为 /root/),. 表示当前目录,.. 表示上一级目录。
根路径下的文件夹:
/etc目录是系统根路径下最重要的目录之一,它是用来存储操作系统文件的公共区域,比如/etc/sudoers、/etc/passwd分别记录了拥有 root 权限的用户、系统内的所有用户信息。/var目录是系统的服务或应用频繁写入的地方,比如/var/log存储了程序的 log 文件。/tmp里是一些程序只需要访问一两次的文件,每当系统重启时,这里的文件都会被清空。注意这个文件夹默认可被任何用户写入。/home这个文件夹下是各个用户的家目录。/mnt是数据卷的挂载点;通过 USB 等接口连接的外部媒体也可能出现在/media文件夹中。/srv存放这个服务器提供的服务所需的文件(如网站资源)。/proc:虚拟文件系统,用于存储内核和进程的运行时信息,例如/proc/cpuinfo查看 CPU 信息,/proc/meminfo查看内存信息。/sys:虚拟文件系统,提供设备和驱动相关的系统信息。/dev:设备文件目录,例如/dev/null(空设备文件)和/dev/sda(磁盘设备文件)。
Shell 中的常见操作符:
| Operator | Description | Example |
|---|---|---|
| & | 允许命令在后台执行 | cp -r ./here ./there & |
| && | 执行多条指令,逻辑和 C++ 类似 | wget someurl/install.sh . && ./install.sh |
| > | 重定向输出 | echo "Hello" > hello.txt |
| < | 重定向输入 | ./main < in.txt |
| >> | 重定向输出并采取“追加”模式 | echo cirno >> visitors.txt |
| | | 连接前后两个程序的输出和输入 | ls ~/Documents | grep note.txt |
软件包管理系统是在电脑中自动安装、配置、卸载和升级软件包的工作组合。使用软件包管理系统可以大大简化在 Linux 发行版中安装软件的流程。常见的软件包有两种类型:deb 软件包(由 dpkg 和它的前端 apt 管理,使用于 Debian、Ubuntu)和 RPM 软件包(由 dnf、yum、ZYpp 等前端管理)。
§3 SSH
Secure SHell, 是一种用于在不安全网络上安全访问远程计算机 的协议. 它提供了一种加密的方法, 使得用户可以通过不安全的网络连接上安全地 远程登录 (ssh) 和传输文件 (scp / sftp). SSH 提供了完整的 Linux Shell 支持, 且协议开源可信, 常用终端开源, 安全漏洞较少, 因此被广泛使用.
远程执行命令:SSH 可以直接远程执行命令而不需要连接到远程的 Shell 中,在连接命令后加上需要执行的命令.
1 | ssh username@server [command] |
远程拷贝文件:scp 指令可以从远程拷贝文件到本地/从本地拷贝文件到远程,基本格式是 scp <from> <to>。如果要拷贝一个文件夹,应该使用 flag -r 表示递归深入目录。
1 | # 将本地当前目录的 test.zip 拷贝到远程的 ~/test.zip |
SSH配置文件:每次连接服务器都要输入用户名、IP 和端口未免过于繁琐,我们可以通过编辑 SSH 配置文件来简化命令。这个配置文件位于家路径的 .ssh 文件夹下,名字为 config(如果不存在需自己创建),即 ~/.ssh/config。对于 Windows 系统而言,这个 .ssh 文件夹位于用户目录下 C:\Users\<username>\.ssh\config。配置文件写法如下:
1 | HOST sast HostName 152.136.177.53 Port 8000 (默认22,此时不需要指定) User root |
这样每次我们想连接到 root@152.136.177.53 -p 8000 时只需要输入 ssh sast 即可。
这个配置文件同样适用于 scp 命令:
1 | # 前一小节例子的简略版 scp test.zip sast:~/test.zip scp sast:~/data.csv . |
PubKey Authentication:利用密码学中的公钥-私钥非对称加密机制,我们只需要在服务器中预存好自己的公钥,就可以在登录时自动化验证流程而免去密码。
Comments