首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从远程会话中运行时,ssh-copy-id失败

从远程会话中运行时,ssh-copy-id失败
EN

Stack Overflow用户
提问于 2020-08-27 18:46:01
回答 3查看 305关注 0票数 0

我的任务是将ssh密钥从一个节点复制到数组中的所有其他节点。为此,我编写了一个简单的bash脚本,该脚本将自身复制到其他节点并在那里运行它。让我困惑的是,ssh-copy-id在手动执行脚本的节点上工作得很好,但如果在ssh会话中远程运行,它就会失败。脚本如下:

代码语言:javascript
复制
1   #!/bin/bash
2   # keys-exchange.sh

4   nodes=( main worker-01 worker-02 worker-03 )

6   for n in $( echo "${nodes[@]}" ); do
7     [ $n != $HOSTNAME ] && ssh-copy-id $n
8   done

10  if [ -z $REMOTE ]; then
11    for n in $( echo ${nodes[@]} ); do
12      if [ $n != $HOSTNAME ]; then
13        scp $0 $USER@$n:$0 > /dev/null
14        ssh $USER@$n "REMOTE=yes HOSTNAME=$n $0 ; rm -f $0"
15      fi
16    done
17  fi

第6-8行中的代码可以很好地将ssh密钥复制到除其自身之外的所有节点。然后,如果未设置远程变量,则第11-16行中的代码将脚本复制到远程节点(运行脚本的节点除外,第12行)并在那里运行它。在第14行中,我设置并传递了变量REMOTE以跳过第10-17行中的代码块(因此脚本仅将自身从源节点复制到其他节点),以及变量HOSTNAME,因为我发现它没有在ssh会话中设置。在源节点和所有目的节点上,用户名和脚本路径完全相同。

在源节点上运行时,它会正常工作,并要求确认和远程主机的密码。但是,刚刚在源节点上成功运行的脚本在远程ssh会话中运行失败: ssh-copy-id失败,并显示以下错误:

代码语言:javascript
复制
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/username/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: ERROR: Host key verification failed.

此时,远程节点上没有.ssh/known_hosts文件,因此我无法执行ssh-keygen -R。我遗漏了什么,以及如何让它工作?

EN

回答 3

Stack Overflow用户

发布于 2020-08-27 20:16:12

ssh-copy-id不会将您的密钥复制到远程主机,而是将它们添加到~/.ssh/authorized_keys中,当您跳转到远程主机时,没有密钥(或者是密钥?)所以没有更多的东西可以复制。如果ssh-copy-id在没有-i选项的情况下运行,它会从你的~/.ssh目录复制(添加到authorized_keys)所有.pub密钥,这可能不是你想要的,所以我建议像这样运行它:ssh-copy-id -i $key $host

票数 0
EN

Stack Overflow用户

发布于 2020-08-27 20:28:58

代码语言:javascript
复制
ssh $USER@$n "REMOTE=yes HOSTNAME=$n $0 ; rm -f $0"

尝试运行带有"-tt“选项的ssh来请求远程会话的PTY (伪TTY):

代码语言:javascript
复制
ssh -tt $USER@$n "REMOTE=yes HOSTNAME=$n $0 ; rm -f $0"
    ^^^

在您描述的情况下,您将在远程系统上启动ssh以连接到第三个系统。ssh实例没有保存的第三个主机的主机密钥的副本。因此,您通常会期望ssh提示用户是否继续连接到第三台主机。除了它没有提示用户--它只是拒绝连接到第三台主机。

当使用在远程系统上运行的命令调用ssh时,默认情况下,它运行该命令时不带TTY。在本例中,远程ssh实例看到它在没有TTY的情况下运行,并以非交互方式运行。当它是非交互式的时,它不会提示用户输入密码以及是否接受主机密钥。

使用"-tt“运行本地ssh实例会导致它为远程会话请求PTY。因此,远程ssh实例将有一个TTY,它将提示用户--您--进行主机密钥确认等操作。

票数 0
EN

Stack Overflow用户

发布于 2021-11-23 15:59:23

确保在目的地端将/etc/ssh/sshd_config配置为接受所生成的密钥类型。

PubkeyAcceptedKeyTypes ssh-ed25519、ecdsa-sha2-nistp256、ecdsa-sha2-nistp384、ecdsa-sha2-nistp521、ssh-rsa

我使用sshd生成了密钥,但是,下面这一行的末尾没有包含,ssh-rsa,所以即使ssh-copy-id更新了我的目的地,sshd也不接受rsa类型生成的密钥。一旦我添加了,sha-rsasystemctl restart sshd就开始工作了!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63614352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档