首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expect:使用Expect和Postgresql编写Bash脚本

Expect:使用Expect和Postgresql编写Bash脚本
EN

Stack Overflow用户
提问于 2015-07-15 20:25:55
回答 1查看 1K关注 0票数 1

必需信息:我正在尝试使用expect来自动化包含脚本中的PostgreSQL命令的密码。我试着模仿了我在StackOverflow.com上找到的几个例子,以及互联网上的其他资源,但都没有成功。

问题:我仍在收到输入提示。

代码:

额外信息:密码是一个全局变量,未在此代码段中显示

代码语言:javascript
复制
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
}

结束语:我很感谢任何人给我的任何帮助和建议,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-07-16 12:11:04

你想用焊工解决你的木工问题。

这是不可行的,有很多原因。

sudo故意阻止您重定向它的stdin,而不是从终端读取它。这在一定程度上是为了让窃取密码的包装更加困难,但大多数情况下都是有用的,这样即使some-command | sudo othercommand必须提示输入密码,sudo也能正常工作。要禁用它,您必须将--stdin标志传递给sudo,显式地告诉它您希望它从stdin读取密码。

sudo可能会也可能不会在每次调用时提示输入密码,这取决于它的设置、用户是否最近运行,等等。expect不会喜欢这样的。

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

顺便说一句,除了旧的PostgreSQL版本之外,您应该使用CREATE EXTENSION postgis;,而不是通过psql运行加载程序脚本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31440349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档