我想用 expect 和 for 循环远程执行一个脚本:
#!/usr/bin/expect
set timeout 10
spawn ssh [email protected]
expect "password: "
send "pass\n"
expect "$ "
send "for i in `ls` ;\n"
send "do\n"
send " STRLENGTH=$(echo -n $i | wc -m);\n"
send " if [ $STRLENGTH -ge 35 ];\n"
send " then echo ok \"$i\";\n"
send " fi\n"
send "done\n"
但它给了我这个错误:
can't read "i": no such variable
while executing
"send " STRLENGTH=$(echo -n $i | wc -m);\n""
(file "./script.sh" line 10)
任何帮助都值得感激,谢谢!
答案1
expect
告诉您它尝试替换$i
一个值,但未找到变量i
。这不是您的意图:您希望将其逐字发送,以便远程 shell 进行替换。使用$
反斜杠转义该字符,使其expect
逐字传递。
考虑使用sshpass
而不是expect
太。
答案2
gronostaj 是正确的答案。请注意,您可以将一系列行简化为一个多行字符串文字。请参阅维基百科。
send { for i in `ls`
do
STRLENGTH=$(echo -n $i | wc -m)
if [ $STRLENGTH -ge 35 ]
then echo ok "$i"
fi
done
}
使用{}
而不是 括住字符串可""
保留换行符和$
等。但是,您仍需要使用转义\
、 {
和。}
\