Cor*_*rey 10 bash shell-script
我收到错误消息...
could not change directory to "/home/corey/scripts": Permission denied
Run Code Online (Sandbox Code Playgroud)
...当我运行以下脚本时...
#!/bin/bash
sudo -u postgres psql < setup_dev_db.sql
read -rsp $'Press any key to continue...\n' -n 1 key
Run Code Online (Sandbox Code Playgroud)
... setup_dev_db.sql 的内容执行没有任何问题,但错误很烦人。
我可以摆脱它吗?
Postgres 想要创建一个$HOME/.psql_history
文件,它将存储来自psql
客户端的所有查询和命令。它很可能想在 上做其他事情$HOME
,但我没有看到任何其他隐藏文件形式的证据。除非您以psql
交互方式使用,否则它实际上不会创建历史文件,而事实并非如此。
我遇到了完全相同的问题并发现了这个问题,但是我无法接受接受的答案——我不应该授予 postgres 权限来在我运行时碰巧所在的任何目录中留下我的查询痕迹一个脚本!
@Corey,您在评论中提到的解决方案(cd /tmp
在致电之前sudo...
)可能是最好的。psql
不会在其中创建此文件/tmp
(我确定这是故意的,因为它可能允许非特权用户读取该文件)。
我还能想到另外两种解决方案:
psql
通过添加-i
到您的命令在登录 shell 中运行
sudo -i -u postgres psql < setup_dev_db.sql
Run Code Online (Sandbox Code Playgroud)
这将设置$HOME
为postgres
的HOME
目录,列在/etc/passwd
. 对于 Ubuntu,那就是/var/lib/postgres
. 但是由于您正在输入命令,因此它不会创建.psql_history
文件。但是,如果您使用的交互psql
,与其他任何人sudo
的权限在机器上会访问您的命令历史记录。
我不确定在这种情况下运行登录 shell 是否还有其他负面影响。
psql
以较低权限的用户身份运行,例如
$ psql dev_db -hlocalhost corey_dev -W < setup_dev_db.sql
Run Code Online (Sandbox Code Playgroud)
如果这是一个问题,因为您将 postgres 用户创建留给您的setup_dev_db.sql
脚本,而您还没有任何用户,只需createuser
先在您的脚本中添加一个命令,如下所示:
$ sudo -u postgres createuser corey_dev -P
Run Code Online (Sandbox Code Playgroud)
也许……
$ sudo -u postgres createdb dev_db "Dev database"
Run Code Online (Sandbox Code Playgroud)注:当使用psql
客户端交互(这你不在这里),如果你看到一则消息像could not change directory to "/home/corey/scripts": Permission denied
消息****,psql
是要写信给/var/lib/postgres/.psql_history
(或无论其$HOME
是)!如果您在使用 Interactive 时曾看到过该警告psql
,请查看——您可能会找到一个隐藏的历史文件。
要更改到目录,用户必须具有该目录的“x”权限。
我假设您正在从“/home/corey/scripts”运行脚本。当“sudo -u postgres”将当前用户更改为“postgres”时,它会尝试将“postgres”的工作目录设置为在生成您看到的错误时调用的工作目录。
确保用户“postgres”对“/home/corey/scripts”具有“x”权限。