2014-09-05 1 views
0

Код, который я попытался выполнить в bash, выполненном root.Как перечислить базы данных, принадлежащие rolename в postgresql

#!/bin/bash 
su - postgres <<EOF1 
F="$(psql -d postgres --tuples-only -P format=unaligned -c "SELECT datname FROM pg_database JOIN pg_authid ON pg_database.datdba = pg_authid.oid WHERE rolname = 'username'")" 
EOF1 
echo $F 

Это дает выход в ОШИБКА: Разрешение отказано в связи pg_authid

Но когда я пытаюсь

su - postgres <<EOF1 
psql -d postgres --tuples-only -P format=unaligned -c "SELECT datname FROM pg_database JOIN pg_authid ON pg_database.datdba = pg_authid.oid WHERE rolname = 'username'" 
EOF1 

Это печатает все дб ​​этого пользователя. Почему так?

Мне нужно сохранить выход для переменной bash для дальнейшей обработки.

Есть ли какая-то ошибка или anyother способ попробовать это ..

Спасибо.

ответ

1

Внутреннее выражение $(...) выполняется перед частью su, поэтому оно не будет работать как postgres, а как текущий пользователь. Это, вероятно, лучше записать так:

command="psql -d postgres --tuples-only -P format=unaligned -c \"SELECT datname FROM pg_database JOIN pg_authid ON pg_database.datdba = pg_authid.oid WHERE rolname = 'username'\"" 
F=$(su - postgres -c "$command") 

Вы могли бы поставить все это вместе, однако:

F=$(su - postgres -c "psql -d postgres --tuples-only -P format=unaligned -c \"SELECT datname FROM pg_database JOIN pg_authid ON pg_database.datdba = pg_authid.oid WHERE rolname = 'username'\"") 

Следует также отметить, что первый пример, который не смог для вас, вероятно, не будет установлено F к чему вы может читать за пределами su. Однако Ubuntu и я предполагаем, что другие современные Linux-системы не позволят вам использовать su. Вы должны использовать, например, sudo -l -u postrges, и настроить /etc/sudoers, чтобы люди имели разрешение на запуск psql или еще что-то в качестве пользователя postgres.

+0

Это сработало. Я ценю ваше Объяснение. – Johnbritto