使用 SSH 管理服务器的经验

本文最后更新于 2025年9月20日 晚上

前言

前几天朋友给了我服务器来跑一些东西,这下又有算力可以使用了喵,真的非常感谢朋友给予我的帮助。

不过这次拿到的是装有 Linux 的服务器,相比于装有 Windows 的服务器,没有了图形化界面,在操作上麻烦了很多。不过对于接触过 Linux,还经常使用 Msys2 的本喵来说,操作 Linux 服务器并不是很难(要成为运维高手了喵)。

下面就顺手记录一些遇到的问题和解决方法。

SSH 密钥配置

配置 SSH 密钥后就可以直接免密码连接服务器,但是想把平常使用的 SSH 密钥和服务器使用的密钥分开,这时候就需要生成多个密钥了。

生成 SSH 密钥的命令是这样的:

1
ssh-keygen -t ed25519

-t参数指定生成密钥的类型,可以指定的类型有rsadsaecdsaed25519。如果需要增加密钥长度来提升安全性,可以使用-b参数指定密钥长度。

密钥生成后默认保存在~/.ssh目录,不同密钥类型对应的默认文件名如下:

  • rsa:id_rsaid_rsa.pub
  • dsa:id_dsaid_dsa.pub
  • ecdsa:id_ecdsaid_ecdsa.pub
  • ed25519:id_ed25519id_ed25519.pub

后缀有.pub的为公钥,没有这个后缀名的就是私钥。公钥和私钥是成对存在的,相互匹配成功了才能解密成功而建立连接。公钥用在被连接端,而私钥用在连接发起端,私钥是千万不可以泄露出去的哦。

当使用 SSH 连接服务器时,SSH 会尝试寻找与服务器端上的公钥相匹配的私钥,从那些默认的文件名进行寻找,匹配上就能连接,否则就报错。

假如想自定义密钥文件的路径,可以使用-f参数指定,这样就可以多个同一协议的密钥共存了呢。

1
ssh-keygen -t ed25519 -f ~/.ssh/server1

不过自定义名称的密钥生成在~/.ssh这个路径,SSH 也不会去寻找这些自定义名称的密钥(太坑了喵),不过这个问题在使用 SSH 去连接服务器的部分讲讲怎么解决。

有了密钥后,服务器端还要配置一下公钥,把.pub后缀的文件里的内容复制下来,

把这个内容写在服务器端~/.ssh/authorized_keys中,还有服务器端也要配置一下 sshd,配置文件在/etc/ssh/sshd_config,要调的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 加载其他 sshd 的配置文件
Include /etc/ssh/sshd_config.d/*.conf

# SSH 端口
Port 22

# 控制 root 用户是否可以通过 SSH 远程登录
PermitRootLogin yes

# 控制是否允许使用密码认证登录, 禁止后需使用密钥验证
PasswordAuthentication yes

# 控制是否允许空密码用户登录
PermitEmptyPasswords no

# 控制是否使用 PAM 进行认证
UsePAM yes

# 控制是否允许通过 SSH 转发 X11 图形界面
X11Forwarding yes

# 控制登录时是否显示 MOTD 信息
PrintMotd no

# 控制允许客户端传递哪些环境变量到服务器
AcceptEnv LANG LC_*

# 配置 SFTP 子系统
Subsystem sftp /usr/lib/openssh/sftp-server

配置完 sshd 后重启 sshd 服务:

1
/etc/init.d/ssh restart

使用 SSH 密钥连接服务器

比如服务器的地址是180.1.1.1,用户名是root,SSH 端口是22,则 SSH 连接服务器的命令如下:

1
ssh -p 22 root@180.1.1.1

如果有额外要指定的 SSH 配置,比如要指定PubkeyAuthentication=yesIdentitiesOnly=yes,就用-o参数。

1
ssh -p 22 root@180.1.1.1 -o IdentitiesOnly=yes -o PubkeyAuthentication=yes

如果有个配置好的密钥,但是名称不是 SSH 默认的密钥名称,可以使用-i参数去指定密钥文件(要指定私钥文件哦),比如:

1
ssh -p 22 root@180.1.1.1 -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i ~/.ssh/server1

配置 SSH 设置文件

每次用 SSH 连接服务器要输入好多参数呢,怎么办呢,写一个自定义 SSH 配置就好了,把配置文件保存在~/.ssh/config里。

比如写个叫server1的配置文件,连接服务器的命令是ssh -p 22 root@180.1.1.1 -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i ~/.ssh/server1,则命令写进配置文件中是这样的。

1
2
3
4
5
6
7
Host server1
HostName 180.1.1.1
Port 22
User root
IdentitiesOnly yes
PubkeyAuthentication yes
IdentityFile ~/.ssh/server1

则 SSH 连接服务器的命令就简化成了这么简单的:

1
ssh server1

当然在这个命令上仍然还能指定其他的参数呢,比如启用压缩数据,就加个-C参数。

1
ssh -C server1

配置 SSH 的代理

SSH 默认是不走代理的,即使代理软件开启了 TUN 模式也不会走代理,需要通过传递ProxyCommand参数来启用,ProxyCommand将调用代理软件去应用代理。常用的代理软件是 ncat,在 Linux 上自带,Windows 上需要手动安装 Nmap(Nmap 附带 ncat)。

比如当前的代理地址是127.0.0.1:10808,代理协议是socks5,ncat 的安装路径在D:/Nmap/ncat.exe,则应用代理的命令长这样:

1
ssh -o ProxyCommand="D:/Nmap/ncat.exe --proxy 127.0.0.1:10808 --proxy-type socks5 %h %p" server1

这个当然可以写在 SSH 的配置文件中。

1
2
3
4
5
6
7
8
Host server1
HostName 180.1.1.1
Port 22
User root
IdentitiesOnly yes
PubkeyAuthentication yes
IdentityFile ~/.ssh/server1
ProxyCommand D:/Nmap/ncat.exe --proxy 127.0.0.1:10808 --proxy-type socks5 %h %p

不过不是很推荐把这个应用代理的参数写在文件里就是了,毕竟哪天代理软件换了,代理地址可能也会变,如果忘记改配置文件就连不上服务器了喵。

保持进程不被关闭

使用 SSH 连接上服务器后,如果突然中断连接,并且还有进程正在跑着,那断开连接后进程就会强制关闭了呢(有重要的进程被关掉就完了喵),这时候 Tmux 就派上用场了喵,而且还能同时打开多个终端呢。

常用的 Tmux 快捷键如下:

功能 快捷键
Prefix 键 (当按下Prefix 键并松开后才可以使用 Tmux 的快捷键,Prefix 键相当于快捷键激活键,防止误触) Ctrl + b
创建新窗口 c
向左切换窗口 p
向右切换窗口 n
切换指定窗口 0 ~ 9
关闭窗口 &
划分左右的小窗口 (Pane) %
划分上下的小窗口 (Pane) "
切换小窗口 (Pane) 方向键
切换指定小窗口 (Pane) (在按下q时,Tmux 会显示一个小窗口对应的数字) q + 数字
最大化或最小化选中的小窗口 z
关闭选中的小窗口 (当一个大窗口里的最后一个小窗口被关闭时,大窗口也会被关闭) x
查看 Tmux 所有窗口 (用方向键回车键可以选择进入指定的大窗口) w
退出当前 tmux 工作区 (会话) (此时 tmux 的工作区会被保留下来,保持运行) d
进入命令行模式 (类似 Vim 进入命令行模式的方法,只不过 Tmux 要先按Prefix 键) :
进入翻页模式 (退出翻页模式直接按q,未进入翻页模式前无法使用滚轮或者键盘上的方向键进行翻页查看) [

快捷键使用为Prefix 键 + 其他按键,如创建新窗口为Prefix 键 + c,实际操作为先按下Prefix 键(Ctrl + b),然后松开 Prefix 键,再按下c键。

常用的命令有这些:

  • 查看工作区列表:
1
tmux ls
  • 进入 Tmux 工作区 (如果有多个工作区的话,该指令会优先进入最后一个退出的工作区):
1
tmux attach
  • 进入指定的工作区:
1
2
tmux attach -t <工作区对应数字>
tmux attach -t <工作区名称>
  • 创建新的工作区:
1
2
tmux                       # 使用 Tmux 默认分配的工作区名称
tmux new -s <工作区名称> # 创建指定名称的工作区
  • 关闭工作区:
1
2
tmux kill-session -t <工作区数字>
tmux kill-session -t <工作区名称>

一个小小的技巧,把这个 Shell 代码保存到.bashrc/.bash_profile/.zshrc中(Shell 配置文件),然后使用source命令重新加载 Shell 配置文件:

1
2
3
tmux_session() {
tmux attach -t "$@" || tmux new -s "$@"
}

这样就可以用tmux_session <工作区名称>打开或者进入之前已经创建的工作区了喵。

文件传输

传输文件可以用scp命令来实现,这个命令类似cp命令,用法类似,也就是指定本地的路径和一个服务器的路径就行,服务器路径要加上服务器地址去指定,也就是<<用户名>@<服务器地址>>:<服务器的路径>

比如向刚刚的服务器传输/home/User/1.sh文件到服务器的/root/test路径,命令就这么写:

1
2
3
4
scp /home/User/1.sh root@180.1.1.1:/root/test

# 或者使用 SSH 配置文件中的服务器名
scp /home/User/1.sh server1:/root/test

如果是从服务器传输到本地就把这两个路径反过来就行了呢。传输的如果是文件夹,记得加上-r参数哦。

除了scp命令,还有sftp呢,不过这个命令提供了交互式的文件传输环境,首先需要进入交互式环境:

1
sftp server1

接下来就能使用sftp进行文件传输了喵。常用的命令如下:

  • 文件和目录操作
命令 作用
ls 列出远程目录内容
lls 列出本地目录内容
pwd 显示远程当前目录
lpwd 显示本地当前目录
cd <远程路径> 切换远程目录
lcd <本地路径> 切换本地目录
  • 文件传输命令
命令 作用
get <远程文件路径> 下载文件到本地
get <远程文件路径> <本地文件路径> 下载文件并重命名
put <本地文件路径> 上传文件到远程
put <本地文件路径> <远程文件路径> 上传文件并重命名
get -r <远程文件夹路径> 下载目录
put -r <本地文件夹路径> 上传目录
  • 其他常用命令
命令 作用
mkdir <远程文件夹路径> 在远程创建目录
lmkdir <本地文件夹路径> 在本地创建目录
rm <远程文件路径> 删除远程文件
rmdir <远程文件夹路径> 删除远程空目录
rename <远程文件路径> <新的远程文件路径> 重命名远程文件
chmod <模式> <远程文件路径> 更改远程文件权限
chown <用户名>:<用户组> <远程文件路径> 更改远程文件所有者
df 显示远程文件系统信息
!command 执行本地命令
help 显示帮助信息
quit/exit 退出 SFTP

使用 SSH 映射服务器上的服务到本地端口

假如在服务器的78608188分别开了两个服务,想从本地的30004000端口分别去访问这两个服务,这时候可以用这个 SSH 命令的-L参数。

1
ssh -L 3000:localhost:7860 -L 4000:localhost:8188 server1

或者写在 SSH 配置也可以喵:

1
2
3
4
5
6
7
8
9
10
Host server1
HostName 180.1.1.1
Port 22
User root
IdentitiesOnly yes
PubkeyAuthentication yes
IdentityFile ~/.ssh/server1
ProxyCommand D:/Nmap/ncat.exe --proxy 127.0.0.1:10808 --proxy-type socks5 %h %p
LocalForward 3000 localhost:7860
LocalForward 4000 localhost:8188

然后使用ssh server1去连接服务器后也是同样的效果呢。连接成功后虽然还是想之前一样进入了服务器的终端,但是本地就可以通过127.0.0.1:3000127.0.0.1:4000分别访问服务器的78608188端口上的服务了呢。

其他的小工具

在服务器上有些工具挺好用的呢。

  • Zsh + Oh My Zsh

装上后有了更好用的命令补全,打命令顺手多了喵,安装非常简单:

1
2
apt install zsh git curl -y
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  • uv

uv 装 Python 软件包真的太快了,用法就看看这个吧:uv docs

  • MicroMamba

轻量级 Conda 管理器,装环境方便,以前有写过一篇安装方法,看这个配置 MicroMamba 就行:配置 MicroMamaba 包管理器 - licyk的小窝


使用 SSH 管理服务器的经验
https://licyk.netlify.app/2025/09/19/ssh-usage-experience/
作者
licyk
发布于
2025年9月19日
许可协议