【发布时间】:2019-06-11 22:08:41
【问题描述】:
我一直在尝试获取一个可以读取 CSV 文件的每一行并提取主机名地址和密码的 expect/bash 脚本;因为对于我尝试访问的每个 MikroTik,这些都是不同的。
我最近向数千个用作住宅解决方案的 MikroTik 路由器发送了一个 auto.rsc 文件。这个文件填满了硬盘(它有一个 IP 扫描,它创建了一个日志来成功地做这件事。)这阻止了我发送额外的 auto.rsc 文件来清除日志,因为没有可用的空间。
我想出的解决方案是使用期望脚本登录这些并删除 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 密钥的每个 MikroTik,然后使用命令清除 auto.log 文件。就目前而言,脚本似乎没有将变量传递给期望的一半。任何帮助将不胜感激。
【问题讨论】:
-
Shellcheck 为您的代码生成17 findings。您应该在继续之前修复它们。
-
awk的调用次数很多。为什么不只是:while IFS=, read -r host pass junk; do ./removeLogExpect.sh "$host" "pass"; done < hostPasswordDynuList.csv? -
对不起。我不知道像 Shellcheck 这样的东西。了解未来真是太棒了!
标签: linux bash awk expect mikrotik