【问题标题】:Execute a Command on a Remote Server That Requires Sudo with password input - Paramiko在需要输入密码的 Sudo 的远程服务器上执行命令 - Paramiko
【发布时间】:2017-04-07 06:18:10
【问题描述】:

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

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

【问题讨论】:

    标签: python ssh sudo paramiko


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复,我已尝试使用 sudo -k 但没有运气。有趣的是,当我硬编码 dbname 和 client 值(如 ["""send_string_and_wait('sh /orashare/ettool/Validation_Final.sh dbname client' + "\n", 1, True)"""]
    • 但是我在传递变量“”send_string_and_wait("sh /orashare/ettool/Validation_Final.sh" + " " + str(dbname) + " " + str(cl) + "\n", 0, True)""" 我猜应该是语法问题,错了请指正
    • 试着看看你从远程服务器得到了什么。使用-k 只能确保远程服务器以一致的方式运行。但是,您必须记住,在询问密码时,它不使用 shell 符号(如 >$),因此如果 paramiko 只等待其中一个,它将阻塞。您必须将其配置为引用 Password: (或您系统中出现的任何内容)被视为该调用的 shell 符号。
    • 最后我通过将 wait_time 参数更改为 5 秒解决了这个问题,即 [ a=send_string_and_wait("sh Validation_Final.sh" + str(' ') + str(dbname) + str(' ' ) + str(cl) + "\n", 5, True) ] 执行代码需要 3 到 4 秒
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多