paramiko模块
paramiko 模块是基于 Python 实现的 SSH 远程安全连接,用于 SSH 远程执行命令、文件传输等功 能。 默认 Python 没有,需要手动安装:
安装pip:yum install python-pip -y
安装paramiko:pip install paramiko 如安装失败,可以尝试 yum 安装:yum install python-paramiko
SSHClient类和SFTPClient类
SSHClient类常用的几个方法:
1)connect:connect方法实现远程服务器连接与认证,对于方法,只有hostname是必传参数。
2)set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:分别是AutoAddPolicy,RejectPolicy(默认策略)与WarningPolicy,分别表示自动添加服务器到know_hosts文件、拒绝本次连接、警告并将服务器添加到know_hosts文件中。
3)exec_command:在远程服务器执行Linux命令的方法
4)open_sftp:在当前的ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。
SFTPClient类常用的方法:
- put:上次本地文件到远程服务器
- get:从远程服务器下载文件到本地
- mkdir:在远程服务器上创建目录
- remove:删除远程服务器中的文件
- rmdir:删除远程服务器中的目录
- rename:重命名远程服务器中文件或目录
- stat:获取远程服务器中文件的详情信息
- listdir:列出远程服务器中指定目录下的内容
1)ssh密码远程执行命令
#!/usr/bin/env python # coding:utf-8
import paramikoclass SSHClient(): def __init__(self,host,port,user,password): self.ssh_host = host self.ssh_port = port self.ssh_user = user self.ssh_password = password self._connect() def _connect(self): self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: self.ssh.connect(hostname=self.ssh_host, port=self.ssh_port, username=self.ssh_user, password=self.ssh_password,timeout=10) except Exception as e: print(e) print('ssh连接失败') def execute_command(self,command): stdin,stdout,stderr = self.ssh.exec_command(command) return stdout, stderr @property def close_ssh(self): self.ssh.close() if __name__ == "__main__": ssh_obj = SSHClient('172.16.84.222',22,'root','123456') stdout,stderr = ssh_obj.execute_command('df -h') if stderr.read()=="": print(stdout.read()) #stdout.read()返回结果为一个大的字符串,而stdout.readlines()是把返回结果放到一个列表中 else: print(stderr.read()) ssh_obj.close_ssh
2)私钥认证远程执行命令
#!/usr/bin/env python # coding:utf-8 import paramiko class SSHClient(): def __init__(self,host,port,user,pkey): self.ssh_host = host self.ssh_port = port self.ssh_user = user self.private_key = paramiko.RSAKey.from_private_key_file(pkey) self._connect() def _connect(self): self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: self.ssh.connect(hostname=self.ssh_host, port=self.ssh_port, username=self.ssh_user, pkey=self.private_key,timeout=10) except Exception as e: print(e) print('ssh连接失败') def execute_command(self,command): stdin,stdout,stderr = self.ssh.exec_command(command) return stdout, stderr @property def close_ssh(self): self.ssh.close() if __name__ == "__main__": ssh_obj = SSHClient('172.16.84.222',22,'root','/root/.ssh/id_rsa') stdout,stderr = ssh_obj.execute_command('df -h') if stderr.read()=="": print(stdout.read()) else: print(stderr.read()) ssh_obj.close_ssh
3)上传文件到远程服务器
基于以上代码我们可以直接打开一个sftp会话或这直接创建SFTPClient类来使用,可参考一下示例代码:
#!/usr/bin/env python # coding:utf-8 import paramiko def deploy_monitor(ip): with paramiko.SSHClient() as client: client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=ssh_host, port=ssh_port, username=ssh_user, password=ssh_password,timeout=10) stdin,stdout,stderr=client.exec_command('ls -l') print(stdout.readlines()) with client.open_sftp() as sftp: sftp.put('monitor.py','monitor.py') sftp.chmod('monitor.py',0075) def main(): with open('hosts') as f: for line in f: deploy_monitor(line.strip()) if __name__ == "__main__": main()
以上除了使用Python的上下文管理器进行及时关闭连接,还是调用对象的close方法进行关闭连接。