Linux 在expect脚本中使用if/else
我最近更新并重新格式化了我的/etc/hosts文件,并希望通过每个系统(大约1000个)来刷新我已知的_hosts文件。我正在考虑使用expect脚本向RSA指纹问题发送“是”。很简单。然而,我知道其中一些系统对我来说是全新的,我的密码还没有设置。这创造了两种可能性:Linux 在expect脚本中使用if/else,linux,expect,Linux,Expect,我最近更新并重新格式化了我的/etc/hosts文件,并希望通过每个系统(大约1000个)来刷新我已知的_hosts文件。我正在考虑使用expect脚本向RSA指纹问题发送“是”。很简单。然而,我知道其中一些系统对我来说是全新的,我的密码还没有设置。这创造了两种可能性: “是”发送到RSA指纹问题,我已登录 服务器。然后我需要发送一个出口来关闭连接 在移动到下一个主机之前。或者 “是”被发送到RSA指纹问题,我收到 提示从当前密码和密码开始更新我的密码 然后输入两次新密码。连接将 更新密码后自动
set file1 [open [lindex $argv 0] r]
set pw1 [exec cat /home/user/.pw1.txt]
set pw2 [exec cat /home/user/.pw2.txt]
while {[gets $file1 host] != -1} {
puts $host
spawn -noecho "ssh $host"
expect {
"continue connecting"{
send "yes\r"
expect {
"current" {
send $pw2\r
} "New password" {
send $pw1\r
} "Retype new password" {
send $pw1\r
}
}
expect "msnyder"
send "exit\r"
}
interact
}
file1变量是要运行脚本的主机列表
我知道它不准确,因为它在第22行出错。但是,我不知道需要修复什么。您可能可以避免让脚本像人一样运行,而只是生成一个预期会失败的ssh连接,该连接将自动接受主机RSA密钥,而无需提示输入密码;稍后,对于需要启动密码的新系统,您可以这样做 暂时尝试将其添加到~/.ssh/config文件中,直到脚本完成:
Host *
Protocol 2
PasswordAuthentication 0
StrictHostKeyChecking 'no'
CheckHostIP 'no'
UserKnownHostsFile ~/.ssh/known_hosts_new
然后当新的know_hosts_新文件加载时,您可以替换默认的~/.ssh/known_主机,并从配置中删除UserKnownHostsFile行。您可以避免让脚本像人一样运行,只需生成一个预期会失败的ssh连接,该连接将自动接受主机RSA密钥,而无需提示密码;稍后,对于需要启动密码的新系统,您可以这样做 暂时尝试将其添加到~/.ssh/config文件中,直到脚本完成:
Host *
Protocol 2
PasswordAuthentication 0
StrictHostKeyChecking 'no'
CheckHostIP 'no'
UserKnownHostsFile ~/.ssh/known_hosts_new
然后,当加载新的known\u hosts\u新文件时,您可以替换默认的~/.ssh/known\u hosts,并从配置中删除userknown hosts文件行。我发现了两个错误:
while {[gets $file1 host] != -1} {
puts $host
spawn -noecho "ssh $host"
expect {
"continue connecting" {
send "yes\r"
expect {
"current" {
send -- $pw2\r
exp_continue
}
"New password" {
send -- $pw1\r
exp_continue
}
"Retype new password" {
send -- $pw1\r
exp_continue
}
msnyder
}
send "exit\r"
}
}
interact
}
注:
用于“循环”到exp\u continue
语句:在这种情况下,您将看到所有的“当前”、“新建”和“重新键入”,因此在看到提示之前,您不想退出expect
- 养成键入
的习惯。如果没有双破折号,当有人用前导破折号输入密码时,你会感到惊讶李>send--something
- 我发现了两个错误:
- 缺少闭合大括号,可能用于“继续连接”块
- “继续连接”的大括号前缺少空格。Tcl(因此Expect)对空格非常敏感,因为它在计算命令之前被解析为单词。有关极少数血淋淋的细节,请参阅 您的代码可能如下所示:
注:while {[gets $file1 host] != -1} { puts $host spawn -noecho "ssh $host" expect { "continue connecting" { send "yes\r" expect { "current" { send -- $pw2\r exp_continue } "New password" { send -- $pw1\r exp_continue } "Retype new password" { send -- $pw1\r exp_continue } msnyder } send "exit\r" } } interact }
用于“循环”到exp\u continue
语句:在这种情况下,您将看到所有的“当前”、“新建”和“重新键入”,因此在看到提示之前,您不想退出expect
- 养成键入
的习惯。如果没有双破折号,当有人用前导破折号输入密码时,你会感到惊讶李>send--something