我的脚本的目标是通过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,登录名和密码作为我的期望脚本的参数传递。
Name:@IP:RootLogin:Password
....
此文件包含名称,地址IP,服务器的root登录名和密码。
#!/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文件上提到的所有服务器。但是暂时无法正常工作。
我想知道我在做什么错,您能帮我解决这个问题吗?
答案 0 :(得分:0)
答案:
IPSvr
与IP
一些代码回顾:您可以在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