当服务器询问“是/否”问题时自动进行 sshpass

当服务器询问“是/否”问题时自动进行 sshpass

我有这个小脚本,用于连接到我没有 ssh-key 的新机器:

function my_ssh () {
    ip=$1
    optional_cmd=$2

    ssh -o "BatchMode yes" user_name@$ip exit > /dev/null 2>&1

    if [ $? -gt 0 ]; then
        echo "1st time connection - adding key to authorized keys list"
        sshpass -p "secret_password" ssh-copy-id user_name@$ip
    fi

    echo $optional_cmd
    ssh -X user_name@$ip $optional_cmd
}

对于拥有我的 ssh-key 或仅要求输入密码才能使用 ssh-copy-id 的服务器,此方法效果很好。但是,有些服务器在以下问题后要求回答“是/否”:

无法确定主机“ABCD ()”的真实性。ECDSA 密钥指纹为 SHA256:****。您确定要继续连接吗(是/否)?

我怎样才能添加一个“是”字符串回显到服务器问题标准输入中,然后使用 sshpass?

ps,我查看了 sshpass 代码github但它似乎不是sshpass为这样的事情设计的。我想我可以修改它以满足我的需求,但如果可能的话,我更喜欢使用正常的Linux机制

答案1

为了回答 OP 关于在 ECDSA 密钥指纹提示上输入“是”的问题,我只建议对本地主机 SSHds 这样做 - 永远不会在实验性的 docker 容器设置之外的任何情况下这样做,您可以执行以下操作:

sshpass -p 'password' ssh \
  -o StrictHostKeyChecking=no \
  [email protected] -p 2222 'whoami'

用例?您可以让一个nobody用户成为唯一允许通过密码 SSH 进入计算机的用户(所有其他用户都设置为需要密钥)。然后,您可以获取所需的一些系统信息,例如,在您尝试编排时。

sshpass -p 'meminfo' ssh \
  -o StrictHostKeyChecking=no \
  [email protected] -p 2222 "egrep 'Mem|Cache|Swap' /proc/meminfo"

结果可能是这样的。

Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
SSHPASS searching for password prompt using match "assword"
[email protected]'s password: 
SSHPASS detected prompt. Sending password.
SSHPASS read: 

MemTotal:       16369628 kB
MemFree:          683412 kB
MemAvailable:    8847748 kB
Cached:          6544572 kB
SwapCached:          460 kB
SwapTotal:       2097148 kB
SwapFree:        2071928 kB

然后,您可以nmap在 LAN 上建立集群或 Pi(或 docker 容器),然后自动检查它们的运行情况,而无需添加 NodeJS 或 Python 或健康 API 服务。

如果你已经完成实验并想要清理那些橡皮图章的 ECDSA 指纹,你可以运行:

ssh-keygen -f "~/.ssh/known_hosts" -R "[127.0.0.1]:2222"

警告:我必须提醒大家甚至如果用户发现某些设置了位的特权命令,则上述操作nobody可能会很危险suid- nobodys 仍然可以以 root 身份运行!

答案2

我遇到了同样的问题,并通过添加以下两行解决了它:

UserKnownHostsFile=/dev/null
StrictHostKeyChecking=no

在 /etc/ssh/ssh_config 中

似乎 sshpass 实际上正在读取该文件而不是使用 -o 选项

答案3

解决方法:

list.txt
vm1.example.com
vm2.example.com
vm3.example.com
...

for i in $(cat list.txt); do timeout 1 ssh -o StrictHostKeyChecking=no user@$i; done
for i in $(cat list.txt); do ssh-copy-id -i user@$i; done

ssh [email protected] -- no pass

相关内容