vagrant
我正在以用户身份(即 sudoer)运行脚本来设置 Postgres。我需要更新用户pg_hba
拥有的文件postgres
。该脚本需要访问$PGDATA
仅属于postgres
用户的环境变量,而不是环境变量中可用的vagrant
变量root
。
我尝试了以下方法,但没有效果。
echo "host airflow airflow 192.168.33.0/24 md5" \
| sudo -c "tee -a $PGDATA/pg_hba.conf" - postgres > /dev/null
输出
[vagrant@metadb ~]$ echo "host airflow airflow 192.168.33.0/24 md5" \
> | sudo -c "tee -a $PGDATA/pg_hba.conf" - postgres > /dev/null
usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s]
[<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
[vagrant@metadb ~]$
编辑:打算sudo su
在问题中写入 -c 选项可用。感谢 @roaima 提示使用单引号来推迟评估。
下面的工作需要正如开头段落中描述的那样。
echo "host airflow airflow 192.168.33.0/24 md5" \
| sudo su -c 'tee -a $PGDATA/pg_hba.conf' - postgres > /dev/null
答案1
错误消息告诉您您使用
sudo
错误。具体来说,没有-c
选项。您查看过man sudo
可用的选项吗?即使您修复了该问题,您的代码
$PGDATA
仍将在调用方上下文中进行求值 (vagrant
),因为它位于双引号字符串中。您需要将其放在单引号字符串中以推迟求值。但是你会发现它被设置为无,因为
sudo
(通常)没有为目标用户设置任何环境。
尝试这个
echo "host airflow airflow 192.168.33.0/24 md5" |
sudo -i -u postgres bash -c 'cat >>"$PGDATA/pg_hba.conf"'
或者,实际上,你不妨把它放在echo
里面sudo
:
sudo -i -u postgres bash -c 'echo "host airflow airflow 192.168.33.0/24 md5" >>"$PGDATA/pg_hba.conf"'
答案2
那么您的问题是该-c
选项不是 sudo 选项。
这还取决于您的PGDATA
环境变量在 postgres 环境中的定义方式。
假设它导出了.bashrc
postgres 用户,您可以尝试使用... |sudo -u postgres bash -i -c 'tee -a $PGDATA/pg_hba.conf'
(bash -i
使.bashrc
可读)