bash - Expect:使用 Expect 和 Postgresql 编写 Bash 脚本

标签 bash postgresql expect

必要信息: 我正在尝试使用 expectBASH 脚本中使用 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/

相关文章:

perl - 在 Unix 中排序日期/时间

bash: -exec 在查找命令和 &

ruby-on-rails - Rails/Postgres 如果 hstore 值包含传递数组的值,如何查询它

linux - 如何在 expect shell 脚本中获取生成进程的退出代码?

bash - 在期望脚本中发送 INSERT 和 F12

bash - 如何在 awk 脚本中使用 shell 变量?

BASH:让多个 bash 后台进程写入同一个文件是否安全?

sql - 如何在达到阈值后运行 SUM "reset"?

postgresql - 如何将文本文件插入 PostgreSQL 中的字段?

bash - 使用 expect 来自动执行管道命令