gpt4 book ai didi

linux - 将多个变量从 Bash 脚本传递到 Expect 脚本

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:46 50 4
gpt4 key购买 nike

我一直在尝试获取一个expect/bash脚本,它可以读取CSV文件的每一行并提取主机名地址和密码;因为这些对于我尝试访问的每个 MikroTik 来说都是不同的。

我最近向数千个用作住宅解决方案的 MikroTik 路由器发送了一个 auto.rsc 文件。该文件填满了 HDD(它进行了 IP 扫描,创建了一个成功执行该操作的日志。)这使我无法发送额外的 auto.rsc 文件来清除日志,因为没有可用空间。

我想出的解决方案是使用expect脚本登录这些并删除auto.log文件。我的 RSA 脚本成功了。

set timeout 3
set f [open "dynuList.txt"]
set dynu [split [read $f] "\n"]
close $f

foreach dynu $dynu {
spawn ssh -o "StrictHostKeyChecking no" -i mtk4.key admin+t@$dynu
expect {
"> " { send "\:do \{ file remove push.auto.log \} on-error\=\{ \[\] \}\r" }
"Connection refused" { catch {exp_close}; exp_wait; continue }
eof { exp_wait; continue }
}
expect ".*"
close
wait
}

我遇到问题的脚本如下:

n=`wc -l hostPasswordDynuList.csv | awk '{print$1}'`
i=1
while [ $i -le $n ]
do
host='awk -F "," 'NR==$i {print $1}' hostPasswordDynuList.csv'
password='awk -F "," 'NR==$i {print $2}' hostPasswordDynuList.csv'
./removeLogExpect.sh $host $password
i=`expr $i + 1`
done

应该将变量传递给此期望脚本

#!/usr/bin/bash/expect -f
set timeout 3
set host [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh -o "StrictHostKeyChecking no" admin+t@$host
expect {
"password: " { send $password"\r" }
"Connection refused" { catch {exp_close}; exp_wait; continue }
eof { exp_wait; continue }
}
expect {
".*" { send "\:do \{ file remove push.auto.log \} on-error\=\{ \[\] \}\r" }
}
expect ".*"
close
wait

我希望脚本能够连接并登录到每个没有 RSA key 设置的 MikroTik,然后使用命令清除 auto.log 文件。就目前情况而言,脚本似乎并未将变量传递给预期的一半。任何帮助将不胜感激。

最佳答案

expect 是 Tcl 语言的扩展,Tcl 语言是一种功能齐全的编程语言:它可以读取文件并解析逗号分隔的字段。无需使用低效的 shell 脚本多次调用您的 Expect 程序

#!/usr/bin/bash/expect -f
set timeout 3

set file hostPasswordDynuList.csv
set fh [open $file r]

while {[gets $fh line] != -1} {
lassign [split $line ,] host password

spawn ssh -o "StrictHostKeyChecking no" admin+t@$host
expect {
"password: " { send $password"\r" }
"Connection refused" {
catch {exp_close}
exp_wait
continue
}
eof {
exp_wait
continue
}
}
expect ".*"
send ":do { file remove push.auto.log } on-error={ \[\] }\r"
expect ".*"
exp_close
exp_wait
}

close $fh

参见https://tcl.tk/man/tcl8.6/TclCmd/contents.htm有关 Tcl 内置命令的文档。

expect ".*" 可能没有按照您想象的那样执行:默认模式匹配样式是 glob,因此 .* 查找后跟任意数量字符的文字点。您可能会想到正则表达式“任何字符零次或多次”,您需要为其添加 -re 选项。然而,健壮的期望代码的关键是期望更具体的模式。

关于linux - 将多个变量从 Bash 脚本传递到 Expect 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56552268/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com