用于在远程节点上执行交互式命令的Python脚本

时间:2018-02-09 19:14:41

标签: python paramiko

我正在尝试编写一个python脚本(Python 2.7.12),用于在远程节点上执行交互式命令。我使用“paramiko”创建会话,非交互式命令使用该会话正常运行。下面是我创建会话和执行命令的类:

from paramiko import client

class ssh:
    client = None

    def __init__(self, hostname, username, password,verbose=1):
    if verbose == 1 :
            print("connecting to server " + hostname)
        try :
            self.client = client.SSHClient()
            self.client.set_missing_host_key_policy(client.AutoAddPolicy())
            self.client.connect(hostname, username=username, password=password)
        except :
            print "Error in connecting to server " + hostname
            print "Terminating Further execution"
            exit()

    def sendCommand(self, command):   
        res =  {'rc': -1,
            'stdout': '',
            'stderr': ''
            }
        nbytes = 204800000000000000000

        if(self.client):
            try :
               out = self.client.exec_command(command)
            except:
               print "Can't execute Command"

            stdout = out[1]
            stderr = out[2]

            stdout_data = []
            stderr_data = []

            while True:
                data = stdout.channel.recv(nbytes)
                if len(data) == 0:
                    break
                stdout_data.append(data)
            stdout_data = "".join(stdout_data)

            while True:
                err_str = stderr.channel.recv_stderr(nbytes)
                if len(err_str) == 0:
                    break
                stderr_data.append(err_str)
            stderr_data = "".join(stderr_data)

            res['stdout'] = stdout_data.strip()
            res['stderr'] = stderr_data.strip()
            res['rc'] = stdout.channel.recv_exit_status()
            return res
        else:
            print("Connection not open")
        self.client.close()

我在脚本中使用此类如下:

ssh_obj = ssh(node, user, password, 0)
out = ssh_obj.sendCommand("some_command")
stdout = out['stdout']

现在,我想使用此类发送交互式命令。该命令要求输入已用于创建会话的用户密码。是否有可能使用paramiko?

如果没有,还有其他办法吗?我对任何可以使用python在远程节点上执行交互式命令执行的选项/建议持开放态度。

答案:
感谢pynexj的建议。我使用了paramiko的'stdin'并解决了问题。刚刚在脚本中添加了以下内容:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy() )
ssh.connect(hostname=node, username=user, password=password)

cmd = 'some_command'

stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write(password)
stdin.write('\n')
stdin.flush()

我的命令只需要一次密码。所以,它解决了我的问题。

0 个答案:

没有答案