我正在写一个bash脚本并使用expect来做sftp.现在在expect块中我想在条件语句中访问bash变量.但是,我无法这样做.有人可以帮忙吗?此外,此脚本的执行是从ac程序控制的,我不会将输出重定向到日志文件(这也是动态的).我可以这样做并在stdout上抑制所有teh输出
这里是代码
!/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....."
Run Code Online (Sandbox Code Playgroud)
1.使用expect脚本代替工作.
对于日志记录问题,使用log_user 0和log_file -a帮助
Hai*_* Vu 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....."
Run Code Online (Sandbox Code Playgroud)
来自bash,Tcl/Expect语法有点奇怪,但扩展上面的骨架你不应该有任何问题.祝好运.
由于您是从另一个进程调用此 Expect 脚本,因此您可以使用环境变量。例如,如果您的父进程已将操作导出到环境,那么您可以使用以下命令在期望脚本中访问其值:
$::env(action)
Run Code Online (Sandbox Code Playgroud)
在 Bash 中,您可以使用内置的导出标记要导出的变量。例如:
export action
Run Code Online (Sandbox Code Playgroud)
由于我不确定您如何从 C 调用 Expect 脚本,因此您需要确保变量正确导出。
要禁用从生成的进程记录到标准输出,Expect 提供了 log_user 命令。您可以防止生成的进程使用log_user 0.
Expect(1) 手册说:
默认情况下,发送/期望对话被记录到标准输出(以及日志文件,如果打开)。通过命令“log_user 0”禁用到标准输出的日志记录,并通过“log_user 1”重新启用。记录到日志文件中的内容没有改变。
这实际上并没有关闭标准输出,这通常不是您想要的。这样做会导致写入 stdout 的任何内容抛出如下错误:
can not find channel named "stdout"
while executing
"puts hello"
(file "/tmp/foo" line 8)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40984 次 |
| 最近记录: |