我正在尝试编写一个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()
我的命令只需要一次密码。所以,它解决了我的问题。