如何将“expect”与“zipcloak”一起使用?

如何将“expect”与“zipcloak”一起使用?

zip使用它创建一个文件zip,其中包含多个文件和目录,名​​为test.upd.现在我想用expect自动处理密码加密。这是两个 bash 脚本,都不起作用:

!/bin/bash

MYPWD="mypassword"

expect -c '
    spawn zipcloak test.upd
    expect {
       "*Enter password*" { send "'"$MYPWD"'\r"
                                   exp_continue
                                  }
       "*Verify password*" { send "'"$MYPWD"'\r"
                                      exp_continue
                                    }
    }'

和这个文件:

!/bin/bash
MYPWD="mypassword"

expect -c '
    spawn zipcloak test.upd
    expect "*Enter password*" 
    send "'"$MYPWD"'\r"
    expect "*Verify password*" 
    send "'"$MYPWD"'\r"

    }'

我也尝试直接创建一个expect脚本:

#!/usr/bin/expect -f

spawn zipcloak test.upd
expect "*Enter password*" 
send "password\r"
expect "*Verify password*" 
send "password\r"

所有脚本似乎都正确发送了第一个密码请求,但似乎从未询问第二个密码条目的文本。我怎样才能做对呢?

限制条件:

  • 我必须使用zipcloak(不zip
  • 我想用expect自动设置密码。

评论:

  • 我使用了正确的脚本
  • 每次使用第一个脚本时,zi都会在目录中创建一个以 开头的空文件,例如ziSvbYhyzi3gzEQ4

答案1

解决方案似乎是等待一段时间再采取行动!我完全不知道为什么会这样(欢迎评论、解释和见解),但以下脚本现在对我有用:

#!/bin/bash
MYPWD="mypassword"

expect -c ' 
    spawn zipcloak test.upd
    expect "*Enter password*" 
    sleep 1
    send  "'"$MYPWD"'\r"
    sleep 1
    expect "*Verify password*" 
    sleep 1
    send  "'"$MYPWD"'\r"
    sleep 1
    '

答案2

我的解释是,Alex 和 ctrl-alt-delor 的答案没有正确等待 zipcloak 过程完成,因此很容易使 zip 文件处于未加密状态(并留下一个名称如zimfwtpJ后面的临时文件)。因此,他们的代码适用于小型 zip 文件,但不适用于较大的 zip 文件。

这是我的解决方案:

#!/bin/bash
MYPWD="mypassword"

expect -c '
    set timeout -1
    spawn zipcloak test.upd
    expect "*Enter password*"
    send  "'"$MYPWD"'\r"
    expect "*Verify password*"
    send  "'"$MYPWD"'\r"
    expect eof
    '

答案3

问题中的第一个例子对我有用。

!/bin/bash
MYPWD="mypassword"

expect -c '
     spawn zipcloak test.upd
     expect {
        "*Enter password*" { send "'"$MYPWD"'\r"
                               exp_continue
                              }
        "*Verify password*" { send "'"$MYPWD"'\r"
                                  exp_continue
                                }
}'

尽管第二个没有。再试一次,也许你运行了错误的脚本。这种情况经常发生在我身上:我想知道为什么它不起作用,但我运行了错误的脚本。

相关内容