期待:Bash Scripting with Expect和Postgresql

时间:2015-07-15 20:25:56

标签: bash postgresql expect

必要信息 我尝试使用 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
}

结束注意:我感谢任何人给予的帮助和建议,谢谢。

1 个答案:

答案 0 :(得分:0)

您正试图通过焊工解决您的木工问题。

由于种种原因,这项工作无法实现。

sudo故意阻止您重定向其标准输入,而不是从终端读取它。这部分是为了使密码窃取包装更加困难,但最有用的是使some-command | sudo othercommand之类的东西工作,即使sudo必须提示输入密码。要禁用此功能,您必须将--stdin标志传递给sudo,明确告诉您希望它从stdin读取密码。

sudo实际上可能会或可能不会在每次调用时提示输入密码,具体取决于其设置,用户是否最近运行它等等。expect不会这样。

更好的方法是设置sudo,这样您就不必提供密码来执行所需操作,或让用户在{{1}下运行整个脚本首先,他们可以交互式地响应提示。然后使用常规shell脚本,或者最好使用像Ansible或Puppet这样的自动化工具框架。

BTW,除了古老的PostgreSQL版本之外,你应该使用sudo而不是通过CREATE EXTENSION postgis;运行加载器脚本。