BASH 脚本 - 如何模拟用户输入密码

BASH 脚本 - 如何模拟用户输入密码

我正在尝试编写一个 bash 脚本,用于解锁受 WD 专有软件密码保护的外部驱动器。由于我要将此脚本与其他 bash 脚本结合使用,我需要它来获取一开始提供的密码read -s -p "Enter WD password: " wdpass 并在 WD 脚本提示时使用它

这是我目前所拥有的:

#!/bin/bash
sudo blkid #only need this to get the sudo password right away
wait
read -p "Enter drive ID (ie. sda): " driveid
read -s -p "Enter WD password: " wdpass

sudo apt install python3 python3-dev python3-pip git; sudo pip3 install git+https://github.com/evox95/wdpassport-utils
sudo pip3 install --user git+https://github.com/crypto-universe/py_sg
cd ~; wget https://raw.githubusercontent.com/evox95/wdpassport-utils/master/wdpassport-utils.py

sudo ~/wdpassport-utils.py --unlock --device /dev/$driveid
expect "[wdpassport] password for /dev/${driveid}: "
send "$wdpass"
wait

我还尝试了以下组合而不是expectsend(但没有任何效果):

  • sudo ~/wdpassport-utils.py --unlock --device /dev/$driveid <(echo "$wdpass")
  • echo "$wdpass"
  • echo $wdpass
  • "$wdpass"
  • $wdpass

答案1

wdpassport-utils.py您所指的脚本使用 Python函数getpass.getpass()来获取密码。也许最简单的方法是在调用之前使用 bash 脚本(例如使用sed)将其更改为input()(将从 stdin 读取输入)wdpassport-utils.py,然后使用上面提到的行:

sudo ~/wdpassport-utils.py --unlock --device /dev/$driveid <(echo "$wdpass")

或者更常见的形式:

echo "$wdpass" | sudo ~/wdpassport-utils.py --unlock --device /dev/$driveid

答案2

您应该使用expectTcl 扩展。它旨在完成此类自动化任务及其他任务。有一整本书(探索 Expect) 写了关于它的文章,丰富的维基百科页面

在我的评论中,我强调了 expect 和 bash 脚本之间的重要区别。在这种情况下,它应该是expect脚本,下面是一个例子:

#!/usr/bin/expect -f 
spawn ssh aspen 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "ps -ef |grep apache\r" 
expect "$ " 
send "exit\r" 

你必须阅读一些指南,例如使用 admin-magazine.com 的 Expect 脚本实现自动化

相关内容