【问题标题】:Expect script to deploy SSH key isn't working期望部署 SSH 密钥的脚本不起作用
【发布时间】:2019-05-14 22:04:22
【问题描述】:

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

为了实现这个目标,我使用了 3 个文件。

创建参数

#!/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、Login 和 Passwd 作为参数传递给我的期望脚本。

服务器列表.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 文件中提到的所有服务器。不过暂时不能用。

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

【问题讨论】:

标签: bash shell ssh expect


【解决方案1】:

答案:

  1. 你使用了错误的变量名:IPSvr vs IP
  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

在expect中,在一个命令中从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,这样 shell 就不会扩展期望变量。

#!/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多