这个问题在 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
;)