从命令行自动接受 rsa 密钥指纹

Ven*_*ngs 21 ssh rsa known-hosts ssh-keys

我已尝试yes | ssh root@10.x.x.x尝试接受 RSA 密钥指纹,但仍会提示我是否确定要连接。有没有办法让这个自动?

Nik*_* Š. 27

OpenSSH 7.6StrictHostKeyChecking=accept-new正是为此目的引入了新设置:

ssh(1): expand the StrictHostKeyChecking option with two new
   settings. The first "accept-new" will automatically accept
   hitherto-unseen keys but will refuse connections for changed or
   invalid hostkeys. This is a safer subset of the current behaviour
   of StrictHostKeyChecking=no. The second setting "n", is a synonym
   for the current behaviour of StrictHostKeyChecking=no: accept new
   host keys, and continue connection for hosts with incorrect
   hostkeys. A future release will change the meaning of
   StrictHostKeyChecking=no to the behaviour of "accept-new".
Run Code Online (Sandbox Code Playgroud)

OpenSSH 7.6 发行说明

  • @ClémentMoulin-SimpleRezo,不太正确:如果你连接到一个真正的**未知**主机,你无论如何都不知道它的指纹,所以你会点击“是的,信任它”。我还没有看到有人手动检查主机指纹。如果您有单独分发的指纹(例如,您公司的 SSH 堡垒主机或类似的东西),最好将它们放入“known_hosts”文件中,以便 SSH 客户端为您检查它们。因此,在某些用例中,此设置可能会导致严重的安全隐患,但它们非常具体。 (5认同)
  • 不要在配置文件中添加accept-new!如果连接到未知主机,这可能是一个安全问题,默认情况下它将接受,从而使您面临中间人攻击。如果这个设置不是默认设置,那是因为它不安全! (4认同)
  • 这就是为什么 SSH 指纹也可以通过 DNS 分发,当然,最好使用 DNSSEC。绝对不同意你最后的评论。主机识别是识别中最重要的部分。 (3认同)
  • 我从来没有说过不是。但你没有办法识别你第一次连接的主机,对此一无所知,所以我看不到任何安全好处。是的,DNSSEC 验证很好,如果它存在并启用,则会进行自动检查,但我从未在野外遇到过它(不幸的是)。我不建议人们默认为所有主机启用“StrictHostKeyChecking=accept-new”,但我也不认为这是一种违规。 (3认同)
  • 为了节省一些点击次数,将“StrictHostKeyChecking=accept-new”放在 ~/.ssh/config 中以使其工作。 (2认同)

RDP*_*RDP 14

使用已知主机密钥以编程方式使用 SSH

如果您想要的是能够以编程方式使用并避免中间人攻击,那么我建议您使用命令获取已知指纹ssh-keyscan。例子:

$ ssh-keyscan -t rsa,dsa github.com 2>/dev/null
github.com ssh-dss AAAAB3NzaC1kc3MAAACBANGFW2P9xlGU3zWrymJgI/lKo//ZW2WfVtmbsUZJ5uyKArtlQOT2+WRhcg4979aFxgKdcsqAYW3/LS1T2km3jYW/vr4Uzn+dXWODVk5VlUiZ1HFOHf6s6ITcZvjvdbp6ZbpM+DuJT7Bw+h5Fx8Qt8I16oCZYmAPJRtu46o9C2zk1AAAAFQC4gdFGcSbp5Gr0Wd5Ay/jtcldMewAAAIATTgn4sY4Nem/FQE+XJlyUQptPWMem5fwOcWtSXiTKaaN0lkk2p2snz+EJvAGXGq9dTSWHyLJSM2W6ZdQDqWJ1k+cL8CARAqL+UMwF84CR0m3hj+wtVGD/J4G5kW2DBAf4/bqzP4469lT+dF2FRQ2L9JKXrCWcnhMtJUvua8dvnwAAAIB6C4nQfAA7x8oLta6tT+oCk2WQcydNsyugE8vLrHlogoWEicla6cWPk7oXSspbzUcfkjN3Qa6e74PhRkc7JdSdAlFzU3m7LMkXo1MHgkqNX8glxWNVqBSc0YRdbFdTkL0C6gtpklilhvuHQCdbgB3LBAikcRkDp+FCVkUgPC/7Rw==
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
Run Code Online (Sandbox Code Playgroud)

然后您可以伪造一个脚本将其保存到一个临时文件并使用该UserKnownHostsFile选项。下面的例子是一个脚本,可以调用ssh_github

#!/bin/bash

HOSTKEY='github.com ssh-dss AAAAB3NzaC1kc3MAAACBANGFW2P9xlGU3zWrymJgI/lKo//ZW2WfVtmbsUZJ5uyKArtlQOT2+WRhcg4979aFxgKdcsqAYW3/LS1T2km3jYW/vr4Uzn+dXWODVk5VlUiZ1HFOHf6s6ITcZvjvdbp6ZbpM+DuJT7Bw+                      h5Fx8Qt8I16oCZYmAPJRtu46o9C2zk1AAAAFQC4gdFGcSbp5Gr0Wd5Ay/jtcldMewAAAIATTgn4sY4Nem/FQE+XJlyUQptPWMem5fwOcWtSXiTKaaN0lkk2p2snz+EJvAGXGq9dTSWHyLJSM2W6ZdQDqWJ1k+cL8CARAqL+UMwF84CR0m3hj+wtVGD/J4G5kW2DBAf4/bqzP4469lT+dF2FRQ2L9JKXrCWcnhMtJUvua8dvnwAAAIB6C4nQfAA7x8oLta6tT+oCk2WQcydNsyugE8vLrHlogoWEicla6cWPk7oXSspbzUcfkjN3Qa6e74PhRkc7JdSdAlFzU3m7LMkXo1MHgkqNX8glxWNVqBSc0YRdbFdTkL0C6gtpklilhvuHQCdbgB3LBAikcRkDp+FCVkUgPC/7Rw==
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+                                                                                                                                      PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+    2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=='

TEMPFILE=$(mktemp)
echo "$HOSTKEY" > $TEMPFILE

ssh -o "UserKnownHostsFile $TEMPFILE" $@

rm $TEMPFILE
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以只运行ssh_github而不是,ssh即使没有known_hosts放置脚本的文件,它也会连接。


小智 9

将这些添加到您的 bash 启动文件或类似文件中:

 #
 #  ssh + scp without storing or prompting for keys.
 #
 function sshtmp
 {
     ssh -o "ConnectTimeout 3" \
         -o "StrictHostKeyChecking no" \
         -o "UserKnownHostsFile /dev/null" \
              "$@"
 }
 function scptmp
 {
     exec scp -o "ConnectTimeout 3" \
         -o "StrictHostKeyChecking no" \
         -o "UserKnownHostsFile /dev/null" \
         "$@"
 }
Run Code Online (Sandbox Code Playgroud)

然后使用sshtmp, orscptmp代替sshand scp

注意如果您确实沿着这条路走下去,您将不会收到主机密钥已更改的警报,并且会失去安全性。

  • 这个答案如何?问题是自动接受密钥,而不是忽略它们!如果在这里提出并回答了这个问题,那么我如何找到“自动接受密钥”这个实际问题的答案?讨厌做一个downvote但来吧的人,这不是堆栈交换的方式! (19认同)
  • 谢谢`ssh -o "StrictHostKeyChecking no" root@10.xxx` 为我工作 (4认同)

小智 6

我只是使用:

ssh -o StrictHostKeyChecking=no user@host
Run Code Online (Sandbox Code Playgroud)

它也可以与 pssh 一起使用:

pssh -O StrictHostKeyChecking=no -h list.text -l user -A -i "cmd"
Run Code Online (Sandbox Code Playgroud)