在需要带密码输入的Sudo的远程服务器上执行命令 - Paramiko

时间:2016-11-23 09:55:44

标签: python ssh sudo paramiko

我正在尝试使用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() 

sample output

任何建议和建议将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

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

一个可能的选择是调用等待获取shell提示以便返回。但是,对于需要sudo的命令,行为可能会更改:在某些情况下,它将要求您首先输入密码。在其他情况下(例如,如果您刚刚使用sudo并且它还没有超时),它将不再需要密码。这种不一致可能会导致问题。

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

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

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