2017-01-28 56 views
1

我在其他地方发现这个代码在计算器:SSH密钥,但凯基-F不工作

if [ -z "`ssh-keygen -F ${wPCS_IP}`" ]; then 
    ssh-keyscan -p ${wPCS_PT} -H ${wPCS_IP} >> ~/.ssh/known_hosts 
fi 

我有,我正在使用的代码的两个问题:

  1. 这代码生成即使它成功的错误($α= 1)。

  2. 如果我在追加known_hosts后再次运行ssh-keygen -F $ {wPCS_IP},它在known_hosts中找不到键,即使它们刚刚添加。这是更大的问题。

本地机器是Ubuntu Server 16.04 LTS,远程机器是Ubuntu Server 14.04 LTS。

我的代码和代码示例,我发现的主要区别是我使用的端口选项-p的。

另外,我注意到known_hosts文件没有按名称或IP地址列出机器。这与我的Gentoo笔记本电脑不同。

+0

试着告诉'ssh-keygen'这个'known_hosts'文件在哪里。更好的方法是,如果! ssh-keygen -F $ {wPCS_IP} -f〜/ .ssh/known_hosts>/dev/null 2>&1;那么ssh-keyscan -p $ {wPCS_PT} $ {wPCS-IP} >>〜/ .ssh/known_hosts; fi'。 – alvits

+0

感谢您的回复。我完全按照原样使用了你的命令,并产生了相同的结果。它添加了known_hosts所需的行,但是当再次运行时,它不会检测known_hosts文件中的主机并再次生成它们。 – Raydude

+0

在Ubuntu 16.04服务器上,known_hosts文件列出了远程机器的端口号。我想知道是否需要为ssh-keygen -F指定端口吗? – Raydude

回答

1

所以事实证明,当有对SSH备用端口,它存储在known_hosts文件在此格式的IP地址的一部分:

[${WPCS_IP}]:WPCS_PT 

这意味着对于if语句工作,它需要像这样:

if ! ssh-keygen -F "[${wPCS_IP}]:${WPCS_PT}" -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${wPCS_PT} ${wPCS-IP} >> ~/.ssh/known_hosts; fi 

感谢alvits你为我在正确的方向前进......

更新:原来在Ubuntu 16.04密型ts远程主机的IP地址(但不是端口)。我仍在试图找出如何适应这种差异。

另一个更新:原来,-H选项是什么失败。一旦你散列密钥,它不会被发现。这个工程在Ubuntu 14.04:

if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 
if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 

你可以看到,第一,如果语句生成键扫描数据,并且因为键扫描的数据是正确的第二个没有,但如果你添加-H,凯基没有检测散列键条目...

但是,要获得类似的命令在Ubuntu 16.04的工作,如果有改变:

if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 

在这种情况下known_hosts文件中必须包括端口.. 。

-H是右出在这里。如果使用-H生成,if将不会找到该密钥。

令人沮丧的是,行为因版本而异,最安全的散列版本不起作用。

又一编辑:这可能是在known_hosts中被指定的端口时在远程服务器中的sshd_config使用非标准端口。这可能是一种预期的行为。