2016-11-23 79 views
1

我想在远程计算机上使用python-paramiko(在linux2上使用Python 2.7.9)执行sudo命令。 下面是代码。当我执行的代码它每次给出不同的输出,而其工作正常,当我运行在python相同的代码>>> CMDLINE在需要使用密码输入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

几年前,我遇到过类似的问题,结果可能有几个原因。

一个可能的选择是该调用等待获得shell提示符以返回。但是,对于需要sudo的命令,其行为可能会发生变化:在某些情况下,它会要求您先输入密码。在其他情况下(例如,如果您刚刚使用了sudo且尚未超时),则不需要再次输入密码。这种不一致可能会导致问题。

看一看here - 使用-k可能会解决您的问题。

为了解决这个问题,您必须定义(如果可能)sudo将始终需要密码,从而使其一致。

另一个可能引发的问题是shell提示的定义(某些shell使用>,其他使用$);对于sudo可能也是如此 - 它可能会打印Password:,其中不包含shell提示符并且可能无法被远程命令代理识别,并且可能会打印其他内容,例如, password

+0

感谢您的回复,我尝试过使用sudo -k,但没有运气。有趣的是,当我硬编码dbname和像[[“”“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'只能确保远程服务器的行为一致。但是,你必须记住,当要求输入密码时,它不使用shell符号(比如''''或'$'),因此如果paramiko只等待其中一个,它就会被阻塞。 'Password:'(或者它出现在你的系统中的任何东西)被认为是该呼叫的shell标记。 – Mike

相关问题