必要信息 我尝试使用 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
}
结束注意:我感谢任何人给予的帮助和建议,谢谢。
答案 0 :(得分:0)
您正试图通过焊工解决您的木工问题。
由于种种原因,这项工作无法实现。
sudo
故意阻止您重定向其标准输入,而不是从终端读取它。这部分是为了使密码窃取包装更加困难,但最有用的是使some-command | sudo othercommand
之类的东西工作,即使sudo
必须提示输入密码。要禁用此功能,您必须将--stdin
标志传递给sudo
,明确告诉您希望它从stdin读取密码。
sudo
实际上可能会或可能不会在每次调用时提示输入密码,具体取决于其设置,用户是否最近运行它等等。expect
不会这样。
更好的方法是设置sudo
,这样您就不必提供密码来执行所需操作,或让用户在{{1}下运行整个脚本首先,他们可以交互式地响应提示。然后使用常规shell脚本,或者最好使用像Ansible或Puppet这样的自动化工具框架。
BTW,除了古老的PostgreSQL版本之外,你应该使用sudo
而不是通过CREATE EXTENSION postgis;
运行加载器脚本。