必需信息:我正在尝试使用expect来自动化包含脚本中的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
}结束语:我很感谢任何人给我的任何帮助和建议,谢谢。
发布于 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运行加载程序脚本。
https://stackoverflow.com/questions/31440349
复制相似问题