我正在尝试使用python-paramiko在远程机器上执行sudo命令,(linux2上的Python 2.7.9) 下面是代码。当我执行代码时,它每次都给出不同的输出,而当我在python>>>中运行相同的代码时它工作正常CMDLINE
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()
任何建议和建议将不胜感激,谢谢!
答案 0 :(得分:1)
几年前,我遇到了类似的问题,结果可能有几个原因。
一个可能的选择是调用等待获取shell提示以便返回。但是,对于需要sudo
的命令,行为可能会更改:在某些情况下,它将要求您首先输入密码。在其他情况下(例如,如果您刚刚使用sudo
并且它还没有超时),它将不再需要密码。这种不一致可能会导致问题。
看看here - 使用-k
可能会解决您的问题。
为了解决这个问题,您必须定义(如果可能)sudo
始终需要密码,从而使其保持一致。
可能引发的另一个问题是shell提示符的定义(某些shell使用>
,其他shell使用$
); sudo
可能也是如此 - 它可能会打印Password:
,它不包含shell提示符,并且可能无法被远程命令代理程序识别,并且可能会打印其他内容,例如password
。