=Start=
缘由:
翻看以前的笔记时发现的文章(主要是按自己的需求验证「别人文章」所写内容的正确性),想着以后可能会用到,所以记录至此,方便以后参考。
正文:
参考解答:
什么是paramiko
paramiko是用纯Python实现SSHv2协议的Python模块,使用它能够方便地与远程计算机交互。简单的说,就是你在终端下执行的如下命令,可以通过Python的paramiko模块实现了:
# 执行shell语句 ssh -i ~/.ssh/id_rsa -p 2222 [email protected] -e 'ls -al' # 拷贝数据到远程计算机 scp -i ~/.ssh/id_rsa -P 2222 -r data [email protected]:~/data
安装paramiko
$ sudo pip instal paramiko
使用paramiko
使用密码建立SSH连接:
import paramiko ssh = paramiko.SSHClient() # 这行代码的作用是允许连接不在know_hosts文件中的主机。 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("x.x.x.x", port, "username", "password")
使用私钥建立SSH连接:
ssh = paramiko.SSHClient() ssh.connect('x.x.x.x', port, '用户名', key_filename='私钥')
连接以后可以执行shell命令:
In [8]: ssh.exec_command('ls') Out[8]: (<paramiko.ChannelFile from <paramiko.Channel 1 (open) window=2097152 -> <paramiko.Transport at 0x377c690L (cipher aes128-ctr, 128 bits) (active; 2 open channel(s))>>>, <paramiko.ChannelFile from <paramiko.Channel 1 (open) window=2097152 -> <paramiko.Transport at 0x377c690L (cipher aes128-ctr, 128 bits) (active; 2 open channel(s))>>>, <paramiko.ChannelFile from <paramiko.Channel 1 (open) window=2097152 -> <paramiko.Transport at 0x377c690L (cipher aes128-ctr, 128 bits) (active; 2 open channel(s))>>>)
执行shell命令以后,并不会立即打印命令的执行结果,而是返回几个Channel,只能像下面这样获取输出:
In [9]: stdin, stdout, stderr = ssh.exec_command('ls') In [10]: print stdout.readlines() ['AgentBackkup_2015-06-11\n', 'AgentBackup\n', 'log\n', 'mysql.sh\n', 'rdsAgent\n']
注意: 命令执行出错并不会抛出异常,所以,对于命令出错需要根据自己的需求进行相应的处理:
In [54]: stdin, stdout, stderr = ssh.exec_command('cat file_not_found') In [55]: print stdout.readlines() [] In [56]: print stderr.readlines() [u'cat: file_not_found: No such file or directory\n'] In [57]: stdin, stdout, stderr = ssh.exec_command('ls') In [58]: print stderr.readlines()
实现文件传输的功能
通过paramiko在计算机之间传输文件有如下方式:
sftp = paramiko.SFTPClient.from_transport(ssh.get_transport()) sftp = ssh.open_sftp()
即新建一个 SFTPClient 对象,该对象复用之前的SSH连接,因此,我们使用sftp传输文件时,不需要再次进行用户认证。
文件上传
In [59]: sftp.put('memory.py', 'memory.py') Out[59]: <SFTPAttributes: [ size=288 uid=1000 gid=1000 mode=0100644 atime=1435391914 mtime=1435391914 ]>
文件下载
In [60]: sftp.get('memory.py', 'backup.py')
执行命令
paramiko并没有提供一个叫做scp的子模块,如果我们希望在计算机之间传输数据,可以通过sftp(sftp实现了scp所有的功能,也就没有必再实现一个scp)传输文件,还可以通过sftp执行命令,如下所示:
In [44]: sftp.listdir() Out[44]: ['.viminfo', '.bash_logout', '.bash_history', 'AgentBackkup_2015-06-10', 'AgentBackup', 'rdsAgent'] In [45]: sftp.rename('AgentBackkup_2015-06-10', 'AgentBackkup_2015-06-11') In [46]: sftp.listdir() Out[46]: ['AgentBackkup_2015-06-11', '.viminfo', '.bash_logout', '.bash_history', 'AgentBackup', 'rdsAgent']
sftp提供了很多命令,具体内容可以参考官方文档。
参考链接:
- 使用python的paramiko模块实现ssh与scp功能
- https://paramiko-docs.readthedocs.io/en/2.2/api/client.html
- https://paramiko-docs.readthedocs.io/en/2.2/api/sftp.html
- Python远程控制模块paramiko遇到的问题及解决记录
=END=
《 “使用Python的paramiko模块实现ssh与scp功能” 》 有 3 条评论
Stupid Nix Tricks: SSH Multiplexing(SSH多路复用)
https://0x00sec.org/t/stupid-nix-tricks-ssh-multiplexing/5583
golang ssh 客户端
http://blog.kukafei520.net/html/2017/1026.html
Web based ssh client
https://github.com/huashengdun/webssh
python模块paramiko与ssh
http://www.361way.com/python-paramiko-ssh/3984.html
https://stackoverflow.com/questions/10745138/python-paramiko-ssh
# ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 允许连接不在know_hosts文件中的主机
http://docs.paramiko.org/en/stable/api/client.html#paramiko.client.SSHClient.set_missing_host_key_policy