У меня следующая проблема: На каждой машине, на которой работает Postgresql, есть специальный пользователь postgres . Этот пользователь имеет административный доступ к серверу базы данных.
Теперь я хочу написать скрипт Bash, который выполняет команду базы данных с psql в качестве пользователя postgres (psql должен выполняться как пользователь postgres , а не как скрипт). Пока что это не будет проблемой: я могу просто запустить скрипт как пользователь postgres .
Тем не менее, я хочу записать вывод psql в файл в каталоге, где у postgres нет прав на запись.
Как я могу это сделать?
Я думал об изменении EUID в самом скрипте:
- Я не смог найти способ изменить EUID в скрипте Bash
- Как я могу изменить EUID при использовании чего-то подобного
psql -U postgres -c "<command>" > file
?
linux
bash
permissions
shell-script
Кристоф Вурм
источник
источник
Ответы:
Используйте подоболочку:
(su -c 'psql -U postgres -c "<command>"' postgres) > file
Внутри подоболочки вы можете отбросить разрешения на выполнение вашей работы, но вывод перенаправляется в исходную оболочку, у которой все еще есть исходные разрешения.
источник
Вы можете использовать этот трюк:
tee(1)
является утилитой POSIX, поэтому вы можете рассчитывать на ее доступность.Или с
sudo
:источник
sudo -u postgres psql -c '...' > file
и отредактируйте sudoers, чтобы отключитьВы можете запустить сценарий оболочки с пользователем, у которого лучше разрешение на запись (например, root), и при выводе данных следует записывать в папку, в которую пользователь базы данных postgres может записывать (например, / tmp)
после завершения записи данных переместите его в каталог, к которому у вашего сценария оболочки есть права на запись (например, пользователь root может писать куда угодно)
источник
Если вы придумываете хитрые способы обойти ограничения безопасности, вам лучше спросить себя, действительно ли ваша цель мудрая. Я ничего не знаю о postgresql - вам действительно нужно войти в систему с учетной записью администратора, чтобы делать то, что вы пытаетесь сделать, или есть какой-то способ, которым вы можете предоставить разрешения только на чтение для того, чем оно является для обычной учетной записи пользователя?
источник
Почему вы не просто делать это так:
sudo su postgres -c "psql ..." >/path/to/file
?источник
sudo su postgres -c "echo test"
показывает, что такая команда ничего не печатает. Переключение на root сsudo -s
последующим выполнениемsu postgres -c "echo test"
и печать теста , так что кажется, что это как-sudo
то съедает вывод. Я понятия не имею, почему, хотя, я предполагаю, что этоsudo
иsu -c
использовать подоболочки, чей стандартный вывод не перетаскивается в мою собственную оболочку.sudo su postgres -c "echo \$USER"
отпечаткиpostgres
на моей коробке.