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

时间:2016-05-04 15:42:39

标签: windows bash ssh tcl expect

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

  • 使用ssh
  • 登录远程Windows机器
  • 检查某个文件是否存在
  • 比较同一路径上另一个文件的时间戳,如果是较新则打印

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

foreach($ligne as $value){

    $result = $bdd->query('SELECT count(d.DNUMERO) as nbr, SUM(d.DINIPPL) as total FROM dossier d, cliregroup c, doinfsup i WHERE i.DSNUMERO = d.DNUMERO AND d.DNUMCLI = c.NUMCLI AND i.INFOSUPPLM REGEXP "([1][4-6][0-9a-zA-Z]{6}[0-9]{4})" AND INFOSUPPLM NOT REGEXP "([0-1][0-4][0-9a-zA-Z]{6}[0-9]{4})" AND i.DSNUMERO LIKE "16%" AND c.CODEREGROUP LIKE "'.$value.'"');

    $table = $result->fetchAll();

    print_r($table);
}

<?php include_once('header.html'); ?>

结果总是包含我发送的命令而不是输出FOUND或NOTFOUND。有人能让我知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

而不是使用模式匹配,您的脚本会尝试手动处理缓冲区,但会做出错误的假设,即缓冲区只包含文本&#34;(NOT)FOUND&#34;。缓冲区实际上包含自上次使用命令expect以来收到的所有内容。即使它确实匹配缓冲区(例如,使用string match *NOTFOUND* $result),它也会受到the echo problem的影响:字符串&#34; FOUND&#34;并且&#34; NOTFOUND&#34;在您发送的命令中,这很可能是由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.
    }
}