ssh
SSH (Secure Shell) 是基于客户端-服务器架构的。具体来说:
- SSH 客户端 是你用于连接到远程服务器的设备(例如你的 Mac)。
- SSH 服务器 是你连接到的远程设备(例如 Linux 服务器、云服务器等),它需要运行一个 SSH 服务端来接受连接。
Mac 上的 SSH 客户端
macOS 自带 SSH 客户端,这意味着你可以在终端中使用 ssh
命令连接到远程服务器。你不需要额外安装任何软件即可使用 SSH 客户端。
如何使用 SSH 客户端
-
在 Mac 终端中连接到远程服务器:
打开终端,输入如下命令:
ssh username@hostname_or_ip
例如,要连接到 IP 地址为
192.168.1.100
的服务器,你可以这样做:ssh user@192.168.1.100
user
是你在远程服务器上的用户名。 -
生成 SSH 密钥对(公钥/私钥):
如果你希望使用 SSH 密钥来进行无密码登录,可以生成一个密钥对:
ssh-keygen -t rsa -b 4096
生成的公私钥位于~/.ssh/
下面的id_rsa
(私钥)和id_rsa.pub
(公钥)文件中。
然后将生成的公钥(通常位于 ~/.ssh/id_rsa.pub
)添加到远程服务器的 ~/.ssh/authorized_keys
文件中。
关于 SSH 的架构
- SSH 客户端:发起连接的设备(例如 Mac 电脑),负责加密、身份验证和发送命令。
- SSH 服务器:接受连接的远程设备,运行一个 SSH 服务器(如 OpenSSH),它负责处理客户端请求。
通常来说,macOS 自带的只是 SSH 客户端,如果你需要在 Mac 上运行 SSH 服务器(例如让其他设备连接到你的 Mac),你可以开启 macOS 的远程登录功能,这实际上就是启用了 SSH 服务器。
SSH 客户端 配置
SSH客户端配置通常位于用户的家目录中的一个名为.ssh的文件夹内,配置文件名为config。这个文件可以包含各种选项来定制SSH客户端的行为。
客户端配置文件地址:~/.ssh/config
以下是一个简单的config文件示例,其中包含了一些常见的配置选项:
全局配置
Host \*
AddKeysToAgent yes
UseKeychain yes
IdentityFile \~/.ssh/id\_ed25519
针对特定主机的配置
Host example.com
User johndoe
HostName 192.168.1.100
Port 2222
IdentityFile \~/.ssh/id\_ed25519
在这个例子中:
AddKeysToAgent 和 UseKeychain 选项是针对 macOS 用户,它们会自动将SSH密钥添加到密钥链。
IdentityFile 指定了用于认证的私钥文件路径。
User 指定了默认的SSH用户名。
HostName 指定了远程主机的IP地址或域名。
Port 指定了SSH连接使用的端口,默认是22。
请根据您的操作系统和需求调整这些配置。如果不存在config文件,可以在用户的家目录下的.ssh文件夹中创建一个新的文件,并写入上述配置。如果文件夹不存在,您需要先创建它。
如何开启 macOS 上的 SSH 服务器
如果你需要让其他设备连接到你的 Mac,你可以通过以下步骤开启 SSH 服务:
- 打开 "系统偏好设置"。
- 进入 "共享" 设置。
- 勾选 "远程登录" 选项。
这样,你的 Mac 就开启了 SSH 服务器,其他设备可以通过 SSH 连接到它。
ssh进入容器和退出容器
要通过 SSH 一步进入到 Docker 容器或 Kubernetes 容器内部,可以通过以下方法实现:
一步进入 Docker 容器内部
在主机已经开启 SSH 的前提下,可以使用以下步骤:
ssh user@host "docker exec -it <container_name_or_id> /bin/bash"
解释
user@host
: SSH 登录的用户名和主机地址。docker exec -it
: 执行命令进入容器。<container_name_or_id>
: 替换为目标容器的名称或 ID。/bin/bash
: 进入容器的交互式终端。如果容器没有/bin/bash
,可以用/bin/sh
替代。
示例
假设主机地址为 192.168.1.100
,用户是 root
,容器名称为 my-container
:
ssh root@192.168.1.100 "docker exec -it my-container /bin/bash"
注意
确保目标主机的用户有权限执行 Docker 命令。如果没有权限,需要使用 sudo
:
ssh root@192.168.1.100 "sudo docker exec -it my-container /bin/bash"
一步进入 Kubernetes 容器内部
对于 Kubernetes,需先定位到对应的 Pod 和容器,然后使用以下方法。
ssh user@host "kubectl exec -it <pod_name> -n <namespace> -- /bin/bash"
解释
user@host
: SSH 登录的用户名和主机地址。kubectl exec -it
: 执行命令进入 Kubernetes 的容器。<pod_name>
: 替换为目标 Pod 的名称。<namespace>
: 替换为 Pod 所在的命名空间。/bin/bash
: 进入容器的交互式终端。如果容器没有/bin/bash
,可以用/bin/sh
替代。
示例
假设主机地址为 192.168.1.100
,用户是 root
,Pod 名为 my-pod
,命名空间是 default
:
ssh root@192.168.1.100 "kubectl exec -it my-pod -n default -- /bin/bash"
定位到容器内部
如果一个 Pod 中有多个容器,可以指定容器名:
ssh root@192.168.1.100 "kubectl exec -it my-pod -n default -c <container_name> -- /bin/bash"
注意
- 确保 Kubernetes 配置文件(
~/.kube/config
)已经设置正确,且用户有权限执行kubectl
命令。 - 如果需要切换上下文,可以在命令前加上
kubectl config use-context <context_name>
。
快捷脚本
可以编写一个脚本来简化操作。例如:
Docker 快捷脚本
ssh root@192.168.1.100 "docker ps -q --filter name=my-container | xargs docker exec -it /bin/bash"
Kubernetes 快捷脚本
ssh root@192.168.1.100 "kubectl get pod -n default | grep my-pod | awk '{print \$1}' | xargs -I {} kubectl exec -it {} -n default -- /bin/bash"
总结
通过 SSH,可以直接将远程命令嵌入到 docker exec
或 kubectl exec
中,快速进入 Docker 或 Kubernetes 容器内部。确保主机配置无误,拥有相应权限。
容器退出
通过以上方式进入容器后,当你执行 exit
时的行为取决于连接方式和容器退出后的处理逻辑:
当你通过以下命令进入 Docker 容器:
ssh user@host "docker exec -it <container_name> /bin/bash"
或者,当你通过以下命令进入 Kubernetes 容器:
ssh user@host "kubectl exec -it <pod_name> -n <namespace> -- /bin/bash"
执行 exit
后会直接退出 SSH 连接,回到本地终端。
这是因为整个命令链条是由 SSH 一次性执行的,退出容器相当于终止了 SSH 会话。
exit
退回到主机终端,必须先进入远程主机,然后进入容器, 这样,exit
容器后会回到主机终端,而不是直接退出 SSH 会话。
Linux指令
进程管理
1. 查看进程
ps 命令
-
基本用法:查看当前用户的进程。
ps
-
查看所有进程(包括其他用户的进程):
ps -ef
-
查看某个用户的进程:
ps -u <username>
-
查看进程树(进程的父子关系):
ps -ejH
-
查看指定进程详细信息(包括内存、CPU 使用等):
ps aux | grep <process_name>
例子:
ps -aux # 显示所有进程的详细列表
ps -aux | grep [process_name] # 显示所有进程的详细列表,并通过grep进行过滤
ps -ejH # 以树状结构显示进程
ps -ejH | grep [process_name] # 以树状结构显示特定进程的信息
top 命令
- 基本用法:实时查看进程信息,CPU 和内存使用率。
top
- 交互式使用:在 top 界面中可以按下 k 来杀死某个进程,按 P 来按 CPU 排序,按 M 来按内存排序。
htop 命令
- 增强版的 top:提供更友好的界面,并且支持使用鼠标和键盘操作。
htop
- 安装 htop(如果没有安装):
sudo apt install htop # Ubuntu/Debian 系统
sudo yum install htop # CentOS/RHEL 系统
pgrep 命令
- 根据进程名查找 PID:
pgrep <process_name>
pidof 命令
- 查找进程的 PID(与 pgrep 类似):
pidof <process_name>
2. 控制进程
kill 命令
- 杀死进程(通过 PID):
kill <PID>
- 强制杀死进程(发送 SIGKILL 信号):
kill -9 <PID>
- 杀死所有指定名称的进程:
killall <process_name>
pkill 命令
- 通过进程名杀死进程:
pkill <process_name>
- 发送不同的信号(例如强制终止进程):
pkill -9 <process_name>
xkill 命令
- 通过图形界面杀死进程(点击进程窗口):
xkill
(需要先安装 x11-utils,可以通过 sudo apt install x11-utils 安装)
kill -l 命令
- 列出所有信号,查看可用的信号:
kill -l
3. 启动和管理进程
nohup 命令
- 将命令放入后台执行,并保持命令执行即使退出终端:
nohup <command> &
- 输出会默认保存在 nohup.out 文件中,除非指定重定向:
nohup <command> > output.log 2>&1 &
disown 命令
- 从当前 shell 会话中解除对进程的控制,让进程在 shell 退出时继续运行:
<command> &
disown
fg 命令
- 将后台进程带回前台:
fg %<job_number>
- 查看后台作业列表:
jobs
bg 命令
- 将后台进程继续执行(如果进程被暂停):
bg %<job_number>
systemctl 命令(适用于 Systemd 管理的系统)
- 启动服务:
sudo systemctl start <service_name>
- 停止服务:
sudo systemctl stop <service_name>
- 重启服务:
sudo systemctl restart <service_name>
- 查看服务状态:
sudo systemctl status <service_name>
- 查看所有服务状态:
sudo systemctl list-units --type=service
4. 查看进程的网络连接
netstat 命令
- 查看当前所有网络连接(包括监听端口):
netstat -tuln
- 查看进程和其占用的端口:
netstat -tulnp
- 查看特定端口的占用情况:
netstat -an | grep :<port_number>
ss 命令
- 查看当前所有网络连接(ss 是比 netstat 更加高效的命令):
ss -tuln
- 查看进程的网络连接:
ss -tulnp
5. 查看进程的资源消耗
free 命令
- 查看内存使用情况:
free -h
vmstat 命令
- 查看虚拟内存和其他系统状态:
vmstat 1
iostat 命令
- 查看 CPU 使用率和磁盘 I/O 情况:
iostat
sar 命令
- 查看 CPU、内存、网络等的历史性能数据:
sar -u 1 3
6. 使用 systemd 管理进程
在 systemd 系统中,很多服务和进程都会作为 systemd 单元管理。常见的命令包括:
- 查看服务状态:
systemctl status <service_name>
- 启动服务:
sudo systemctl start <service_name>
- 停止服务:
sudo systemctl stop <service_name>
- 重启服务:
sudo systemctl restart <service_name>
- 查看所有系统服务状态:
sudo systemctl list-units --type=service
总结
- ps: 查看当前进程的状态。
- top / htop: 实时监控系统进程和资源。
- kill / pkill / killall: 用来杀死进程。
- systemctl: 管理 systemd 服务。
- ss / netstat: 查看网络连接和端口占用。
- fg / bg / jobs: 管理后台进程。
- nohup / disown: 让进程在终端关闭后继续运行。
查看文件
cat
语法: cat [选项] [文件]
功能: 查看目标文件的内容.
常用选项:
- n 对输出的所有行编号.
- b 对非空输出行编号.
- s 不输出多行空行.
查看小文本文件, 使用 cat 命令.
more
cat 命令的主要缺点是其开始运行之后你无法控制后续操作. 为了解决这个问题, 引入 more 命令. more 命令会显示文本文件的内容, 但会在显示每页数据之后暂停下来.
more 命令是一个分页工具, 可以使用 Enter 键逐行向下查看文件内容, 或是使用空格键逐页向下查看文件内容. 结束之后, 按 q 键退出.
但是 more 命令只能向后翻页, 没有办法向前翻页, 为此引入 less 命令. ###less 工具也是对文件或其它输出进行分页显示的工具, 应该说是 linux 正统查看文件内容的工具, 功能极其强大.
less 的用法相较于 more 而言更加的有弹性, 在使用 more 的时候, 我们并没有办法向前翻页, 只能向后翻页. 但若使用了 less 时,就可以使用 [pageup][pagedown] (上下翻页键) 或上下箭头键等按键的功能来前后翻看文件, 更容易用来查看一个文件的内容!
除此之外, 在 less 里面可以拥有更多的搜索功能, 不止可以向下搜索 ( / ), 也可以向上搜索 ( ? ).
语法: less [选项] [文件]
功能: less 与 more 类似, 但使用 less 可以随意浏览文件, 而 more 仅能向后翻页, 却不能向前翻页. 常用选项:
- -N 显示每行的行号.
- /字符串 向下搜索"字符串".
- ?字符串 向上搜索"字符串".
- n 重复前一个搜索 (与 / 或 ? 有关).
- N 反向重复前一个搜索 (与 / 或 ? 有关).
- q quit, 退出 less.
head
head 命令会显示文件开头若干行, 在默认情况下, 它会显示文件前 10 行的文本.\
head 命令有一个非常方便的选项:
- -n 选项, 该选项可以指定显示最后 n 行(可以省列n,直接用数字替换n)
head -n 3 test.text //显示前3行
// 可以省列n,直接用数字替换n
head -3 test.text
也可以指定显示最后 n 行.
tail
tail 命令会显示文件结尾若干行, 在默认情况下, 它会显示文件最后 10 行的文本.
tail 命令有一个非常方便的选项:
-
-n 选项, 该选项可以指定显示最后 n 行(可以省列n,直接用数字替换n)
-
-f 选项, 该选项允许你在其他进程使用此文件时查看文件的内容. tail 命令会保持活动状态并持续地显示添加到文件中的内容. 这是实时监测系统日志的绝佳方式.
管道
|
被称作管道文件, 是一种内存级文件.
要显示文件的 991 - 1000 行, 又不想创建临时文件, 就可以使用管道.
head -1000 test.text | tail -10 //先取test文件的前1000项,再取这1000项里面的最后10项
//
编辑文件
vim
vim 中的五种常见模式
命令模式指令集
vim 可以直接用键盘上 ↑ ↓ ← → 来进行移动, 但更正规的做法是用小写英文字母 h, j, k, l, 分别控制光标左, 下, 上, 右移动一格.
- 移动光标
- $ : 移动到光标所在行的 "行尾" (Shift + 4) .
- ^ : 移动到光标所在行的 "行首" (Shift + 6) .
- w : 光标跳到 下个单词的开头 .
- b : 光标回到 上个单词的开头 .
- gg : 使光标移动到 文本的开头 .
- G : 使光标移动到 文本的末端 (Shift + g).
- n + G : 定位光标到 第 n 行行首 (n + Shift + g).
- Ctrl + b : 屏幕往前 (上) 移动一页.
- Ctrl + f : 屏幕往后 (下) 移动一页.
- Ctrl + u : 屏幕往前 (上) 移动半页.
- Ctrl + d : 屏幕往后 (下) 移动半页.
复制粘贴
- yw : 将光标所在之处到 当前单词末端 的字符复制到缓冲区中.
- n + yw: 复制 n 个 单词 到缓冲区.
- yy: 复制光标 所在行 到缓冲区.
- n + yy: 复制 n 行 (包括光标所在行) 到缓冲区.
- p: 将缓冲区内的字符粘贴到 光标所在行的下一行.
- n + p: 将缓冲区内的字符粘贴到 光标所在行的下一行 这一行为重复 n 次.
删除
- x: 每按一次 x , 删除光标所在位置的一个字符.
- n + x: 删除从光标所在字符开始的 n 个字符 (包括光标所在字符本身).
- dd: 删除光标所在行.
- n + dd : 删除光标所在行开始向下 n 行 (包括光标所在行).
撤销
- u: 如果误执行一个命令, 可以马上按下 u, 撤销上一个操作. 按多次 u 可以执行多次复原.
- Ctrl + r : 撤销的恢复.
替换
- r: 替换光标所在处的字符.
- n + r: 对光标字符加之后的共 n 个字符进行批量化替换 (都替换为同一字符).
- R :替换光标所到之处的字符, 直到按下 Esc 键为止 (也就是替换模式) ( Shift + r ).
大小写切换
- ~ ( Shift + ~左边的那个字符 )
插入模式指令集
在插入模式下, 可以对代码做增, 删, 修改的操作, 因此不存在指令集. 但是插入模式也被分为好几种, 换言之就是从命令模式按下 [特定键] 即可进入不同插入模式.
- i: 从光标所在位置开始输入字符.
- Shift + i: 进入插入模式后使光标快速切换到当前行行首.
- a: 从光标所在位置的下一个位置开始输入字符.
- Shift + a: 进入插入模式后使光标快速切换到当前行行尾.
- o: 新起一行 (光标当前所在行的下一行), 从行首开始输入字符.
- Shift + o: 新起一行 (光标当前所在行的上一行), 从行首开始输入字符.
末行模式指令集
- 列出和去除行号
- :set nonu 去除行号.
- :set nu 列出行号.
- 跳到某一行
- :行号 跳到行号所指定的行.
- 查找字符
- /关键字 : 先按 / 键, 再输入想查找的字符, 如果第一次找的字符不是想要的, 可以一直按 n 键会 往后寻找 到最后一个要查找的字符为止.
- ?关键字 : 先按 ? 键, 再输入想查找的字符, 如果第一次找的字符不是想要的, 可以一直按 n 键会 往前寻找 到最后一个要查找的字符为止.
- 替换字符
- %s/替换前的字符串/替换后的字符串/g, 批量替换相同的字符串. %s 可以看成是 C 语言中字符串的格式声明, g 代表 global 整体的.
- 保存及退出vim
- q: 直接退出.
- q!: 强制退出.
- w: 保存.
- wq: 保存并退出.
- wq!: 保存并强制退出.
- 不退出 vim 进行相关指令操作
- ! + 指令 相当于在外部执行指令.
- Press ENTER or type command to continue [按下任意键继续]
- 多文件分屏编辑文本
- vs [文件名] 打开多个文件编辑窗口.
- Ctrl + ww: 切换光标到不同的窗口 (命令模式下的指令).
可视模式指令集
在可视模式下,比较常用的功能是多行注释. 需要配合 [命令模式] 和 [末行模式] 一起使用.
多行注释
Ctrl + v
进入可视模式.- 进入可视模式后, 选择要注释的行, 按
j
往下选择多行. - 然后按下
Shift + i
进入插入模式, 并在光标所在处输入 // . - 然后按下
Esc
键, 完成多行注释, 并回到命令模式.
取消多行注释
Ctrl + v
进入可视模式.- 按两次
l
, 使光标向右移动两次, 将两个/
都选中. - 按
j
键使光标向下移动, 直到选中所有的注释. - 按
d
键即可将所有注释删除, 并自动回到命令模式.
替换模式指令集
R 指令(Shift + r
) 让你一步到位进入替换模式: 对于需要替换多个字符, 更好的方案是直接进入替换模式. 按下大写的R
键, 屏幕左下角出现REPLACE
字样, 说明你已经处于替换模式. 此时输入字符可以连续替换光标及其后边的内容.
Tip: 退格键 (Backspace) 的作用
- 若光标所在字符的左侧字符被替换过, 则使得左侧被替换的字符恢复到原来的字符.
- 若光标所在字符的左侧字符没有被替换过, 则只是使光标简单的向左移动.
网络指令
Linux 提供了丰富的网络工具和命令行指令,用于网络配置、监控和故障排查。以下是一些常见的 Linux 网络工具和指令:
基础网络命令
-
ping
:测试主机与目标主机之间的连通性。ping example.com
-
traceroute
(或tracepath
):显示数据包到达目标主机的路径。traceroute example.com
-
ifconfig
:显示或配置网络接口(已被ip
命令替代)。ifconfig
-
ip
:管理网络接口、路由和 IP 地址(代替ifconfig
)。ip addr show ip route
-
hostname
:显示或设置系统的主机名。hostname
连接和端口
-
netstat
:显示网络连接、路由表、接口状态(被ss
替代)。netstat -an
-
ss
:替代netstat
,用于显示 socket 统计信息。ss -tuln
-
nmap
:网络扫描工具,用于发现主机和服务。nmap -sP 192.168.1.0/24
-
telnet
:用于与远程主机建立明文连接。telnet example.com 80
-
nc
(netcat):网络工具,用于端口扫描、传输数据等。nc -zv example.com 80
-
curl
:用于与 HTTP、FTP 等协议进行数据交互。curl http://example.com
-
wget
:下载文件的网络工具。wget http://example.com/file.zip
-
lsof
:是一个强大的工具,它能够列出系统中打开的文件,包括网络端口相关的文件。要通过网络端口查找 PID,可以使用
lsof -i :<port_number>
网络管理和诊断
-
route
:查看或配置路由表(已被ip route
替代)。route -n
-
arp
:查看或修改系统的 ARP 表。arp -a
-
dig
:用于查询 DNS 信息。dig example.com
-
nslookup
:查询域名的 DNS 信息(类似dig
)。nslookup example.com
-
tcpdump
:抓包工具,用于捕获和分析网络流量。tcpdump -i eth0
-
iftop
:实时显示网络接口的流量使用情况。iftop
-
ethtool
:显示或修改网络接口的设置。ethtool eth0
-
mtr
:结合ping
和traceroute
功能的网络诊断工具。mtr example.com
网络服务和监控
-
systemctl
:启动、停止或查看网络服务状态(如NetworkManager
)。systemctl status NetworkManager
-
nload
:监视网络流量使用情况的工具。nload
-
vnstat
:用于监控和记录网络流量。vnstat -i eth0
这些工具和命令能够帮助你配置、管理和诊断 Linux 系统中的网络环境。根据需求不同,可以选择适当的工具进行网络操作。
pm2
pm2常用命令
npm install pm2 -g 全局安装 pm2
pm2 list 列举所有正在运行的应用
pm2 start app.js 运行应用
pm2 stop app_name 停止应用(通过应用名称)
pm2 stop id 停止应用(通过应用id)
pm2 stop all 停止所有应用
pm2 restart app_name 重启应用(通过应用名称)
pm2 restart id 重启应用(通过应用id)
pm2 restart all 重启所有应用
pm2 delete app_name 删除应用(通过应用名称)
pm2 delete id 删除应用(通过应用id)
pm2 delete all 删除所有应用
pm2 describe app_name 获取应用的详细信息(通过应用名称)
pm2 describe id 获取应用的详细信息(通过应用id)
pm2 monit 显示每个应用的CPU和内存占用情况
pm2日志
PM2 会自动将 stdout
(标准输出)和 stderr
(标准错误)保存到日志文件中。
当你使用 PM2 启动一个 Node.js 应用时,它会为每个应用程序创建两个默认的日志文件:
out.log
: 存储stdout
日志(标准输出,如console.log
、process.stdout.write
)。error.log
: 存储stderr
日志(标准错误,如console.error
、process.stderr.write
)。
如何查看 PM2 日志文件
默认情况下,PM2 会将日志文件保存在 ~/.pm2/logs/
目录下。你可以通过以下几种方式查看日志:
-
查看 PM2 日志路径:
pm2 show <app_name_or_id>
输出中会包含日志文件的路径。
-
查看实时日志:
使用以下命令可以实时查看指定应用的日志输出:
pm2 logs <app_name_or_id>
或者查看所有应用的日志:
// 查看所有应用的日志 pm2 logs pm2 logs [app-name| id] [--err] [--lines=500] // [app-name| id]: 应用名或应用id // --err: 只查看错误日志参数 // --lines=500: 显示最后500行
-
查看特定日志文件:
你也可以通过常规的
cat
、less
或tail
命令查看日志文件,比如:tail -f ~/.pm2/logs/app-name-out.log tail -f ~/.pm2/logs/app-name-error.log
PM2 日志轮转
PM2 支持日志轮转功能,可以防止日志文件变得太大。你可以使用 PM2 自带的 logrotate 模块来自动进行日志文件的切分和归档。
安装 PM2 日志轮转模块:
pm2 install pm2-logrotate
查看和配置日志轮转:
pm2 set pm2-logrotate:max_size 10M # 当日志文件达到 10M 时轮转
pm2 set pm2-logrotate:retain 30 # 保留最近 30 天的日志
总结
PM2 会自动将 Node.js 应用的标准输出和标准错误记录到文件中,并提供工具让你实时查看、管理和轮转这些日志。