2016-08-15 1 views
1

Я занимаюсь администрированием PostgreSQL в OS X. Иногда мне нужно скопировать базу данных в другую базу данных, что я делаю следующим образом.Как использовать sudo -u по обе стороны трубы

sudo -u _postgres pg_dump mydb > mydb.sql 
sudo -u _postgres psql -d mydb-testing -f mydb.sql 

Но я предпочел бы просто сделать это

sudo -u _postgres pg_dump mydb | sudo -u _postgres psql -d mydb-testing 

Однако, когда я делаю это я получаю спросил мой пароль, но он всегда отказывался некорректным.

Я ищу решение, в котором я могу запустить команду как пользователь _postgres с обеих сторон трубы.

+0

Почему бы не 'sudo su', а затем запустить? – raam86

+0

@ raam86 Пользователь _postgres, как настроенный, не имеет оболочки входа 'UserShell:/usr/bin/false' –

ответ

1

Я считаю

sudo -u _postgres pg_dump mydb | sudo -u _postgres psql -d mydb-testing 

должен работать до тех пор, как вы убедитесь, что sudo s не будет спрашивать ваш пароль от вашего терминала одновременно.

Если я кэшировать мой SUDO пароль, я могу трубы обычно от одной sudo'ed команды к другой:

sudo -u root echo hello world | sudo -u root tr a-z A-Z #prints HELLO WORLD 

Другой вариант заключается в использовании одного sudo нереститься оболочки:

sudo -u _postgres sh -c 'pg_dump mydb | psql -d mydb-testing' 

( Вы можете использовать heredoc, если у вас есть много вещей, которые нужно сделать в этой оболочке:

sudo -u _postgres sh <<'SCRIPT' 
    pg_dump mydb | psql -d mydb-testing 
SCRIPT 

)

+0

А, я не понимал, почему я получал неправильный пароль, когда я запускал эту команду, потому что, как вы указали, одновременно запрашивает пароль. Есть ли другой способ кэшировать пароль, не запустив команду-заглушку? Спасибо также за нерест и разработку heredoc. Вы решили мою проблему. –

+2

@JasonS Запустите 'sudo -v' (" validate ") перед командами, переданными по каналам; который проверяет ваши учетные данные (т. е. запрашивает пароль) и устанавливает временную метку, чтобы она не запрашивала снова 5 минут. –