将文本回显到脚本中其他用户拥有的文件中

将文本回显到脚本中其他用户拥有的文件中

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

  1. 错误消息告诉您您使用sudo错误。具体来说,没有-c选项。您查看过man sudo可用的选项吗?

  2. 即使您修复了该问题,您的代码$PGDATA仍将在调用方上下文中进行求值 ( vagrant),因为它位于双引号字符串中。您需要将其放在单引号字符串中以推迟求值。

  3. 但是你会发现它被设置为无,因为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 环境中的定义方式。

假设它导出了.bashrcpostgres 用户,您可以尝试使用... |sudo -u postgres bash -i -c 'tee -a $PGDATA/pg_hba.conf'

bash -i使.bashrc可读)

相关内容