ssh 公钥复制

ssh 公钥复制

这个问题在 Stack Overflow 上重复出现,因为我没有从那里得到答案。

我正在尝试制作一个简单的脚本,将公钥导入到其他服务器。

我做了2个选项你可以选择。一种是使用 ssh-copy-id,另一种是简单地将 pub 密钥复制到另一台服务器上的文件。第二个工作正常,但我无法使其与 ssh-copy-id 一起工作。这就是我现在所拥有的:

ssh-copy-id -i $var1 $i

其中 $var1 是“/path/to/the/public_key.pub”,$i 是它们写入 txt 文件的服务器。整个想法是我到处都有我的公共密钥,并且我喜欢在任何地方输入新管理员的公共密钥。它工作正常,但是当我执行时我必须输入我的密码。任何解决方案都可以通过一次输入密码来完成此操作。我还喜欢在添加密钥之前输入新行。但我找不到如何使用 ssh-copy-id 执行此操作的解决方案

答案1

解决办法是这样的。

1) 在您的终端上,创建一个包含要复制 id_rsa.pub 的所有主机/IP 地址的数组。例如

hosts=( host1 host2 192.168.100.200 host4 )

2)创建expect文件,保存它并使其可执行chmod +x filename

#!/usr/bin/expect -f

if { $argc != 4 } {
    puts stderr "usage: ./expt host pass user keyfile"
    exit 2
}

   set host [lindex $argv 0]
   set pass [lindex $argv 1]
   set user [lindex $argv 2]
   set keyfile [lindex $argv 3]

   spawn ssh-copy-id -i $keyfile $user@$host
   expect "assword:"
   send "$pass\n"
   expect eof

3)现在循环遍历保存主机的数组并发送id_rsa.pub

for host in "${hosts[@]}" ; do ./expt "$host" Y0urPassword username ~/.ssh/id_rsa.pub ; done

等待公钥复制到所有主机。

答案2

好吧,我终于得到了这个。现在工作完美。在 for 循环之后的脚本中,我是否添加此行:

/usr/bin/expect <<EOD

以及期望过程的conde,例如:

spawn ssh-copy-id -i test.pub root@<name_host>
        expect "Enter passphrase for key"
        send "$pass\n"
        expect eof
EOD

并且效果完美!

再次感谢您的解释和帮助 val0x00ff

;)

相关内容