必要信息: 我正在尝试使用 expect 在 BASH 脚本中使用 PostgreSQL 自动生成涉及命令的密码。我已经尝试模仿我在 StackOverflow.com 以及互联网上的其他资源上找到的几个示例,但没有成功。
问题:我仍然收到输入提示。
代码:
额外信息:密码是一个全局变量,未在此代码段中显示
database_work(){
sudo -u postgres createdb tinyows
sudo python /$1/database.py
expect <<- DONE
spawn sudo -u postgres psql -U postgres -d tinyows < `pg_config --sharedir`/contrib/postgis-2.1/postgis.sql
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
expect eof
DONE
expect <<- DONE
spawn sudo -u postgres psql -U postgres -d tinyows < `pg_config --sharedir`/contrib/postgis-2.1/spatial_ref_sys.sql
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
expect eof
DONE
}
尾注:感谢任何人提供的帮助和建议,谢谢。
最佳答案
您正在尝试通过焊工解决您的木工问题。
由于多种原因,这将行不通。
sudo
故意阻止您重定向其标准输入,而是从终端读取它。这部分是为了使包装器更难窃取密码,但最有用的是像 some-command | 这样的东西。即使
也能正常工作。要禁用此功能,您必须将 sudo
必须提示输入密码,sudo othercommand--stdin
标志传递给 sudo
,明确告诉它您希望它从 stdin 读取密码。
sudo
可能会或可能不会在每次调用时实际提示输入密码,这取决于它的设置、用户最近是否运行过它等。expect
不会喜欢那个。
更好的方法是设置 sudo
,这样您就不必提供密码来执行所需的操作,或者让用户在 下运行您的整个脚本>sudo
首先,这样他们就可以交互式地响应提示。然后使用常规 shell 脚本,或者最好使用 Ansible 或 Puppet 等自动化工具框架。
顺便说一句,除了古老的 PostgreSQL 版本之外,您应该使用 CREATE EXTENSION postgis;
而不是通过 psql
运行加载程序脚本。
关于bash - Expect:使用 Expect 和 Postgresql 编写 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31440349/