ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ssh-copy-id 提示成功,但 Dropbear 仍无法免密登录

ssh-copy-id 提示成功,但 Dropbear 仍无法免密登录 一、问题现象开发服务器需要频繁通过 SSH、SCP 连接嵌入式板ssh rootXXX scp XXX rootXXX:/home/root/app/但每次都需要输入 root 密码使用很不方便执行公钥安装ssh-copy-id -i ~/.ssh/id_ed25519.pub rootXXX提示添加成功Number of key(s) added: 1但强制使用公钥测试时仍然失败ssh -o PasswordAuthenticationno root10.129.6.190结果为Permission denied (publickey,password)也就是说公钥看起来已经添加但板端没有接受。二、先理解免密登录原理~/.ssh/id_ed25519 私钥 ~/.ssh/id_ed25519.pub 公钥可以简单理解为私钥保存在开发服务器上的钥匙 公钥安装在目标设备上的锁目标设备将允许登录的公钥保存到~/.ssh/authorized_keys登录过程如下客户端发起连接 ↓ 客户端使用私钥签名 ↓ 服务端使用 authorized_keys 中的公钥验证 ↓ 验证成功允许免密登录私钥不会传到板端传过去的只有公钥。三、使用详细日志分析 SSH执行ssh -vvv -o BatchModeyes rootXXX true日志中出现Remote software version dropbear_2020.81这说明板端使用的不是常见的 OpenSSH Server而是嵌入式系统常用的 Dropbear。日志还显示Offering public key: /home2/XXX/.ssh/id_ed25519说明客户端确实找到了正确的私钥并向板端发送了对应公钥。随后出现Authentications that can continue: publickey,password Permission denied (publickey,password)问题已经缩小到板端板端收到公钥后没有认可。四、分析板端为什么拒绝公钥公钥没有写入 Dropbear 实际读取的文件。$HOME/.ssh权限不正确。标准 Dropbear通常读取$HOME/.ssh/authorized_keys但部分厂商定制版本可能读取/etc/dropbear检查公钥被写到了哪里检查两个可能的位置for file in \ /home/root/.ssh/authorized_keys \ /etc/dropbear/authorized_keys do if [ -f $file ]; then echo 文件: $file ls -l $file awk {print NR, $1} $file fi done实验发现/home/root/.ssh/authorized_keys只有旧的RSA公钥 /etc/dropbear/authorized_keys包含新安装的ED25519公钥也就是说ssh-copy-id虽然提示成功但把公钥写到了/etc/dropbear/authorized_keys定位 ssh-copy-id 的处理逻辑grep -n dropbear /usr/bin/ssh-copy-id本机 OpenSSH 8.9p1 的ssh-copy-id包含类似逻辑case $REMOTE_VERSION in dropbear*) installkeys_sh /etc/dropbear/authorized_keys esac它检测到远端是 Dropbear 后默认将公钥写入/etc/dropbear/authorized_keys但当前 Yocto 板的 Dropbear 实际读取/home/root/.ssh/authorized_keys两者路径不一致正是问题根因。五、解决方案将公钥安装到正确位置在开发服务器执行这个脚本 install-ssh-key.sh#!/bin/sh set -eu if [ $# -lt 1 ] || [ $# -gt 2 ]; then echo 用法: $0 用户IP [公钥文件] 2 exit 2 fi TARGET$1 PUBLIC_KEY_FILE${2:-$HOME/.ssh/id_ed25519.pub} PRIVATE_KEY_FILE${PUBLIC_KEY_FILE%.pub} if [ ! -f $PUBLIC_KEY_FILE ]; then echo 找不到公钥: $PUBLIC_KEY_FILE 2 exit 1 fi if [ ! -f $PRIVATE_KEY_FILE ]; then echo 找不到对应私钥: $PRIVATE_KEY_FILE 2 exit 1 fi echo 正在给 $TARGET 安装公钥如有提示请输入该目标当前的登录密码。 sed -n 1p $PUBLIC_KEY_FILE | ssh -o StrictHostKeyCheckingaccept-new $TARGET set -eu IFS read -r public_key remote_user$(id -un) user_home$(awk -F: -v user$remote_user \$1 user { print $6; exit }\ /etc/passwd) if [ -z $user_home ]; then user_home${HOME:-} fi case $user_home in /*) ;; *) echo 无法确定远端用户家目录 2 exit 1 ;; esac mkdir -p $user_home/.ssh chmod 700 $user_home/.ssh touch $user_home/.ssh/authorized_keys grep -Fqx $public_key $user_home/.ssh/authorized_keys 2/dev/null || \ printf %s\n $public_key $user_home/.ssh/authorized_keys chmod 600 $user_home/.ssh/authorized_keys chmod go-w $user_home 2/dev/null || true echo 正在验证免密登录... if ssh -o BatchModeyes -o PasswordAuthenticationno \ -o IdentitiesOnlyyes -i $PRIVATE_KEY_FILE $TARGET true; then echo 成功: $TARGET 已可免密登录 else echo 失败: 公钥已写入但远端 SSH 服务仍未接受请检查远端 SSH 配置。 2 exit 1 fi使用方法/home2/renmaoquan/install-ssh-key.sh rootXXX脚本会自动查找远端用户的真实家目录。写入/home/root/.ssh/authorized_keys。保留已有公钥避免重复添加。设置正确的700/600权限。安装后自动验证免密登录。不再写入无效的/etc/dropbear/authorized_keys。六、验证实际生效位置强制关闭密码认证ssh -o ControlPathnone \ -o IdentitiesOnlyyes \ -i ~/.ssh/id_ed25519 \ -o PasswordAuthenticationno \ rootBOARD_IP登录成功后临时移走错误位置的文件mv /etc/dropbear/authorized_keys \ /etc/dropbear/authorized_keys.test-disabled重新建立全新 SSH 连接仍然可以登录证明实际生效的是/home/root/.ssh/authorized_keys确认无误后再删除临时文件rm /etc/dropbear/authorized_keys.test-disabled七、结论ssh-copy-id检测到Dropbear ↓ 公钥写入/etc/dropbear/authorized_keys ↓ Yocto板实际读取/home/root/.ssh/authorized_keys ↓ 命令提示添加成功但公钥认证失败解决方法是绕过当前ssh-copy-id的 Dropbear路径判断将公钥安装到板端用户真实的$HOME/.ssh/authorized_keys
返回列表