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


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

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


5

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

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

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


Или с sudo:

{ anycommand } | sudo -u user 'tee file'

Спасибо за вашу идею. Однако я сталкиваюсь с двумя проблемами: у su нет опции -u, по крайней мере, на моей машине. Правильный запуск (команда su -c user) приводит к другой проблеме, а именно к тому, что su нужно запускать с терминала. Вероятно, это не сработает, так как su открывает новую подоболочку с помощью этой команды.

@ Legate у тебя есть sudo в твоей системе?
ulidtko

@ulidtko: Да, я делаю.

1
затем просто используйте sudo -u postgres psql -c '...' > fileи отредактируйте sudoers, чтобы отключить
запросы

1

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

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


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, где должен запускаться скрипт.
Кристоф Вурм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.