2014-10-01 5 views
1

Я застрял в тупике с отправкой пароля с использованием подпроцесса, и я не знаю, что не так. Я был бы благодарен за любые советы.Python: отправить пароль postgres с помощью подпроцесса

Мой код:

os.system("sudo -u postgres -h " + db_host + " psql postgres -c \"\password\" ") 
os.system("sudo -u postgres -h " + db_host + " createuser " + db_user); 
print bcolors.WARNING, "Please enter your password for : " + db_user, bcolors.ENDC 
str = "sudo -u postgres -h " + db_host + " psql postgres -c \"\password " + db_user + "\"" 
# os.system(str) 
p = subprocess.Popen(['sudo','-u', 'postgres', '-h', db_host, 'psql', 'postgres', "-c", "\password", db_user],stdin=subprocess.PIPE, shell=False) 
p.communicate(raw_input("Please give me a password!") 

При использовании os.system(str) все в порядке, но я хочу, чтобы поймать набранный пароль от пользователя, и в будущем я хочу, чтобы сохранить пароль в файле конфигурации. Это возможно?

ответ

2

Остановите то, что вы делаете, и используйте psycopg2. Пожалуйста. Вам почти не нужно выкладывать до psql. Просто подключитесь к родному клиентскому драйверу psycopg2 для PostgreSQL.

Если вам необходимо подключиться в качестве суперпользователя, измените pg_hba.conf, чтобы разрешить пароль пользователя md5 и установить пароль для пользователя postgres.


os.system("sudo -u postgres -h " + db_host + " psql postgres -c \"\password\" ")

Это не имеет смысла. Вы пытаетесь выполнить команду -h. Сначала необходимо вызвать psql.


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

Таким образом, он призван победить то, что вы пытаетесь сделать.

Вы можете:

  • Set NOPASSWD режим в sudo для psql;
  • Используйте sudo -A с помощью вспомогательной вспомогательной программы в переменной окружения SUDO_ASKPASS. Вы можете написать SUDO_ASKPASS, который читает пароль из файлового дескриптора, унаследованного от вашей программы, создавая для вас pipe().
  • Чтобы отключить приглашение пароля, используйте sudo -n. sudo не будет работать, если требуется пароль.
  • ... или лучше всего, не используют sudo запустить psql, просто используйте psycopg2
Смежные вопросы