gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:56:08 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com