【问题标题】:expect script fails to send passphrase to cryptsetup期望脚本无法将密码发送到 cryptsetup
【发布时间】:2021-07-12 17:48:44
【问题描述】:

我想要自动化的与 cryptsetup 的简单交互是这样的:

cryptsetup luksFormat /dev/loop20
WARNING: Device /dev/loop20 already contains a 'crypto_LUKS' superblock signature.

WARNING!
========
This will overwrite data on /dev/loop20 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/loop20: 
Verify passphrase: 

以下期望脚本尝试执行此操作:

spawn cryptsetup luksFormat /dev/loop20
expect "yes): " { send "YES\n" }
expect ": " 
send "passphrase\n"
expect ": "  
send "passphrase\n"
expect eof

当 YES 正确发送时,它会在密码提示符处挂起。除了发送命令中的 \n 之外,我还尝试使用 \r。

相同的脚本结构适用于 ssh 密码或 sudo 密码提示,所以我有点迷失了这里的不同之处。我知道有“预期较少”的方法,例如 echo passphrase | cryptsetup ...,但我真的很想了解潜在的问题以及是否有解决方案。

【问题讨论】:

  • 使用expect -d 运行脚本并查看模式是否匹配。
  • 您通常需要在匹配密码提示后插入等待(例如sleep 1),以允许将 tty 设置为无回显模式以及关联的输入刷新。

标签: linux expect


【解决方案1】:

meuh 的评论是解决办法:密码提示后我需要稍等。

所以这行得通:

spawn cryptsetup luksFormat /dev/loop20
expect "yes): " { send "YES\n" }
expect ": " 
sleep 1
send "passphrase\n"
expect ": "  
sleep 1
send "passphrase\n"
expect eof

谢谢!

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 2015-11-28
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2015-12-20
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多