Python中SSH协议的实现 - Pa

发布时间:2019-08-28 09:09:04编辑:auto阅读(1720)

    操作系统维护时, 一般会通过ssh命令连接到远端服务器, 进行某些操作. 那Python中如何完成这些呢, 当然也能执行ssh命令, 但还有更优雅的方式, 借助Paramiko, 其为实现了SSHv2协议的一开源项目, 下面主要使用了它的ssh和sftp客户端的相关功能.



    安装

    # pip install paramiko



    SSH客户端使用

    In [1]: import paramiko


    #获取SSHClient对象.

    In [2]: ssh = paramiko.SSHClient()


    #设置host key策略.

    #ssh.load_system_host_keys('/root/.ssh/known_hosts')

    In [3]: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())


    #连接到SSH server, connect方法有若干参数, 可据需要设置, 如超时(timeout).

    In [4]: ssh.connect('192.168.1.4')


    #在SSH server上执行命令, 返回其I/O流, 类似于Python中的文件句柄, 标准输出(stdout)和标准错误(stderr)较常用.

    In [5]: stdin, stdout, stderr = ssh.exec_command('ls -l /tmp/')


    #获取标准输出

    In [11]: for line in stdout:

        ...:     print '-> ' + line.strip('\n')

        ...: 

    -> total 16

    -> -rw-r--r-- 1 root root 2 Jan 24 18:27 a.txt

    -> -rw-r--r-- 1 root root 2 Jan 24 18:27 b.txt

    -> -rw-r--r-- 1 root root 2 Jan 24 18:27 c.txt

    -> -rw-r--r-- 1 root root 2 Jan 24 18:27 d.txt


    SFTP客户端使用

    #在连接到SSH server基础上, 获取SFTPClient对象.

    sftp = ssh.open_sftp()


    #上传文件

    In [13]: sftp.put('/tmp/zz.txt', '/tmp/')

    ---------------------------------------------------------------------------

    IOError                                   Traceback (most recent call last)

    <ipython-input-13-0e19a403e0d2> in <module>()

    ----> 1 sftp.put('/tmp/zz.txt', '/tmp/')


    /usr/local/python27/lib/python2.7/site-packages/paramiko/sftp_client.pyc in put(self, localpath, remotepath, callback, confirm)

    ...

    IOError: Failure


    In [14]:


    为什么报错呢, 命令行上测试正常的...

    # sftp 192.168.1.4

    Connected to 192.168.1.4.

    sftp> put '/tmp/zz.txt' '/tmp'

    Uploading /tmp/zz.txt to /tmp/zz.txt

    /tmp/zz.txt        100%    3     0.0KB/s   00:00

    sftp>


    查看sftp_client.py中put方法时, 发现remotepath参数, 需写明目标文件的名称.

    :param str remotepath: the destination path on the SFTP server. Note

        that the filename should be included. Only specifying a directory

        may result in an error.


    这样就可以了.

    In [21]: sftp.put('/tmp/zz.txt', '/tmp/zz.txt')

    Out[21]: <SFTPAttributes: [ size=3 uid=901 gid=901 mode=0100664 atime=1516792881 mtime=1516792881 ]>


    #关闭连接

    In [24]: sftp.close()


    In [25]: ssh.close()


    若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

    qrcode_for_gh_54ffa7e55478_258.jpg

关键字