## 什么是 Shell
Shell 是一种命令行解释器,用于接收用户输入的命令并将其传递给操作系统内核执行,在 Linux 系统中,Shell 是一个基本组件,用于与内核交互。虽然 Linux 内核负责管理硬件资源和系统核心功能,但用户通常通过 Shell 来与系统互动。
## Shell 有哪些类型
- **Bash(Bourne Again Shell)**:最流行的 Shell,几乎是所有 Linux 发行版的默认 Shell。
- **Zsh(Z Shell)**:功能强大且可定制性高,许多人认为它比 Bash 更好用。
- **Fish(Friendly Interactive Shell)**:强调用户友好和易用性。
- **Csh(C Shell)和 Tcsh**:类似于 C 语言的语法,Tcsh 是 Csh 的增强版本。
- **Ksh(Korn Shell)**:兼具 Bash 和 Csh 的特性。
### Bash
Bash 是大多数 Linux 发行版的默认 Shell,包括 Ubuntu。用户在 Ubuntu 中打开终端时,默认就是进入了 Bash 环境。
#### 编写 bash 代码
1. 创建 `myscript.sh` 文件,保存如下内容
```Bash
#!/bin/bash
VAR="world"
echo "Hello $VAR!" # => Hello world!
```
2. 修改为可执行权限
```Shell
$ chmod +x myscript.sh
```
3. 执行脚本
```Shell
$ bash myscript.sh
```
### Zsh
Zsh(Z Shell)是一个类似于 Bash 的命令行解释器,用于 Unix 和类 Unix 操作系统。它提供了许多改进的特性,包括主题和插件支持,使得用户能够高度定制自己的工作环境。Zsh 包含了 Bash 的许多命令和功能,同时引入了新的改进和扩展,比如更强大的命令行补全、拼写检查、历史记录管理和高级脚本编写功能。因其提供的高级功能和易用性,Zsh 被许多高级用户和开发者作为首选的 shell 使用。
#### 安装 Zsh
```Shell
$ apt install zsh -y
$ zsh --version
$ chsh -s $(which zsh)
$ exit # 退出并重新登录shell
$ # 重新登录服务器,查看默认shell是否已使用zsh
$ echo $SHELL
$ $SHELL --version # 查看zsh版本
```
#### 安装 Oh My Zsh
Oh My Zsh 用于管理 Zsh(Z Shell)的配置,提供大量的主题和插件,让用户可以轻松地定制和增强他们的 Zsh 环境。
```Shell
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# 修改主题
$ vim ~/.zshrc # >>> ZSH_THEME="afowler"
```
## 常用命令
### chmod
可以用来修改文件或目录的权限,`-R` 选项表示递归(recursive)
```Shell
$ chmod -R 700 filename
```
700这三个数字分别对应三个权限位,也可以用符号表示,常见的权限有:
- rw------- (600) 只有拥有者有读写权限。
- rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
- rwx------ (700) 只有拥有者有读、写、执行权限。
- rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
- rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
- rw-rw-rw- (666) 所有用户都有文件读、写权限。 所有用户都有读、写、执行权限。
### chown
用于修改文件或目录的所有者和所属组
```Shell
$ chown -R user2:group2 dir1
```
### systemctl
```Shell
$ systemctl status docker # 查看状态
$ systemctl start docker # 启动
$ systemctl stop docker # 停止
$ systemctl restart docker # 重启
$ systemctl enable docker # 开机自启
$ systemctl disable docker # 禁止开机自启
```
### find
#### 查找大文件
```shell
$ find . -type f -size +800M | xargs du -hm | sort -nr
```
### du
#### 查找大目录
```shell
$ du -hm --max-depth=1 | sort -nr | head -10
```
### scp
#### 上传
```Shell
$ scp -P <port> ./apps.tar.gz root@<ip>:~/apps.tar.gz
```
#### 下载
```Shell
$ scp -P <port> root@<ip>:~/apps.tar.gz ./apps.tar.gz
```
### tar
#### 压缩
```Shell
$ tar czvf filename.tar.gz filename
```
#### 解压
```Shell
$ tar xzvf filename.tar.gz
```
### 使用代理
```Shell
export https_proxy="你的代理" \
export http_proxy="你的代理"
```
## SSH
SSH(Secure Shell)是一种用于在不安全的网络上安全登录和其他安全网络服务的协议。它主要用于远程登录到其他计算机和传输文件,同时保护通信安全。以下是关于 SSH 的详细介绍:
### 生成 SSH 密钥对
在生成过程中,系统会提示你输入保存密钥的位置和一个可选的密码。你可以按回车键使用默认位置(通常是 `~/.ssh/id_rsa`)并选择是否设置密码。
```shell
$ ssh-keygen -t rsa -b 4096 -C "
[email protected]"
```
### 设置 `id_rsa` 和 `id_rsa.pub` 文件权限
```shell
$ chmod 600 ~/.ssh/id_rsa
$ chmod 644 ~/.ssh/id_rsa.pub
$ chmod 700 ~/.ssh
```
### SSH公钥认证登录
实现无密码登录的方法有多种,以下是常见的几种方法:
#### 1. 将公钥复制到远程服务器
```Shell
$ ssh-copy-id -p <port> root@<ip>
```
#### 2. 远程服务器手动配置
```Shell
$ mkdir ~/.ssh
$ vi ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
```
### 代理转发登录
```Shell
$ ssh-add ~/.ssh/id_rsa
$ ssh-add -l
$ ssh -A user@remote-server
```
## UFW
UFW (Uncomplicated Firewall) 是 Ubuntu 提供的一个简单易用的防火墙工具,它的命令用来管理和配置防火墙规则,基于 `iptables` 进行操作。
```shell
$ sudo ufw enable # 启用 UFW
$ sudo ufw disable # 禁用 UFW
$ sudo ufw status # 检查 UFW 状态
$ sudo ufw allow 22/tcp # 允许特定协议和端口的流量
$ sudo ufw delete allow 22/tcp #删除规则
$ sudo ufw reset # 重置 UFW
$ sudo ufw reload # 重载 UFW 配置
$ sudo ufw allow from 192.168.1.100 # 允许某个 IP 地址的所有入站流量
$ sudo ufw allow from 192.168.1.100 to any port 22 # 允许某个 IP 地址的特定端口流量
```
## 参考
- https://github.com/ohmyzsh/ohmyzsh
- https://github.com/ohmyzsh/ohmy`sudo ufw status verbose`zsh/ohmyzsh/wiki/Themes