银河麒麟V10 SP1桌面版跑SSH服务这件事,我问过身边不少同事,第一反应都是“桌面机装什么SSH,直接坐那儿操作不就行了”。但实际用下来你会发现,一旦管理的麒麟机器超过三五台,或者你需要在Windows主机上同时操作多台麒麟终端,SSH就是绕不开的刚需。平时远程改配置、批量推送文件、帮同事排查系统问题,都靠它。这篇文章我结合自己在一堆麒麟V10 SP1机器上折腾SSH的经历,从安装、配置、免密到排错,把能想到的坑都给你捋一遍。
1. 安装前的准备工作
1.1 先确认你的麒麟版本和CPU架构
银河麒麟桌面版和服务器版的命令集、软件源策略有一定差异,而V10和V10 SP1之间,补丁包和一些系统组件的初始版本也不一样。SP1全称是Service Pack 1,可以理解成V10的第一个大补丁版本,内核、桌面环境、预装应用都有不同程度更新。安装SSH之前,我建议你先确认一下当前系统的准确版本,免得网上搜到的教程跟你机器对不上号,后面操作全是坑。
在终端里执行这三条命令,基本就能摸清系统底细:
cat /etc/os-release uname -a uname -m/etc/os-release能看系统名称和版本号,uname -a看内核信息,uname -m确认架构。银河麒麟V10 SP1目前最常见的是x86_64(AMD64)和aarch64(ARM64)两种架构,你在下载软件包或者配置源时一定要注意区分。x86架构就和普通Ubuntu/Debian的习惯一样,ARM架构在某些软件包上会有专属版本。
提示:我遇到过有人直接拿Ubuntu 20.04的源去给麒麟用,结果装了一半提示依赖冲突。银河麒麟V10 SP1虽然兼容Debian系,但官方源里的软件包都是经过适配的,优先用系统自带源或者麒麟官方源最稳妥。
1.2 检查网络连通性和软件源状态
SSH服务本身不需要联网,但安装openssh-server时如果本地没有缓存好的deb包,就需要从软件源拉取,所以源配置很重要。麒麟桌面版V10 SP1默认会配置官方的软件源,但也可能因为部署环境是内网导致源不可达。
先ping一下源地址或者随便一个内网可达的镜像站,判断网络通不通:
ping -c 4 packages.kylin.com如果网络不通,内网环境需要配置本地源或内网镜像源。这时候你需要看/etc/apt/sources.list和/etc/apt/sources.list.d/目录下的文件,把地址替换成内网可用的源。我见过不少企业在内网自建了麒麟源镜像,这种情况下直接改源地址就行。
源确认没问题,顺手把系统更新一下,避免安装SSH时因为依赖库版本过旧而报错:
sudo apt updateapt update只是刷新软件包索引,不会自动升级系统,放心执行。如果这一步就报错,先解决源的问题再往下走,否则后面装SSH大概率也会失败。
1.3 确认sudo权限和当前用户状态
桌面版麒麟安装时创建的日常用户,通常会被加入sudo组。但内网环境下有部分机器交付时被定制过,普通用户的sudo权限可能被收走了。你可以在终端里试着执行sudo -l,如果能列出可执行的命令,说明sudo可用。
如果提示当前用户不在sudoers中,而你确实需要临时管理权限,可以切到root用户处理。麒麟桌面版默认可能没启用root登录,但单用户模式下是可以重置密码的。不过这篇文章先不展开系统救援那一套,正常办公场景下,装SSH这一步用sudo权限足够了。
2. 安装SSH服务端
2.1 用apt安装openssh-server
确认环境和源都没问题之后,安装SSH服务端其实就一条命令的事。打开终端,执行:
sudo apt update sudo apt install openssh-server -y-y参数是自动确认安装,省得中途还弹一个确认提示。麒麟V10 SP1的软件源里openssh-server版本一般都是8.x,对日常使用来说完全够用。如果你后续要做高版本特性测试,另说。
安装完成后先确认一下版本,顺便看服务是否已经自动起来了:
ssh -V sudo systemctl status sshssh -V输出的是OpenSSH客户端版本,注意这是客户端的版本号。服务端版本你可以通过dpkg -l | grep openssh-server查看。systemctl status ssh能看到服务运行状态,正常情况会显示active (running)。
提示:银河麒麟桌面版的服务名是
ssh,不是sshd。Ubuntu系和Debian系传统上服务名就是ssh,而CentOS系的习惯是sshd。你在网上搜排错教程时,如果对方用的是sshd,命令执行时会提示Unit not found,别慌,换成ssh就好。
2.2 启动服务并设置开机自启
就算安装时服务自动启动了,我还是建议你手动执行一遍启动和自启设置,防止系统某些定制镜像把服务enable状态搞丢了。
sudo systemctl start ssh sudo systemctl enable ssh sudo systemctl status sshenable的作用是创建符号链接,让系统在开机时自动拉起服务,对服务器场景来说这是必须的,否则远程机器重启后你就连不上了,那不是自己给自己找事。麒麟桌面版也会在图形界面右上角弹一些服务通知,如果SSH服务异常,有时候那里也会有提示。
然后确认服务端确实在监听22端口:
sudo ss -tlnp | grep :22ss命令是查看网络套接字的,-t只看TCP,-l只显示监听状态的端口,-n用数字显示地址和端口,-p显示对应进程信息。正常你会看到sshd进程监听在0.0.0.0:22和[::]:22上,前者是IPv4,后者是IPv6。
2.3 桌面版特有的可视化确认
很多人装完SSH喜欢用systemctl看一眼就完事,但麒麟桌面版有个好用的工具——在开始菜单搜索“服务”,打开服务管理器,找到ssh这一项,可以看到运行状态和是否开机自启。虽然命令行够用,但图形化界面在给不熟命令行的同事演示时比较方便。
我之前帮一个客户处理远程连接问题,他们坚持说服务没开,结果我用服务管理器一看,状态是running,纯粹是防火墙拦住了。所以这里补充一句:如果systemctl显示服务正常,但客户端就是连不上,优先查防火墙,别在服务状态上纠结太久。
3. 配置SSH客户端与免密登录
3.1 从其他机器连接麒麟主机
SSH服务端装好之后,首要验证就是从其他机器连接这台麒麟桌面机。如果你从另一台Linux/Mac机器连接,直接:
ssh 用户名@目标IP如果你从Windows连接,新版Windows 10/11自带OpenSSH客户端,打开PowerShell或CMD同样可以执行ssh命令,不需要额外装工具。但这里说句题外话,Windows上我更推荐用PowerShell 7配合Windows Terminal,比CMD体验好很多。
目标IP怎么查?在麒麟机器上执行:
ip addr show或者用hostname -I,直接列出当前所有IPv4地址,简洁明了,适合给新手用。
第一次连接时SSH会提示确认主机指纹,输入yes回车即可,然后输入用户密码。如果密码输入正确但连接被拒绝,那就要进入下面几章的排查环节了。
3.2 配置SSH密钥并实现免密登录
密码登录适合偶尔连一次,要是每天都要在几台机器之间切换,反复输密码确实让人烦躁。配置SSH密钥后,可以实现免密登录,安全性和便利性都拉满。
先在客户端机器上生成密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"-t rsa指定密钥类型,-b 4096指定密钥长度。虽然现在Ed25519算法更流行、安全性更高,但在一些老版本OpenSSH上兼容性不如RSA,我建议企业环境统一用RSA 4096,避免某些老系统不认Ed25519密钥。当然如果你确认两端都是新版本,ssh-keygen -t ed25519也完全没问题。
生成过程会让你确认密钥保存路径(默认~/.ssh/id_rsa),还可以设置一个口令(passphrase)。我建议生产环境密钥最好设置passphrase,并使用ssh-agent管理,这样即使私钥文件泄露,对方没有passphrase也拿不到。个人测试环境嫌麻烦可以留空直接回车。
然后把公钥拷到麒麟机器上:
ssh-copy-id 用户名@目标IP这个命令会把本地~/.ssh/id_rsa.pub的内容追加到目标机器的~/.ssh/authorized_keys文件里,顺便把权限也设置好。执行后会要求输入一次用户密码,之后再进行ssh 用户名@目标IP连接,就不再需要密码了。
3.3 SSH连接工具的选型参考
命令行SSH虽然够用,但日常做文件传输、批量管理时,工具能省不少事。我自己的使用习惯是:命令行处理临时连接,图形化工具处理大批量文件传输和复杂会话管理。除了Windows系统自带的SSH客户端,Xshell、FinalShell在运维圈用得也比较多,而VS Code的Remote-SSH插件对开发环境尤其友好——直接把远程麒麟机器的目录当成本地工程打开编辑,远程调试Python、C++都很方便。
搜索热词里还有人提到Bitvise SSH Server,这其实是Windows端的SSH服务端软件,思路和Linux的openssh-server一样,都是为了实现Windows能被远程SSH连接。如果你需要反向操作,把麒麟当客户端去连Windows,Bitvise的客户端工具也可以装一下试试。不过我个人还是偏向命令行或VS Code,尤其是密钥配置好之后体验最好。
4. SSH服务端安全配置
4.1 修改SSH配置前的备份习惯
服务端刚装好时,默认配置对个人使用来说没问题,但放在办公环境或生产环境,就必须做安全加固了。SSH主配置文件是/etc/ssh/sshd_config,任何修改之前,先备份是个好习惯,别嫌麻烦。我有一次改完端口忘了保留旧会话,重启服务后防火墙没放行新端口,差点把自己锁在外面。从那以后我养成了两个习惯:一是先备份,二是改配置必须保持至少一个已建立的会话别断开。
备份命令:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)这样备份文件名带日期,后续想回滚也能知道哪个是最新的。然后用编辑器打开配置文件:
sudo vim /etc/ssh/sshd_config不熟悉vim的可以用sudo nano /etc/ssh/sshd_config,都行。
4.2 关键参数逐项解析和推荐值
/etc/ssh/sshd_config里的配置项很多,但不是每个都需要动。我挑几个最重要的展开说说,你按自己环境决定怎么改。
端口号(Port)
默认监听22端口,这是全网扫描器最喜欢探测的端口,建议改成一个高位端口,比如2222或6022。改完记得通知所有需要连接的人,不然同事会以为系统坏了。配置写法:
Port 6022改完之后,客户端连接命令要加-p参数:
ssh -p 6022 用户名@目标IPRoot登录策略(PermitRootLogin)
桌面版其实平时很少需要直接root登录SSH,建议改成prohibit-password或直接no。prohibit-password表示禁止root密码登录,但允许密钥登录;no则是完全禁止root远程登录。我个人推荐prohibit-password,这样真有紧急情况还能用root密钥登录,比锁死更灵活。
PermitRootLogin prohibit-password密码认证开关(PasswordAuthentication)
既然配置了密钥登录,密码认证就可以考虑关闭。但关闭前一定要确认密钥已经能正常登录,否则你会发现自己把唯一入口也关了。
PasswordAuthentication no我这里说的no是相对严格的生产环境配置。你的测试机如果不想折腾密钥,保留yes也问题不大,但要配好Fail2ban或至少把MaxAuthTries调低。
最大认证尝试次数(MaxAuthTries)
默认值是6,配合密码登录容易被人暴力破解,调低到3比较合理:
MaxAuthTries 3允许登录的用户(AllowUsers)
如果这台麒麟机器只允许特定用户通过SSH登录,显式声明一下更安全:
AllowUsers kylin adminAllowUsers后面的用户名用空格分隔。这个参数慎用,因为你漏了某个用户,他再来问你怎么连不上,你就得背锅了。
空闲超时(ClientAliveInterval)
防止有人挂着SSH会话不关掉,浪费连接资源:
ClientAliveInterval 300 ClientAliveCountMax 2这两行表示每300秒检查一次客户端是否存活,连续2次无响应就断开连接。对办公环境比较友好,避免一堆僵尸会话占着系统资源。
限制可使用的SSH协议版本
OpenSSH 8以上版本默认只支持SSH 2.0,这个不用特别配置,但如果你用的是很老的客户端,可能需要关注一下兼容性。
4.3 防火墙和SELinux/AppArmor的适配
改完sshd_config后,有一半的“连接不上”问题出在防火墙。银河麒麟桌面版默认可能没有启用防火墙,但很多安全基线要求打开。先检查状态:
sudo ufw status如果显示Status: active,需要放行SSH端口。假设你改了端口为6022:
sudo ufw allow 6022/tcp sudo ufw reload如果你改回默认22端口,直接sudo ufw allow 22/tcp也行。
麒麟桌面版还有个特点,基于Debian系,默认使用的是AppArmor而不是SELinux。如果碰到SSH服务起不来,但配置看着没问题、端口也没被占用,可以查一下AppArmor的日志:
sudo dmesg | grep -i denied sudo journalctl -u ssh | tail -50正常使用场景下,AppArmor对SSH的默认策略不会拦截,但某些安全加固镜像可能会额外添加策略,这时候可以临时把某个进程的profile设为complaining模式来排查,不过这个操作需要谨慎,不建议在生产环境随意执行。
4.4 重启服务并验证配置
修改完配置,先做语法检查,再重启服务:
sudo sshd -t sudo systemctl restart sshsshd -t会检查配置语法,如果有错误会直接输出提示,这是我每次改动配置后必做的检查。确认服务正常后,再开一个新终端连接测试,千万不要在现有SSH会话里跑重启命令然后立刻断开连接——如果配置有误,服务可能起不来,你连补救的机会都没有。多开一个会话测试是保命技巧。
测试连接时可以用-v参数打印详细连接日志:
ssh -v -p 6022 用户名@目标IP这个参数在排查问题时候特别有用,本地和远程的协商过程都会打印出来。之前遇到一个奇怪的问题,客户端一连接就被断开,用-vvv才发现是服务端accept了连接但/etc/motd里的某个字符造成客户端崩溃,清理之后就恢复正常了。
5. 常见问题排查与避坑技巧
5.1 连接超时还是连接拒绝,先分清现象
SSH连不上时,很多人只会说“连不上”,但排查思路完全取决于具体报错。我总结了一个简单的速查表:
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| Connection refused | sshd服务未启动、端口未监听、防火墙丢包但没拒绝 | 查服务状态、查端口监听、查防火墙规则 |
| Connection timed out | 网络不通、防火墙直接丢弃包、跨网段路由异常 | ping测试、排查路由、确认安全组策略 |
| Permission denied (publickey,password) | 密码错误、密钥不匹配、sshd配置禁止对应认证方式 | 确认密码、重新配置密钥、检查sshd_config |
| Connection closed by remote host | sshd启动异常、PAM模块问题、hosts.deny限制 | 看服务端journal日志、检查PAM配置 |
| No supported authentication methods | 客户端算法太旧、服务端关闭了密码认证 | 换用新客户端、临时开启密码认证以便恢复 |
遇到问题时先别乱试,按表格里的方向去查,效率高得多。
5.2 密码正确但一直提示认证失败
这种情况最常见的坑是/etc/ssh/sshd_config里PasswordAuthentication被设成了no,但你自己忘了,或者系统加固基线默认改掉了。排查时用sudo grep -E "PasswordAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config看一眼。
另一个坑是/etc/security/access.conf或/etc/hosts.deny限制了来源IP。我遇到过一台交付前做了安全基线的麒麟机器,/etc/hosts.deny里写了sshd: ALL,结果所有人被拒之门外。这种排查起来很隐蔽,因为sshd_config怎么看都没问题,服务也正常,但就是连不上。建议遇到诡异问题时,把/var/log/auth.log打开看最后几行,线索基本都在里面。
5.3 密钥登录配置好了还是提示输密码
密钥登录失败通常有三类原因。
第一类是权限不对。~/.ssh目录权限必须是700,~/.ssh/authorized_keys文件权限必须是600,否则sshd会出于安全考虑拒绝读取。修复命令:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys第二类是sshd_config里PubkeyAuthentication被改成no了,这个自己检查。
第三类最隐蔽:~/.ssh/authorized_keys文件的所有者不是当前登录用户,而是root或者其他用户。尤其是用sudo创建文件时容易踩这个坑。修复方法:
sudo chown 用户名:用户名 ~/.ssh/authorized_keys还有一点,如果家目录权限本身是777,sshd也会拒绝读取授权文件,建议~目录权限保持755或750。
注意:密钥登录配置完成后,建议先不要关闭密码认证,等你确认密钥能稳定登录了,再回头改
PasswordAuthentication no。这一步能帮你避免“自己把自己锁在门外”的尴尬。
5.4 systemd服务名不一致
我在前面提过,麒麟桌面版的服务名是ssh而不是sshd。但有些从CentOS习惯转过来的运维会习惯性敲systemctl status sshd,一看Unit not found就以为服务没装。这时候可以用systemctl list-unit-files | grep ssh看看系统里有哪些SSH相关单元,你就知道该用哪个服务名了。
另外,麒麟V10 SP1上如果同时安装了openssh-server和openssh-client,systemctl列表里通常只有ssh.service一个服务单元,没有单独的sshd.service。这个设计跟Debian系一致,习惯了就好。
5.5 修改用户密码时被PAM策略卡住
搜索热词里有人问“银河麒麟系统怎么修改普通用户密码”,这个和SSH登录也有点关系——如果你SSH登录进去后想帮同事改密码,可能会遇到密码复杂度限制。麒麟默认的PAM配置对密码长度、字符类型有要求,直接用passwd设置弱密码可能会被拒绝。
修改普通用户密码的正确姿势:
sudo passwd 用户名如果被PAM策略挡住,有两个选择:换一个符合复杂度要求的强密码,或者临时调整/etc/pam.d/common-password里的pam_pwquality.so配置。生产环境建议用强密码,别为了一时方便给安全留后门。
修改完密码后,如果这个用户正在SSH连接中,他的现有会话不会被踢掉,但下次登录必须使用新密码。如果你用密钥登录,密码修改不影响密钥认证。
5.6 桌面环境下挂载数据盘导致的家目录权限问题
搜索热词里有人提到“银河麒麟桌面操作系统v10数据盘路径改成数据盘”,这个跟SSH的关系在于:如果系统盘空间不够,很多人会把/home分区迁移或额外挂载一块数据盘,然后把用户家目录指过去。这种情况下,如果挂载配置里没有正确设置权限,用户家目录可能是700或750,但所有者变成root了,或者文件系统挂载参数带了noexec之类的限制,SSH密钥登录可能直接失效。
排查方法很简单:
df -h | grep /home ls -ld /home/用户名如果家目录所有者异常,用chown修正。如果挂载参数有问题,改/etc/fstab里的对应行,去掉不必要的noexec或nosuid参数,然后重新挂载。这个坑比较冷门,但在桌面版上真实存在,特别是那些喜欢把数据单独放一块盘的场景。
6. 桌面环境下的配置文件路径与数据路径
6.1 SSH相关配置文件的位置
整理一份麒麟桌面版V10 SP1上SSH相关的常用路径,方便你快速定位问题:
| 文件/目录 | 作用 |
|---|---|
| /etc/ssh/sshd_config | 服务端主配置文件 |
| /etc/ssh/ssh_config | 客户端全局配置文件 |
| /etc/ssh/ssh_host_rsa_key | RSA主机私钥 |
| /etc/ssh/ssh_host_ed25519_key | Ed25519主机私钥 |
| ~/.ssh/id_rsa | 用户RSA私钥 |
| ~/.ssh/id_rsa.pub | 用户RSA公钥 |
| ~/.ssh/authorized_keys | 服务端保存的客户端公钥列表 |
| /var/log/auth.log | SSH认证日志 |
我在实际工作中发现,很多人只盯着sshd_config改配置,忘了客户端也有配置文件,结果客户端这边UserKnownHostsFile或者IdentityFile指向不对,密钥就是用不上。排查问题时,两端配置都检查一遍会省很多时间。
6.2 验证SSH连接花费几分钟但进不去
如果你发现SSH连接要停好久才提示输密码,通常是UseDNS和GSSAPIAuthentication这两个配置在拖后腿。UseDNS yes会让服务端反向解析客户端IP的域名,内网没有DNS时会卡到超时;GSSAPIAuthentication yes在跨域认证场景会尝试Kerberos认证,家用办公环境根本用不到。
建议把这几个参数在/etc/ssh/sshd_config里显式改掉:
UseDNS no GSSAPIAuthentication no重启服务后,连接速度会有明显提升。这个优化虽小,但对那