我的目标是使用python连接到SSH并验证我可以用Paramiko或Fabric做什么。但我想在每次执行后保持会话打开并读取输入/输出。使用paramiko我只能在会话关闭之前运行1个命令,并且我被要求再次进行身份验证并且会话挂起。由于面料正在使用paramiko库,它给我同样的问题。例如,如果我的目录结构是这样的
-home
- myfolder1
- myfolder2
我想执行以下命令,而不必重新进行身份验证,因为会话已关闭。
(make connection)
run cmd: 'pwd'
output: /home
run cmd: 'cd myfolder2'
run cmd: 'pwd'
output: /home/myfolder2
这可能适用于现在的任何模块吗?它可以用原生蟒蛇从头开始制作吗?这也是不可能的......?
修改已添加代码。没有新的open_session它关闭,我不能运行任何命令。运行第一个命令后,我将再次提示进行身份验证,并创建一个无限循环。
Edit2 如果它在每个命令后关闭,那么这根本无法正常工作吗?
edit3 如果我在不同的服务器上执行此操作,并且exec_command与paramikio.SSHClient一起运行它不会要求我重新进行身份验证,但如果我'cddd'然后'pwd'它将输出我是回到我创建的根目录。
class connect:
newconnection = ''
def __init__(self,username,password):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect('someserver', username=username,password=password,port=22,timeout=5)
except:
print "Count not connect"
sys.exit()
self.newconnection = ssh
def con(self):
return self.newconnection
#This will create the connection
sshconnection = connect('someuser','somepassword').con()
while True:
cmd = raw_input("Command to run: ")
if cmd == "":
break
try:
transport = sshconnection.get_transport()
transport.set_keepalive(999999)
chan = transport.open_session()
chan.settimeout(3)
chan.setblocking(0)
except:
print "Failed to open a channel"
chan.get_exception()
sys.exit()
print "running '%s'" % cmd
stdout_data = []
stderr_data = []
pprint.pprint(chan)
nbytes = 4096
chan.settimeout(5)
chan.get_pty()
chan.exec_command(cmd)
while True:
print "Inside loop " , chan.exit_status_ready()
time.sleep(1.2)
if chan.recv_ready():
print "First if"
stdout_data.append(chan.recv(nbytes))
if chan.recv_stderr_ready():
print "Recv Ready"
stderr_data.append(chan.recv_stderr(nbytes))
if chan.exit_status_ready():
print "Breaking"
break
print 'exit status: ', chan.recv_exit_status()
print ''.join(stdout_data)
答案 0 :(得分:0)
当您可以将命令连接成一个时,可以使用普通模块。尝试
pwd ; cd myfolder2 ; pwd
作为命令。当你有更复杂的需要参数的命令并且参数包含空格时可怕时,这应该可以工作但很快变得乏味。接下来的步骤是将包含所有命令的脚本复制到远程端,并告诉ssh
执行所述脚本。
这种方法的另一个问题是在所有命令都执行之前SSH不会返回。
或者,您可以构建一个“命令服务器”,即一个简单的TCP服务器,它侦听传入的连接并执行发送给它的命令。编写起来非常简单,但也非常不安全。同样,解决方案是将服务器转换为(Python)脚本,该脚本从stdin读取命令并通过SSH远程启动该脚本,然后发送命令。