我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
都会在目录中创建一个以 开头的空文件,例如ziSvbYhy
或zi3gzEQ4
。
答案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
}
}'
尽管第二个没有。再试一次,也许你运行了错误的脚本。这种情况经常发生在我身上:我想知道为什么它不起作用,但我运行了错误的脚本。