在工作中我们会一遍又一遍地去通过执行shell命令来完成机械重复的事情,但最近发现能否通过python来减轻工作机械重复的耗时,提高工作效率,所以就尝试进行python SSH的代码实现。
本次使用的库是:paramiko(怎么像是日本的英文名?!)
一、通用SSH命令执行
通过SSHClient进行SSH客户端定义,并执行connect远程连接后进行exec_command执行相应shell命令,代码片段如下:
def sshdo(hostname,port,username,pwd,command):
ssh = paramiko.SSHClient()# 创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 允许连接不在know_hosts文件中的主机
ssh.connect(hostname=hostname,port=port,username=username,password=pwd)# 连接服务器
log_file =open('./log_file.txt','w')
for cin command:
print(">>>" + c +":",file=log_file)
stdin, stdout, stderr = ssh.exec_command(c)
res, err = stdout.read(), stderr.read()
result = resif reselse err
res = result.decode()
res = result.decode("utf-8")
res = result.decode(encoding="utf-8")
print(res,file=log_file)
log_file.close()
ssh.close()# 关闭连接
二、跳板机到目标机器SSH命令执行
跳板机需要用到paramiko里面的channel(通道)方法,通过通道发送shell命令,代码片段如下:
def sshchannel_sendcmd(ip,username,password,port,cmds):
try:
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname=ip,port=port,username=username,password=password)
channel = s.invoke_shell()
channel.settimeout(10)
time.sleep(10)
for cin cmds:
channel.send(c+'\n')
time.sleep(2)
try:
res = channel.recv(65533).decode('utf-8').strip()
except Exception as e:
print(e)
break
channel.close()
except Exception as e:
print(e)
其中ip 为跳板机IP,目标资源在cmds进行命令交互