2016-11-23 6 views
1

Я пытаюсь выполнить команду sudo на удаленной машине, используя python-paramiko (Python 2.7.9 на linux2) Ниже приведен код. когда я выполняю код это дает различные результаты каждый раз, в то время как его работает нормально, когда я запускаю тот же код в питона >>> командная_строкаВыполнение команды на удаленном сервере, которая требует Sudo с вводом пароля - Paramiko

import paramiko 
import sys 
import time 
def send_string_and_wait(command, wait_time, should_print): 
    shell.send(command) 
    time.sleep(wait_time) 
    receive_buffer = shell.recv(1024) 
    if should_print: 
    return receive_buffer 

dbname='test' 
cl='testdb' 
host='testhost' 
owner='uname' 
passwd='p' 


client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(str(host), username=str(owner), password=str(passwd), port=22) 
shell = client.invoke_shell() 
send_string_and_wait("sudo su - oracle\n", 1, True) 
send_string_and_wait(str(passwd) + "\n", 1, True) 
a=send_string_and_wait("sh Validation_Final.sh" + str(' ') + str(dbname) + str(' ') + str(cl) + "\n", 0, True) 
print a 
client.close() 

sample output

Любые рекомендации и предложения будут с благодарностью, спасибо вы!

ответ

1

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

Один из возможных вариантов заключается в том, что вызов ожидает получения приглашения оболочки для возврата. Однако в случае команды, которая требует sudo, поведение может измениться: в некоторых случаях вам потребуется ввести пароль первым. В других случаях (например, если вы только что использовали sudo, и он еще не был приурочен), он больше не потребует пароля. Эта непоследовательность может вызвать проблемы.

Посмотрите here - используя -k может решить вашу проблему.

Чтобы решить эту проблему, вы должны определить (если возможно), что sudo всегда будет требовать пароль, что сделает его согласованным.

Другой вопрос, который может возникнуть, - это определение командной строки (некоторые оболочки используют >, другие используют $); то же самое может быть верно для sudo - он может печатать Password:, который не содержит приглашения оболочки и может быть не распознан агентом удаленной команды, и он может печатать что-то еще, например. password.

+0

Спасибо за ваш ответ, я пробовал с sudo -k, но не повезло. Интересно, что он работает, когда я жестко кодирует значения dbname и client, такие как ["" "send_string_and_wait ('sh /orashare/ettool/Validation_Final.sh dbname client' +" \ n ", 1, True)" ""] – Prince

+0

Но я ' m перед проблемой при передаче переменных «" send_string_and_wait ("sh /orashare/ettool/Validation_Final.sh" + "" + str (dbname) + "" + str (cl) + "\ n", 0, True) " «Я предполагаю, что это должна быть проблема синтаксиса, пожалуйста, исправьте меня, если я ошибаюсь – Prince

+0

Попробуйте выяснить, что именно вы получаете с удаленного сервера. Использование' -k' только гарантирует, что удаленный сервер ведет себя согласованно. Однако вы должны помнить, что при запросе пароля он не использует знак оболочки (например, '>' или '$'), поэтому, если paramiko ждет только один из них, он будет блокироваться. 'Пароль:' (или что бы он ни появлялся в вашей системе) считается знаком оболочки для этого вызова. – Mike

 Смежные вопросы

  • Нет связанных вопросов^_^