使用 SSH 管理服务器的经验
本文最后更新于 2025年9月20日 晚上
前言
前几天朋友给了我服务器来跑一些东西,这下又有算力可以使用了喵,真的非常感谢朋友给予我的帮助。
不过这次拿到的是装有 Linux 的服务器,相比于装有 Windows 的服务器,没有了图形化界面,在操作上麻烦了很多。不过对于接触过 Linux,还经常使用 Msys2 的本喵来说,操作 Linux 服务器并不是很难(要成为运维高手了喵)。
下面就顺手记录一些遇到的问题和解决方法。
SSH 密钥配置
配置 SSH 密钥后就可以直接免密码连接服务器,但是想把平常使用的 SSH 密钥和服务器使用的密钥分开,这时候就需要生成多个密钥了。
生成 SSH 密钥的命令是这样的:
1 |
|
-t
参数指定生成密钥的类型,可以指定的类型有rsa
、dsa
、ecdsa
、ed25519
。如果需要增加密钥长度来提升安全性,可以使用-b
参数指定密钥长度。
密钥生成后默认保存在~/.ssh
目录,不同密钥类型对应的默认文件名如下:
- rsa:
id_rsa
、id_rsa.pub
- dsa:
id_dsa
、id_dsa.pub
- ecdsa:
id_ecdsa
、id_ecdsa.pub
- ed25519:
id_ed25519
、id_ed25519.pub
后缀有.pub
的为公钥,没有这个后缀名的就是私钥。公钥和私钥是成对存在的,相互匹配成功了才能解密成功而建立连接。公钥用在被连接端,而私钥用在连接发起端,私钥是千万不可以泄露出去的哦。
当使用 SSH 连接服务器时,SSH 会尝试寻找与服务器端上的公钥相匹配的私钥,从那些默认的文件名进行寻找,匹配上就能连接,否则就报错。
假如想自定义密钥文件的路径,可以使用-f
参数指定,这样就可以多个同一协议的密钥共存了呢。
1 |
|
不过自定义名称的密钥生成在~/.ssh
这个路径,SSH 也不会去寻找这些自定义名称的密钥(太坑了喵),不过这个问题在使用 SSH 去连接服务器的部分讲讲怎么解决。
有了密钥后,服务器端还要配置一下公钥,把.pub
后缀的文件里的内容复制下来,
把这个内容写在服务器端~/.ssh/authorized_keys
中,还有服务器端也要配置一下 sshd,配置文件在/etc/ssh/sshd_config
,要调的内容如下:
1 |
|
配置完 sshd 后重启 sshd 服务:
1 |
|
一些参考教程:
使用 SSH 密钥连接服务器
比如服务器的地址是180.1.1.1
,用户名是root
,SSH 端口是22
,则 SSH 连接服务器的命令如下:
1 |
|
如果有额外要指定的 SSH 配置,比如要指定PubkeyAuthentication=yes
和IdentitiesOnly=yes
,就用-o
参数。
1 |
|
如果有个配置好的密钥,但是名称不是 SSH 默认的密钥名称,可以使用-i
参数去指定密钥文件(要指定私钥文件哦),比如:
1 |
|
常用的 SSH 参数可以参考:ssh 命令,Linux ssh 命令详解:openssh套件中的客户端连接工具 - Linux 命令搜索引擎
配置 SSH 设置文件
每次用 SSH 连接服务器要输入好多参数呢,怎么办呢,写一个自定义 SSH 配置就好了,把配置文件保存在~/.ssh/config
里。
比如写个叫server1
的配置文件,连接服务器的命令是ssh -p 22 root@180.1.1.1 -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i ~/.ssh/server1
,则命令写进配置文件中是这样的。
1 |
|
则 SSH 连接服务器的命令就简化成了这么简单的:
1 |
|
当然在这个命令上仍然还能指定其他的参数呢,比如启用压缩数据,就加个-C
参数。
1 |
|
配置 SSH 的代理
SSH 默认是不走代理的,即使代理软件开启了 TUN 模式也不会走代理,需要通过传递ProxyCommand
参数来启用,ProxyCommand
将调用代理软件去应用代理。常用的代理软件是 ncat,在 Linux 上自带,Windows 上需要手动安装 Nmap(Nmap 附带 ncat)。
比如当前的代理地址是127.0.0.1:10808
,代理协议是socks5
,ncat 的安装路径在D:/Nmap/ncat.exe
,则应用代理的命令长这样:
1 |
|
这个当然可以写在 SSH 的配置文件中。
1 |
|
不过不是很推荐把这个应用代理的参数写在文件里就是了,毕竟哪天代理软件换了,代理地址可能也会变,如果忘记改配置文件就连不上服务器了喵。
保持进程不被关闭
使用 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 工作区 (如果有多个工作区的话,该指令会优先进入最后一个退出的工作区):
1 |
|
- 进入指定的工作区:
1 |
|
- 创建新的工作区:
1 |
|
- 关闭工作区:
1 |
|
一个小小的技巧,把这个 Shell 代码保存到.bashrc
/.bash_profile
/.zshrc
中(Shell 配置文件),然后使用source
命令重新加载 Shell 配置文件:
1 |
|
这样就可以用tmux_session <工作区名称>
打开或者进入之前已经创建的工作区了喵。
Tmux 可以参考的说明:
文件传输
传输文件可以用scp
命令来实现,这个命令类似cp
命令,用法类似,也就是指定本地的路径和一个服务器的路径就行,服务器路径要加上服务器地址去指定,也就是<<用户名>@<服务器地址>>:<服务器的路径>
。
比如向刚刚的服务器传输/home/User/1.sh
文件到服务器的/root/test
路径,命令就这么写:
1 |
|
如果是从服务器传输到本地就把这两个路径反过来就行了呢。传输的如果是文件夹,记得加上-r
参数哦。
除了scp
命令,还有sftp
呢,不过这个命令提供了交互式的文件传输环境,首先需要进入交互式环境:
1 |
|
接下来就能使用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 映射服务器上的服务到本地端口
假如在服务器的7860
和8188
分别开了两个服务,想从本地的3000
和4000
端口分别去访问这两个服务,这时候可以用这个 SSH 命令的-L
参数。
1 |
|
或者写在 SSH 配置也可以喵:
1 |
|
然后使用ssh server1
去连接服务器后也是同样的效果呢。连接成功后虽然还是想之前一样进入了服务器的终端,但是本地就可以通过127.0.0.1:3000
和127.0.0.1:4000
分别访问服务器的7860
和8188
端口上的服务了呢。
其他的小工具
在服务器上有些工具挺好用的呢。
- Zsh + Oh My Zsh
装上后有了更好用的命令补全,打命令顺手多了喵,安装非常简单:
1 |
|
- uv
uv 装 Python 软件包真的太快了,用法就看看这个吧:uv docs
- MicroMamba
轻量级 Conda 管理器,装环境方便,以前有写过一篇安装方法,看这个配置 MicroMamba 就行:配置 MicroMamaba 包管理器 - licyk的小窝