无可用Shell的SSH账户添加公钥实现免密登录的方法
无可用Shell的SSH账户添加公钥实现免密登录的方法
这个场景我之前碰到过!因为登录后直接启动游戏,根本没有常规shell可用,常规的ssh-copy-id和scp都会因为终端环境问题或者无法启动shell而失败,不过我们可以利用SSH的命令执行模式绕过默认的登录程序(那个游戏),直接在远程执行添加公钥的操作。
下面是具体的实现方法:
方法一:管道传输公钥并执行配置命令(推荐,不用手动复制公钥)
直接把本地公钥的内容通过管道传给远程,同时执行创建目录、写入公钥、设置权限的命令:
cat ~/.ssh/id_ed25519.game.pub | ssh -T guest@game.example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
执行的时候会提示你输入guest账户的密码,输入后就能自动完成配置。
方法二:手动复制公钥内容执行命令
如果管道方式有问题,也可以手动复制公钥内容:
- 先在本地查看并复制你的公钥完整内容:
cat ~/.ssh/id_ed25519.game.pub
把输出的整行内容(比如ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILxxxxxx user@home)完整复制下来。
- 执行下面的命令,把
<你的公钥内容>替换成刚才复制的字符串:
ssh -T guest@game.example.com "mkdir -p ~/.ssh && echo '<你的公钥内容>' >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
同样输入密码后完成配置。
关键细节解释
-T参数:禁用伪终端分配,因为远程登录后没有可用的终端环境,加上这个参数可以避免出现Error opening terminal: unknown的错误。mkdir -p ~/.ssh:确保.ssh目录存在,不存在就创建,存在的话不会报错。- 权限设置:
~/.ssh必须设为700(只有所有者能读写执行),authorized_keys设为600(只有所有者能读写),这是SSH密钥认证的硬性要求,权限不对会导致密钥无法被识别。 - 命令执行优先级:SSH连接时指定的命令会替代远程默认的登录程序(也就是那个终端游戏)运行,所以我们能绕过游戏直接执行配置命令。
验证是否成功
配置完成后,试试用密钥登录:
ssh -i ~/.ssh/id_ed25519.game guest@game.example.com
如果能直接进入游戏,不需要输入密码,就说明免密登录配置成功啦!
备注:内容来源于stack exchange,提问作者MestreLion
相关产品推荐
相关产品推荐

