我目前正在从事一个我继承的项目,该项目要求我记录用于重新映像机器并在其上安装软件的设备设置过程。
我正在使用 Raspberry Pi 作为主机来安装操作系统和软件,但在安装脚本的最后一部分遇到了问题,这部分要求我能够通过 SSH 执行命令并获取返回值。我尝试执行的命令如下:
ssh -o StrictHostKeyChecking=no host uname -a &>/dev/null
rc=$?
这是逐字逐句的命令。主机没有指定用户,也没有输入密码,因此我假设它是通过密钥进行身份验证的。我对 SSH 了解不多,但由于每个 Pi 上都应该有相同的图像,我假设 SSH 密钥是相同的,所以我将 /etc/ssh 的内容从旧设备复制到新设备。我没有费心复制 ~/.ssh 的内容,因为两个设备上该目录中的唯一文件是 known_hosts。
但是,尽管具有相同的设置和相同的 SSH 密钥,旧命令仍然能够毫无困难地执行此命令,而新命令则需要输入 root@host 密码。
还有什么会影响我执行此命令的能力?我是否缺少一些晦涩的 SSH 配置?我查看了 Google 上几乎所有可以找到的内容,唯一能找到的答案是在需要执行命令的机器上生成一个密钥并将其安装在主机的 authorized_keys 文件中 - 但由于 Pi 甚至没有这个文件,并且旧 Pi 已经在 /etc/ssh 中拥有密钥,我认为这些密钥用于此目的,我不明白为什么具有相同设置和相同密钥的新 Pi 会无法进行身份验证。
答案1
要使密钥认证工作正常,authorized_keys 文件中必须有公钥,并且文件权限必须不允许除所有者之外的任何人写入文件。该文件的默认位置是.ssh/authorized_keys .ssh/authorized_keys2
,但可以AuthorizedKeysFile
使用 中的选项进行更改/etc/ssh/sshd_config
。还可以在命令行上指定配置文件的另一个位置,也可以在命令行上覆盖选项。
如果这不能帮助您解决问题,您应该查看 sshd 日志以找出问题所在。您可能必须将日志级别(sshd 选项LogLevel
)提高到 VERBOSE 或 DEBUG。
答案2
好的,经过进一步挖掘,我发现 /root 下有一个单独的 .ssh 目录,其中包含一个 authorized_keys 文件。将其复制到新 Pi 后,它就可以正常工作了。我一直在想是否有一个单独的 root 配置文件夹,但我从未在 /root 周围挖掘过,所以我不知道它在那里。