关于我到底想做什么的简要背景介绍:
我经常需要设置从远程客户端到本地计算机的公钥身份验证。我试图通过运行一个脚本来自动化这个过程,该脚本将通过 SSH 依次执行 2 件事:
1)通过密码验证的 SSH,在远程机器上使用 ssh-keygen 生成 RSA 密钥并将其保存在预定义的位置
2)在远程机器上获取密钥并进行设置,以便远程机器可以与本地机器进行公钥认证。
我尝试在 ssh 会话中使用 ssh-copy-id 执行 #1 操作,类似地执行 #2 操作。但是,我只收到一个密码提示,即初始 SSH 连接的提示。此时 ssh-copy-id 需要密码验证,但是 SSH 不会发回密码提示,而是收到如下输出:
[localUser@localhost ~]$ ssh remoteUser@remoteIP ssh-copy-id -i ~/authenticationKey localuser@localhost
remoteUser@remoteIP's password: [ENTER]
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
我还应该在这里指出,通过调试消息,我已经确定 ssh 命令连接成功。权限被拒绝的消息来自 ssh-copy-id,而不是 ssh。
在我看来,这是密码提示未从远程客户端传播回 shell 的问题,或者 SSH 试图提交我不知道的密码(或至少不起作用)
我想我可以通过使用 scp 手动完成此操作,但我也部分想知道是否有办法做到这一点,或者至少 ssh 在这里做什么。
感谢你给与我的帮助!
—Bleck H.
答案1
ssh-copy-id
在本地使用或直接使用cat
将公钥复制到本地会更简单authorized_keys
。下面是我操作的方法。
- 从本地
ssh
到远程,使用“ssh-keygen”,如步骤 #1 中所述 - 从本地,
scp
将远程的公钥复制到本地文件tmp.pub
- 在本地,“cat tmp.pub >> /home/jimmy/.ssh/authorized_keys
如果您在步骤 1 中将自己的公钥附加到远程用户的公钥authorized_keys
,那么您可以执行步骤 2 而无需重新输入密码。
你的ssh
命令ssh-copy-id
在远程的子 shell 中执行没有 tty,因此您会看到输出回显到本地,但本地输入不会到达远程子 shell。在我的机器 (Debian Wheezy) 上,我执行了:
yba@tavas:~$ ssh localhost ssh localhost
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/yba/.ssh/id_rsa':
Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
yba@tavas:~$
注意打印的原因“不会分配伪终端,因为 stdin 不是终端”,结果与您在没有密码的情况下在遥控器上按下回车键两次相同。