Как запустить часть скрипта с ограниченными правами?

7

У меня следующая проблема: На каждой машине, на которой работает Postgresql, есть специальный пользователь postgres . Этот пользователь имеет административный доступ к серверу базы данных.

Теперь я хочу написать скрипт Bash, который выполняет команду базы данных с psql в качестве пользователя postgres (psql должен выполняться как пользователь postgres , а не как скрипт). Пока что это не будет проблемой: я могу просто запустить скрипт как пользователь postgres .

Тем не менее, я хочу записать вывод psql в файл в каталоге, где у postgres нет прав на запись.

Как я могу это сделать?

Я думал об изменении EUID в самом скрипте:

  1. Я не смог найти способ изменить EUID в скрипте Bash
  2. Как я могу изменить EUID при использовании чего-то подобного
    psql -U postgres -c "<command>" > file?
Кристоф Вурм
источник
как я могу изменить пароль пользователя postgres в subshell (su -c 'psql -U postgres -c "ALTER USER forip PASSWORD \' password \ ';" postgres)
Fndiaz,

Ответы:

5

Используйте подоболочку: (su -c 'psql -U postgres -c "<command>"' postgres) > file

Внутри подоболочки вы можете отбросить разрешения на выполнение вашей работы, но вывод перенаправляется в исходную оболочку, у которой все еще есть исходные разрешения.

Kowh
источник
5

Вы можете использовать этот трюк:

{ anycommand } | su -c 'tee file' user

tee(1) является утилитой POSIX, поэтому вы можете рассчитывать на ее доступность.


Или с sudo:

{ anycommand } | sudo -u user 'tee file'
ulidtko
источник
Спасибо за вашу идею. Однако я сталкиваюсь с двумя проблемами: у su нет опции -u, по крайней мере, на моей машине. Правильный запуск (команда su -c user) приводит к другой проблеме, а именно к тому, что su нужно запускать с терминала. Вероятно, это не сработает, так как su открывает новую подоболочку с помощью этой команды.
@ Legate у тебя есть sudo в твоей системе?
ulidtko
@ulidtko: Да, я делаю.
1
затем просто используйте sudo -u postgres psql -c '...' > fileи отредактируйте sudoers, чтобы отключить
запросы
1

Вы можете запустить сценарий оболочки с пользователем, у которого лучше разрешение на запись (например, root), и при выводе данных следует записывать в папку, в которую пользователь базы данных postgres может записывать (например, / tmp)

после завершения записи данных переместите его в каталог, к которому у вашего сценария оболочки есть права на запись (например, пользователь root может писать куда угодно)

ajreal
источник
0

Если вы придумываете хитрые способы обойти ограничения безопасности, вам лучше спросить себя, действительно ли ваша цель мудрая. Я ничего не знаю о postgresql - вам действительно нужно войти в систему с учетной записью администратора, чтобы делать то, что вы пытаетесь сделать, или есть какой-то способ, которым вы можете предоставить разрешения только на чтение для того, чем оно является для обычной учетной записи пользователя?

Михаил Копинский
источник
Спасибо за ваш ответ. Тем не менее, нет никаких проблем с запуском скрипта от имени root, поэтому обход ограничений безопасности не происходит.
0

Почему вы не просто делать это так: 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на моей коробке.
Алекс
Ну, это работает на моем ноутбуке Ubuntu, но не на сервере Debian, где должен запускаться скрипт.
Кристоф Вурм