ssh远程登录过程:
首先执行命令 ssh username@192.168.1.x ,第一次登录时,系统会提示是否要继续连接,要输入“yes”,然后等一段时间后系统提示输入密码,正确地输入密码后即可登录到远程计算机,然后,执行命令。
以上操作有两次人机交互,一次是输入‘yes’,另一次是输入密码。
可以考虑把人机交互变成自动交互,python的pexpect模块可以实现自动交互。
以上为pexpect实现自动交互登录并执行命令的函数:
#!/usr/bin/env python # -*- coding: utf-8 -*- #edit by www.jb200.com import pexpect def ssh_cmd(ip, passwd, cmd): ret = -1 ssh = pexpect.spawn(‘ssh root@%s “%s”‘ % (ip, cmd)) try: i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5) if i == 0 : ssh.sendline(passwd) elif i == 1: ssh.sendline(‘yesn’) ssh.expect(‘password: ‘) ssh.sendline(passwd) ssh.sendline(cmd) r = ssh.read() print r ret = 0 except pexpect.EOF: print “EOF” ssh.close() ret = -1 except pexpect.TIMEOUT: print “TIMEOUT” ssh.close() ret = -2 return ret
pexpect模块,由于提供了自动交互功能,因此可以实现ftp,telnet,ssh,scp等的自动登录。
以上代码的缺点是比较费时间,因为程序要等待自动交互出现,另外ubuntu用ssh连接就是比较慢,要进行一系列的验证,这样才体现出ssh的安全。
python中的paramiko模块,实现ssh登录更加简单。
例子:
#-*- coding: utf-8 -*- #!/usr/bin/python import paramiko import threading def ssh2(ip,username,passwd,cmd): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,22,username,passwd,timeout=5) for m in cmd: stdin, stdout, stderr = ssh.exec_command(m) # stdin.write(“Y”) #简单交互,输入 ‘Y’ out = stdout.readlines() #屏幕输出 for o in out: print o, print ‘%stOKn’%(ip) ssh.close() except : print ‘%stErrorn’%(ip) if __name__==’__main__’: cmd = ['cal','echo hello!']#你要执行的命令列表 username = “” #用户名 passwd = “” #密码 threads = [] #多线程 print “Begin……” for i in range(1,254): ip = ’192.168.1.’+str(i) a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd)) a.start()
代码说明:
以上介绍了,分别用python的pexpect模块、paramiko模块实现ssh远程交互的例子,希望对大家有所帮助。