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

标签 windows bash ssh tcl expect

我正在尝试在Linux中编写一个期望脚本,该脚本需要完成以下工作。

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

  • 在步骤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.
        }
    }
    

    关于windows - 检查远程文件是否存在,并在Expect脚本中执行其他操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032389/

    相关文章:

    ruby-on-rails - 在 Windows 和 Linux/OS X 的 Gemfile 中指定不同的 Ruby 版本(例如 1.9.3 与 2.1)?

    linux - npm 在安装新包时不会自动添加别名

    sql - 存储过程和数据导出自动化

    ssh - 带有堡垒和自定义SSH端口+代理转发的Kubespray

    windows - 处理输入时发现ffmpeg未知关键字无效数据

    windows - 您可以从服务器端 javascript 调用 COM 组件吗?

    c++ - 适用于 Windows 的 Helgrind?

    python - 采购 python 脚本

    ssh - Bitbucket管道-如何设置ssh

    Python 子进程抛出 [Errno 2] 没有这样的文件或目录,只有在远程主机上时才会产生错误