Connection refused 通常因 sshd 未运行或仅监听 127.0.0.1,需先用 systemctl status sshd 和 ss -tlnp | grep :22 确认状态与监听地址,再检查 ListenAddress、防火墙、云安全组、认证日志、权限及 SELinux。

ssh 连接失败,大概率不是“不会用”,而是卡在了某个具体环节:服务没开、端口不通、用户权限被拒,或者密钥没放对位置。直接上手试,比读完整教程更有效。
确认远程 Linux 主机已运行 sshd 服务
很多新手连不上,第一反应是“密码错了”,其实根本没走到认证那步——sshd 根本没在运行。
- 登录到目标 Linux 主机(物理机、虚拟机或云服务器),执行:
systemctl status sshd,看输出是否为active (running) - 如果提示
Unit sshd.service could not be found,说明 OpenSSH 服务未安装,Ubuntu/Debian 执行sudo apt install openssh-server,CentOS/RHEL 用sudo yum install openssh-server或sudo dnf install openssh-server - 装完后必须启用并启动:
sudo systemctl enable --now sshd(--now表示同时启动,缺它只设开机自启但当前仍不运行) - 防火墙常被忽略:Ubuntu 的
ufw默认禁用所有入站;CentOS 的firewalld默认不放行 22 端口。确认命令:sudo ufw status verbose或sudo firewall-cmd --list-ports,若无22/tcp,补一条:sudo ufw allow 22或sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reload
ssh 命令连不上时,先查网络和基础参数
本地终端执行 ssh user@host 报错,别急着改配置,先分层验证:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 用
ping host测试 IP 是否可达(注意:有些云主机禁 ping,这步仅作参考) - 用
telnet host 22或nc -zv host 22直接测端口连通性——这是最硬核的判断依据。如果超时或拒绝连接,问题一定出在网络路径(路由器/NAT/安全组/防火墙)上,和 SSH 配置无关 - 常见参数漏写:
-p指定非默认端口(如ssh -p 2222 user@host),-i指定私钥路径(如ssh -i ~/.ssh/mykey user@host),-o ConnectTimeout=5避免卡死 - 用户名写错很隐蔽:Ubuntu 镜像默认用户是
ubuntu,CentOS 是centos,阿里云/腾讯云镜像可能是root或admin,不是所有系统都允许root密码直连
密钥登录失败,90% 是 ~/.ssh/authorized_keys 权限或内容问题
生成密钥、复制公钥后仍提示 Permission denied (publickey),几乎全是服务端文件权限或格式惹的祸。
-
~/.ssh目录权限必须是700(drwx------),authorized_keys文件必须是600(-rw-------)。任意一个权限过宽(比如755或644),sshd会直接拒绝加载密钥 - 公钥必须整行粘贴进
authorized_keys,不能换行、不能有多余空格,开头是ssh-rsa或ssh-ed25519,结尾是邮箱(可选)。用cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"比手动复制更可靠 - 检查
/etc/ssh/sshd_config中这两行是否启用且为yes:PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys(路径别写错) - 改完配置必须重启服务:
sudo systemctl restart sshd,reload不生效
执行单条命令就退出,是因为没分配伪终端(-t 缺失)
想用 ssh user@host command 执行脚本或交互式命令(如 sudo、vim、htop),常遇到命令一闪而过或报错 stdin: is not a tty。
- 根本原因是:SSH 默认不分配终端(TTY),所以无法读取 stdin 或运行需要终端的程序
- 加
-t强制分配:ssh -t user@host "sudo systemctl restart nginx";需要多次交互(如输入 sudo 密码)时,用-tt(双-t)更稳妥 - 批量执行多命令,用引号包裹并注意操作符:
ssh user@host "cd /var/log && tail -n 10 syslog && df -h"。用&&表示前一个成功才执行下一个;用;则不管成败都执行 - 如果命令中含变量或特殊字符(如
$、`),本地 shell 会提前展开,需用单引号或转义:ssh user@host 'echo $PATH',否则$PATH在本地就被替换成你本机的路径了
sshd_config 开关、-t 参数——这些不是“高级技巧”,而是每次连接都绕不开的硬性条件。漏掉任何一个,ssh 就会静默失败,不报具体原因。动手前先盯住这几处,比反复试密码快得多。

















