预期用于部署SSH密钥的脚本不起作用

时间:2018-12-13 16:21:49

标签: bash shell ssh expect

我的脚本的目标是通过ssh-copy-id将ssh密钥部署到服务器的100。

要实现此目标,我使用了3个文件。

CreateParam

#!/bin/bash
 while read line;
   do
     IPSrv=`echo $line | cut -d":" -f1`
     Login=`echo $line | cut -d":" -f2`
     Passwd=`echo $line | cut -d":" -f3`
     ./deployssh.sh $IP $Login $Passwd
 done < ServerList.txt

该脚本允许我将IP,登录名和密码作为我的期望脚本的参数传递。

ServerList.txt

Name:@IP:RootLogin:Password
....

此文件包含名称,地址IP,服务器的root登录名和密码。

deployssh.sh

#!/usr/bin/expect -f
set IPSrv [lindex $argv 1]
set Login [lindex $argv 2]
set Passwd [lindex $argv 3]

spawn ssh-copy-id $IPSrv@$Login -o StrictHostKeyChecking=no
expect -re "password:"
send -- "$Passwd\r"

该期望脚本应该将我的ssh密钥部署到ServerList文件上提到的所有服务器。但是暂时无法正常工作。

我想知道我在做什么错,您能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

答案:

  1. 您使用了错误的变量名:IPSvrIP
  2. 好像有一个错误:在解析ServerList.txt时,您需要字段2、3、4

一些代码回顾:您可以在shell部分中简化解析-read命令可以将一行拆分为多个字段。另外,此方法可让您在密码中输入冒号。

#!/bin/bash
while IFS=: read -r hostname IP Login Passwd; do
    ./deployssh "$IP" "$Login" "$Passwd"
done < ServerList.txt

并且可以预料的是,用一个命令从argv中提取所有单词,然后等待ssh-copy-id命令完成,然后退出。

#!/usr/bin/expect -f
lassign $argv IPSrv Login Passwd

spawn ssh-copy-id $IPSrv@$Login -o StrictHostKeyChecking=no
expect -re "password:"
send -- "$Passwd\r"
expect eof

或者,因为它们都很短,所以请使用环境将它们组合起来以传递变量,并使用 quoted heredoc,以便外壳程序不扩展期望变量。

#!/bin/bash
export IP Login Passwd
while IFS=: read -r hostname IP Login Passwd; do
    expect <<'END_EXPECT'
        spawn ssh-copy-id $env(IP)@$env(Login) -o StrictHostKeyChecking=no
        expect -re "password:"
        send -- "$env(Passwd)\r"
        expect eof
END_EXPECT
done < ServerList.txt