在开发和运维工作中,我们经常需要操作位于虚拟机中的系统环境。传统方式是通过虚拟机软件的图形界面直接操作,但这种方式存在明显局限:无法实现快速切换、难以进行批量操作、不方便记录操作历史。SSH(Secure Shell)协议的出现完美解决了这些问题,它就像给你的虚拟机装上了远程控制台,无论物理距离多远,都能像坐在本地一样流畅操作。
我管理着二十多台运行不同Linux发行版的VM虚拟机,每天通过SSH工具进行系统维护、软件部署和日志分析。这种工作方式让我节省了至少60%的操作时间,特别是当需要同时在多个虚拟机执行相同命令时,SSH配合自动化脚本的效率提升更为显著。下面我将分享从环境准备到高级配置的全套实战经验。
VMware和VirtualBox等主流虚拟化软件通常提供三种网络连接模式:
提示:对于需要从外部网络访问的场景,建议选择桥接模式;若只需宿主机访问,NAT或Host-only模式更安全。我个人的开发环境通常选择NAT模式,既保证联网能力又避免外部扫描风险。
以Ubuntu虚拟机为例,安装和启动SSH服务的命令如下:
bash复制sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable --now ssh
关键配置位于/etc/ssh/sshd_config文件,建议修改以下参数:
config复制Port 22 # 默认端口,建议更改为50000以上高位端口
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 推荐禁用密码登录,仅用密钥认证
修改后需重启服务生效:
bash复制sudo systemctl restart ssh
如果虚拟机启用了UFW防火墙,需要放行SSH端口:
bash复制sudo ufw allow 22/tcp # 若修改了默认端口,此处替换为实际端口
sudo ufw enable
对于CentOS等使用firewalld的系统:
bash复制sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
| 工具名称 | 跨平台性 | 会话管理 | 文件传输 | 脚本支持 | 推荐场景 |
|---|---|---|---|---|---|
| OpenSSH | 全平台 | 基础 | 需scp | 优秀 | 命令行纯操作环境 |
| PuTTY | Windows | 良好 | 需pscp | 一般 | Windows简单连接 |
| MobaXterm | Windows | 优秀 | 内置 | 良好 | Windows全能工具 |
| Termius | 全平台 | 优秀 | 内置 | 良好 | 移动端+桌面端 |
| Tabby | 全平台 | 优秀 | 插件支持 | 优秀 | 现代化终端需求 |
我个人日常使用Tabby作为主力SSH客户端,它的多标签管理和主题自定义功能显著提升了工作效率。特别是其内置的SFTP文件浏览器,可以直接拖拽上传下载文件,比传统scp命令直观许多。
基础连接命令格式:
bash复制ssh username@虚拟机IP -p 端口号
例如:
bash复制ssh devuser@192.168.1.100 -p 22022
首次连接时会提示验证主机指纹,输入yes后会将指纹保存到~/.ssh/known_hosts文件中。这是SSH的重要安全机制,用于防止中间人攻击。
比密码更安全的认证方式,操作流程:
bash复制ssh-keygen -t ed25519 -C "your_email@example.com"
建议为密钥设置密码短语(passphrase)增强安全性
bash复制ssh-copy-id -i ~/.ssh/id_ed25519.pub devuser@192.168.1.100 -p 22022
bash复制ssh devuser@192.168.1.100 -p 22022
注意:如果提示"Too many authentication failures",可添加
-o IdentitiesOnly=yes参数限定只使用指定密钥。
在~/.ssh/config中添加以下配置可解决连接超时断开问题:
config复制Host vm-dev
HostName 192.168.1.100
User devuser
Port 22022
ServerAliveInterval 60
TCPKeepAlive yes
IdentityFile ~/.ssh/id_ed25519
这样只需执行ssh vm-dev即可连接,且每60秒会发送心跳包保持连接。
SSH连接复用可以显著减少重复认证的时间消耗:
config复制Host *
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
ControlPersist 4h
配置后,第一个连接会创建控制套接字,后续连接直接复用现有通道,实测连接速度提升80%以上。
如果需要运行虚拟机中的GUI程序,可添加-X或-Y参数:
bash复制ssh -X vm-dev
然后直接运行图形程序命令即可在本机显示界面。我在调试Python可视化工具时经常使用这个功能。
现象:ssh: connect to host 192.168.1.100 port 22: Connection timed out
排查步骤:
ip a或ifconfigsudo systemctl status sshsudo ufw status或sudo firewall-cmd --list-all现象:Permission denied (publickey,password)
解决方案:
ssh -i /path/to/key~/.ssh/authorized_keys文件权限应为600/etc/ssh/sshd_config中PasswordAuthentication yes慢速连接通常由DNS反查导致,在sshd_config中添加:
config复制UseDNS no
GSSAPIAuthentication no
同时客户端配置可添加:
config复制Host *
GSSAPIAuthentication no
bash复制sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑jail.local中[sshd]部分启用保护
完全禁用密码认证,仅允许密钥登录:
config复制PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
对于高安全需求环境,可配置Google Authenticator:
bash复制sudo apt install libpam-google-authenticator
google-authenticator
按照提示完成配置后,在sshd_config中添加:
config复制AuthenticationMethods publickey,keyboard-interactive
通过SSH在多台虚拟机执行相同命令:
bash复制for ip in 192.168.1.{100..110}; do
ssh devuser@$ip "sudo apt update && sudo apt upgrade -y"
done
将虚拟机服务映射到本地端口:
bash复制ssh -L 8080:localhost:80 vm-dev
然后访问本机8080端口即可访问虚拟机的80端口服务
VS Code配合Remote - SSH扩展可实现:
配置步骤:
这种模式让我在Windows宿主机上完美使用Linux虚拟机的完整开发工具链。