我正在写一个bash脚本并使用expect来做sftp。现在在expect块中我想在条件语句中访问bash变量。但是,我无法这样做。有人可以帮忙吗?此外,此脚本的执行是从c程序控制的,我不会将输出重定向到日志文件(这也是动态的)。我可以这样做并抑制标准输出上的所有输出 这是代码
!/usr/bin/bash
host=$1
user=$2
pass=$3
action=$4
path=$5
echo "Starting...."
function doAction {
strAction="\""$action"\""
echo $strAction
/usr/bin/expect <<EOF > logfile.txt
**set bashaction $strAction**
spawn sftp $user@$host
expect "password:"
send "$pass\r"
expect"sftp>"
send "cd $path\r"
**if {$bashaction == "TEST"} {**
expect "sftp>"
send "prompt\r"
}
expect "sftp>"
send <sftp command>
expect "sftp>"
send_user "quit\n"
exit
EOF
}
doAction
echo "DONE....."
for 1.使用expect脚本代替工作。
对于日志记录问题,使用log_user 0和log_file -a help
答案 0 :(得分:11)
您无需使用bash
,expect
可以处理所有这些:
#!/usr/bin/expect
set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set action [lindex $argv 3]
set path [lindex $argv 4]
puts "Starting...."
puts "\"$action\""
spawn sftp $user@$host
expect "password:"
send "$pass\r"
expect"sftp>"
send "cd $path\r"
if {$action == "TEST"} {
# Do something
} else {
# Do something else
}
expect "sftp>"
send_user "quit\r"
puts "DONE....."
来自bash
,Tcl / Expect语法有点奇怪,但扩展上述骨架不应该有任何问题。祝你好运。
答案 1 :(得分:2)
由于您从另一个进程调用此Expect脚本,因此可以使用环境变量。例如,如果您的父进程已将操作导出到环境中,那么您可以使用以下命令在期望脚本中访问其值:
$::env(action)
在Bash中,您可以使用 export 内置mark the variable for export。例如:
export action
由于我不确定您是如何从C调用Expect脚本的,因此您可以确保正确导出该变量。
要禁止从生成的进程记录到标准输出,Expect将提供log_user命令。您可以使用log_user 0
阻止生成的进程写入标准输出。
expect(1)手册说:
默认情况下,发送/期望对话框会记录到stdout(和a logfile如果打开)。命令禁用了对stdout的日志记录 “log_user 0”并由“log_user 1”重新启用。记录到日志文件 没有改变。
这实际上并不是关闭标准输出,这通常不是你想要的。这样做会导致写入stdout的任何内容抛出如下错误:
can not find channel named "stdout"
while executing
"puts hello"
(file "/tmp/foo" line 8)
答案 2 :(得分:0)
要禁止输出到标准输出,您可以使用
command here >/dev/null 2>/dev/null
要写入日志文件,如果要在长管道中间写入输出,可以使用类似的管道(>
或>>
)或tee
命令