检查远程文件是否存在并在 expect 脚本中执行一些其他操作

Check if remote file exist and perform some other operation in expect script

我正在尝试在 Linux 中编写一个需要执行以下工作的期望脚本。

在第 1 步中,我尝试发送一个命令来检查文件是否存在,但它不起作用

log_user 1
spawn ssh -o "StrictHostKeyChecking=no" $username@$hostname
expect {
..... user and password checks
.....
send "IF EXIST C:\path\to\file\temp.zip (echo FOUND) else (echo NOTFOUND)\r"
expect "path" {
   set result $expect_out(buffer)
   puts $result

   if{$result=="FOUND"} {
       #compare with temp2.zip here
   }
}

结果始终包含我发送的命令,而不是输出 FOUND 或 NOTFOUND。有人可以让我知道我在这里做错了什么吗?

您的脚本尝试手动处理缓冲区而不是使用模式匹配,但错误地假设缓冲区将仅包含文本“(NOT)FOUND”。该缓冲区实际上将包含自上次使用命令 expect 以来收到的所有内容。即使它确实与缓冲区正确匹配(例如,使用 string match *NOTFOUND* $result),它也会受到 the echo problem 的影响:字符串 "FOUND" 和 "NOTFOUND" 在命令中发送,这很可能是由 SSH 服务器回显给您的。

脚本的以下修改通过不发送它期望的文字字符串来绕过回声问题。

它适用于 Windows 端的 Bitvise SSH 服务器。

log_user 1
spawn ssh -o "StrictHostKeyChecking=no" $username@$hostname
# Log in here.
send "set prefix=___\r" ;# Combat the echo problem.
send "IF EXIST C:\path\to\file\temp.zip (echo %prefix%FOUND) else (echo %prefix%NOTFOUND)\r"
expect {
    ___NOTFOUND {
        error {file not found}
    }
    ___FOUND {
        send_user Found!\n
        # Do things with the file.
    }
}