Paramiko выполнить команду на PSQL - PullRequest
0 голосов
/ 12 декабря 2018

Используя Paramiko, я создаю ssh для подключения к моей удаленной машине, затем вызываю exec_command для запуска следующего:

psql usera

Обычно exec_command возвращает кортеж stdin, stdout и stderr.Поэтому я использую stdin для записи CREATE DATABASE X с '\n' в конце для имитации кнопки ввода.Команда отнимает много времени до такой степени, что выглядит как застрявшая.

Вот мой код:

stdin, stdout, stderr = self.ssh.exec_command('psql usera')
print('executed')
print(stdin)
print(stdout)
print(stderr)
for err in stderr:
    print(err)
for std in stdout:
    print(std)
stdin.write('CREATE DATABASE ' + db_name + ';\n')

Этот код выведет следующее:

executed
<paramiko.ChannelFile from <paramiko.Channel 2 (open) window=2097152 -> <paramik
o.Transport at 0x36a29b0 (cipher aes128-ctr, 128 bits) (active; 3 open channel(s
))>>>
<paramiko.ChannelFile from <paramiko.Channel 2 (open) window=2097152 -> <paramik
o.Transport at 0x36a29b0 (cipher aes128-ctr, 128 bits) (active; 3 open channel(s
))>>>
<paramiko.ChannelFile from <paramiko.Channel 2 (open) window=2097152 -> <paramik
o.Transport at 0x36a29b0 (cipher aes128-ctr, 128 bits) (active; 3 open channel(s
))>>>
2018-12-12 19:22:39; DEBUG; EOF in transport thread

Это означает, что код не выполняется stdin.write().Это правильный способ запуска команд и запуска команд по приглашению?

1 Ответ

0 голосов
/ 13 декабря 2018

Вы пытаетесь прочитать вывод команды перед отправкой команды SQL.Ваши циклы ждут завершения команды, чего она никогда не делает, поскольку она продолжает ждать ввода.Это тупик.

Должно быть наоборот:

stdin.write('CREATE DATABASE ' + db_name + ';\n')
for err in stderr:
    print(err)
for std in stdout:
    print(std)

Хотя я не знаком с командной строкой psql, я почти уверен, что приведенное вышеКод также будет зависать, так как после CREATE DATABASE, psql он, вероятно, будет продолжать ожидать другую команду.Вам нужно добавить что-то вроде EXIT.Или позвоните stdin.close().

stdin.write('CREATE DATABASE ' + db_name + ';\n')
stdin.close()
for err in stderr:
    print(err)
for std in stdout:
    print(std)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...