python批量ssh并执⾏命令
1、安装paramiko模块
pip install paramiko
可以修改ssh连接超时时间,windows下路径:在安装路径Python\Python36\Lib\site-packages\paramiko\transport.py,修改self.banner_timeout = 60(设置ssh超时为60秒)
2、利⽤python进⾏ssh
import paramiko,getpass #getpass是隐藏密码
def ssh_connect(password):
host_ip = '192.168.0.150'
user_name = 'root'
host_port ='22'
# 待执⾏的命令
sed_command = "sed -i 's/123/abc/g' /root/"
ls_command = "ls /root/test/"
# 注意:依次执⾏多条命令时,命令之间⽤分号隔开
command = sed_command+";"+ls_command
# SSH远程连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #指定当对⽅主机没有本机公钥的情况时应该怎么办,AutoAddPolicy表⽰⾃动在对⽅主机保存下本机的秘钥 t(host_ip, host_port, user_name, password)
# 执⾏命令并获取执⾏结果
stdin, stdout, stderr = _command(command)
out = adlines()
err = adlines()
#关闭连接
ssh.close()
return out,err
if__name__ == '__main__':
pwd = pass("请输⼊密码:")
#有了密码,开始调⽤函数
result = ssh_connect(pwd)
print(result)
python中的paramiko模块是⽤来实现ssh连接到远程服务器上的库,在进⾏连接的时候,可以⽤来执⾏命令,也可以⽤来上传⽂件。
1、得到⼀个连接的对象
在进⾏连接的时候,可以使⽤如下的代码:
def connect(host):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
#t(host,username='root',allow_agent=True,look_for_keys=True)
return ssh
except:
return None
在connect函数中,参数是⼀个主机的IP地址或者是主机名称,在执⾏这个⽅法之后,如果成功的连接到服务器,那么就会返回⼀个sshclient对象。
第⼀步是建⽴⼀个SSHClient的对象,然后设置ssh客户端允许连接不在know_host⽂件中的机器,然后就尝试连接服务器。
在连接服务器的时候,可以使⽤两种⽅式:
(1)⽅式是使⽤秘钥的⽅式,也就是参数look_for_keys
(2)⽤设置密码寻,也可以直接使⽤密码的⽅式,也就是直接使⽤参数password,从⽽最后返回⼀个连接的对象。
2、获取设置的命令
在进⾏paramiko连接之后,那么必须要得到需要执⾏的命令,如下代码所⽰:
def command(args,outpath):
cmd = '%s %s' % (outpath,args)
return cmd
在参数中,⼀个是args,⼀个outpath,args表⽰命令的参数,⽽outpath表⽰为可执⾏⽂件的路径,例
如/usr/bin/ls -l。在其中outpath也就是/usr/bin/ls ,⽽参数为-l 这个⽅法主要是⽤来组合命令,将分开的参数作为命令的⼀部分进⾏组装。
3、执⾏命令
在连接过后,可以进⾏直接执⾏命令,那么就有了如下的函数:
def exec_commands(conn,cmd):
stdin,stdout,stderr = _command(cmd)
ad()
return results
在此函数中,传⼊的参数⼀个为连接的对象conn,⼀个为需要执⾏的命令cmd,最后得到执⾏的结果,也就是ad(),最后返回得到的结果
4、上传⽂件
在使⽤连接对象的时候,也可以直接进⾏上传相关的⽂件,如下函数:
def copy_moddule(conn,inpath,outpath):
ftp = conn.open_sftp()
ftp.put(inpath,outpath)
ftp.close()
return outpath
此函数的主要参数为,⼀个是连接对象conn,⼀个是上传的⽂件名称,⼀个上传之后的⽂件名称,在此必须写⼊完整的⽂件名称包括路径。
做法主要是打开⼀个sftp对象,然后使⽤put⽅法进⾏上传⽂件,最后关闭sftp连接,最后返回⼀个上传的⽂件名称的完整路径
5、执⾏命令得到结果
最后就是,执⾏命令,得到返回的结果,如下代码:
def excutor(host,outpath,args):
conn = connect(host)
if not conn:
return [host,None]
#调⽤函数
exec_commands(conn,'chmod +x %s' % outpath)
#调⽤函数,获得命令参数及其路径
cmd =command(args,outpath)
#调⽤函数执⾏命令
result = exec_commands(conn,cmd)
print'%r' % result
result = json.loads(result)
return [host,result]
⾸先,进⾏连接服务器,得到⼀个连接对象,如果连接不成功,那么返回主机名和None,表⽰没有连接成功,如果连接成功,那么修改⽂件的执⾏权限,从⽽可以执⾏⽂件,然后得到执⾏的命令,最后,进⾏执⾏命令,得到结果,将结果⽤json格式表⽰返回,从⽽结果能得到⼀个美观的json格式,最后和主机名⼀起返回相关的信息
6、测试代码
测试代码如下:
if__name__ == '__main__':
print json.dumps(excutor('192.168.1.165','ls',' -l'),indent=4,sort_keys=True)
print copy_module(connect('192.168.1.165'),'','/root/')
exec_commands(connect('192.168.1.165'),'chmod +x %s' % '/root/')
第⼀步测试命令执⾏,第⼆步测试上传⽂件,第三部测试修改上传⽂件的权限。
完整代码如下:
#!/usr/bin/env python
import json
import paramiko
def connect(host):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
#t(host,username='root',allow_agent=True,look_for_keys=True)
return ssh
except:
return None
def command(args,outpath):
cmd = '%s %s' % (outpath,args)
return cmd
def exec_commands(conn,cmd):
stdin,stdout,stderr = _command(cmd)
ad()
return results
def excutor(host,outpath,args):
conn = connect(host)
if not conn:
return [host,None]
#exec_commands(conn,'chmod +x %s' % outpath)
cmd =command(args,outpath)
result = exec_commands(conn,cmd)
result = json.dumps(result)
return [host,result]
def copy_module(conn,inpath,outpath):
ftp = conn.open_sftp()
ftp.put(inpath,outpath)
ftp.close()
return outpath
if__name__ == '__main__':
print json.dumps(excutor('192.168.1.165','ls',' -l'),indent=4,sort_keys=True)
print copy_module(connect('192.168.1.165'),'','/root/')
exec_commands(connect('192.168.1.165'),'chmod +x %s' % '/root/')
Python实现ssh批量登录并执⾏命令
pexpect模块版本
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pexpect
def ssh_cmd(ip, passwd, cmd):
ret = -1
ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd))
try:
i = pect(['password:', 'continue connecting (yes/no)?'], timeout=5) if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes\n')
ssh.sendline(passwd)
ssh.sendline(cmd)
r = ad()
print r
ret = 0
except pexpect.EOF:
print"EOF"
ssh.close()
ret = -1
except pexpect.TIMEOUT:
print"TIMEOUT"
ssh.close()
ret = -2
return ret
aramiko模块版本
#-*- coding: utf-8 -*-
#!/usr/bin/python
import paramiko
import threading
def ssh2(ip,username,passwd,cmd):
try:python默认安装路径
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for m in cmd:
stdin, stdout, stderr = _command(m)
#stdin.write("Y") #简单交互,输⼊ ‘Y'
out = adlines()
#屏幕输出
for o in out:
print o,
print'%s\tOK\n'%(ip)
ssh.close()
except :
print'%s\tError\n'%(ip)
if__name__=='__main__':
cmd = ['cal','echo hello!']#你要执⾏的命令列表
username = ""#⽤户名
passwd = ""#密码
threads = [] #多线程
"
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 切换root 执⾏命令的⽅法import paramiko
def create_user(root_pwd,username,password):
result = []
ssh = paramiko.SSHClient()
#把要连接的机器添加到known_hosts⽂件中
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
hostname = settings.HOST,
port = settings.PORT,
username = settings.USERNAME,
password = settings.PASSWORD,
timeout = 60,
)
sc = ssh.invoke_shell()
#定义函数
def exe_cmd(cmd,t=0.1):
sc.send(cmd)
sc.send("\n")
time.sleep(t)
resp = sc.recv(9999).decode("utf8")
#print "cmd='%s',echo='%s'\n"%(cmd,resp)
return resp
#切换root账号
resp = exe_cmd("su root",t=1)
dswith(u"密码:"):
resp = exe_cmd(root_pwd)
#创建⽤户
cmd_create_user = "useradd {username} -d /home/{username}".format(
username = username,
)
exe_cmd(cmd_create_user)
#修改密码
cmd_change_user_pwd = """echo "{password}" | passwd --stdin {username}""".format( username = username,
password = password,
)
exe_cmd(cmd_change_user_pwd)
Python实现SSH远程登陆,并执⾏命令的⽅法import paramiko
def sshclient_execmd(hostname, port, username, password, execmd):
paramiko.util.log_to_file("paramiko.log")
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接
stdin, stdout, stderr = s.exec_command (execmd)
stdin.write("Y") # Generally speaking, the first connection, need a simple interaction. ad()
s.close()
def main():
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论