
离线 TA的专栏
- 打卡等级:热心大叔
- 打卡总天数:232
- 打卡月天数:0
- 打卡总奖励:3550
- 最近打卡:2025-04-08 16:28:38
|
关于
- python的ssh库操作需要引入一个远程控制的模块——paramiko,可用于对远程服务器进行命令或文件操作。
复制代码 应用
- 登陆服务器,问题排查。可用于编写脚本,在服务器上做一些繁琐的重复操作。
复制代码 安装
- 打开cmd,输入命令[code]python -m pip install paramiko
复制代码[/code]
示例
1.秘钥登陆
- 配置免密登录,linux上信任了windows的公钥,然后脚本在windows上跑,使用windows的私钥就可以直接不要密码登录linux
复制代码:提供秘钥的 - paramiko.RSAKey.from_private_key_file('文件')
复制代码,这里面的"文件"是你本机上的秘钥,不是指你被控机上的公钥哦! - import paramiko
- key = paramiko.RSAKey.from_private_key_file("C:\\Users\\liyansheng\\.ssh\\id_rsa")
- ssh = paramiko.SSHClient()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- print("connecting")
- ssh.connect(hostname="192.168.220.128", username="root", pkey=key)
- print("connected")
- commands = "uname -a"
- stdin, stdout, stderr = ssh.exec_command(commands)
- stdin.close()
- res, err = stdout.read(), stderr.read()
- result = res if res else err
- print(result)
- ssh.close()
- if __name__ == '__main__':
- print()
复制代码 2.单个命令执行
文件,引入 模块[/code] - <ol start="2"><li>建立[code]SSHClient
复制代码对象
[/code] - ssh = paramiko.SSHClient()
复制代码- <ol start="3"><li>设置可信任,将主机加到[code]host_allow
复制代码列表
[/code] - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
复制代码- <ol start="4"><li>创建连接</li></ol>
复制代码- ssh.connect("150.158.16.123", 22, "wuyanping", "2022")
复制代码- <ol start="5"><li>创建命令,发送并获取响应结果</li></ol>
复制代码- stdin, stdout, stderr = ssh.exec_command("ls /home")
- print(stdout.read().decode("utf-8"))
复制代码- <ol start="6"><li>关闭连接</li></ol>
复制代码 3.执行多个命令
- # 执行多条命令,注意传入的参数有个list
- def execMultiCmd(host, user, psw, cmds: list, port=22) -> (str, str):
- with paramiko.SSHClient() as ssh_client:
- ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- ssh_client.connect(hostname=host, port=port, username=user, password=psw)
- cmd = ";".join(cmds)
- _, stdout, stderr = ssh_client.exec_command(cmd, get_pty=True)
- result = stdout.read().decode('utf-8')
- err = stderr.read().decode('utf-8')
- return result, err
- if __name__ == '__main__':
- cmdList = ["cd /home", "ls"]
- print(execMultiCmd("192.168.220.128", "root", "root", cmdList))
复制代码 4.SFTPClient下载文件
方法封装: - def down_file(host, user, psw, local_file, remote_file, port=22):
- with paramiko.Transport((host, port)) as transport:
- # 连接服务
- transport.connect(username=user, password=psw)
- # 获取SFTP示例
- sftp = paramiko.SFTPClient.from_transport(transport)
- # 下载
- sftp.get(remote_file, local_file)
- transport.close()
复制代码问题:(错误) - if __name__ == '__main__':
- down_file(my_linux.host, my_linux.user, my_linux.psw, "D:\\ssh_download", "/home/test.txt")
复制代码- Traceback (most recent call last):
- File "D:\MyCode2\py-1\ssh\download.py", line 17, in <module>
- down_file("192.168.220.128", "root", "root", "D:\\ssh_download", "/home/test.txt")
- File "D:\MyCode2\py-1\ssh\download.py", line 11, in down_file
- sftp.get(remote_file, local_file)
- File "D:\MyCode2\py-1\venv\lib\site-packages\paramiko\sftp_client.py", line 810, in get
- with open(localpath, "wb") as fl:
- PermissionError: [Errno 13] Permission denied: 'D:\\ssh_download'
复制代码正确使用 - if __name__ == '__main__':
- down_file(my_linux.host, my_linux.user, my_linux.psw, "D:\\ssh_download\\test.txt", "/home/test.txt")
复制代码 5.上传文件
- def upload_file(host, user, psw, local_file, remote_file, port=22):
- with paramiko.Transport((host, port)) as transport:
- # 连接服务
- transport.connect(username=user, password=psw)
- # 获取SFTP示例
- sftp = paramiko.SFTPClient.from_transport(transport)
- sftp.put(local_file, remote_file)
- transport.close()
复制代码测试同下载, 。如 - if __name__ == '__main__':
- upload_file(my_linux.host, my_linux.user, my_linux.psw, "D:\\ssh_download\\test123.txt", "/home/test/test123.txt")
复制代码 6.ssh工具封装
- import os
- import paramiko
- class SSHTool():
- def __init__(self, ip, port, user, psw):
- """
- 初始化
- :param ip:
- :param port:
- :param user:
- :param psw:
- """
- self.ip = ip
- self.port = port
- self.user = user
- self.psw = psw
- def connect_ssh(self):
- """
- 创建连接
- :return:
- """
- try:
- self.ssh = paramiko.SSHClient()
- self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- self.ssh.connect(
- hostname=self.ip,
- port=self.port,
- username=self.user,
- password=self.psw
- )
- except Exception as e:
- print(e)
- return self.ssh
- def close_ssh(self):
- """
- 关闭连接
- :return:
- """
- try:
- self.ssh.close()
- except Exception as e:
- print(e)
- def exec_shell(self, shell):
- ssh = self.connect_ssh()
- try:
- stdin, stdout, stderr = ssh.exec_command(shell)
- return stdin, stdout, stderr
- except Exception as e:
- print(e)
- def sftp_put_file(self, file, local_dir, remote_dir):
- try:
- t = paramiko.Transport((self.ip, self.port))
- t.connect(username=self.user, password=self.psw)
- sftp = paramiko.SFTPClient.from_transport(t)
- sftp.put(os.path.join(local_dir, file), remote_dir)
- t.close()
- except Exception:
- print("connect error!")
- def sftp_get_file(self, file, local_dir, remote_dir):
- try:
- t = paramiko.Transport((self.ip, self.port))
- t.connect(username=self.user, password=self.psw)
- sftp = paramiko.SFTPClient.from_transport(t)
- sftp.get(remote_dir, os.path.join(local_dir, file))
- t.close()
- except Exception:
- print("connect error!")
复制代码 补充
获取当前文件路径:os.getcwd() - import os
- if __name__ == '__main__':
- print(os.getcwd()) # D:\MyCode2\py-1\ssh
复制代码python函数返回多个参数 - def get_strs() -> (str, str):
- return "hello", "word"
- if __name__ == '__main__':
- # 返回值为元祖的形式
- print(get_strs()) # ('hello', 'word')
- # 获取元祖的个数
- print(len(get_strs())) # 2
- # 通过下标获取元祖的某一个值
- print(get_strs().__getitem__(1)) # word
- # 通过元祖的某个元素定位对应的下标
- print(get_strs().index("hello")) # 0
复制代码with … as …使用 - 为了更好地避免此类问题,不同的编程语言都引入了不同的机制。在 Python 中,对应的解决方式是使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。简单的理解,同时包含 <strong>enter</strong>() 和 <strong>exit</strong>() 方法的对象就是上下文管理器。
复制代码格式: - with 表达式 [as target]:
- 代码块
复制代码 学习参考
- Python]远程SSH库Paramiko简介_alwaysrun的博客-CSDN博客_python ssh库
- Python with as用法详解 (biancheng.net)
- Python中的with-as用法 - 简书 (jianshu.com)
到此这篇关于Python学习之paramiko模块的基础操作与排错的文章就介绍到这了,更多相关Python paramiko模块内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|