• paramiko模块及ssh远程登陆


      ssh实现远程登陆一般有两种方式,一种就是用户密码登陆,另一种是密钥登陆(当然默认是要服务端打开ssh服务)。

      我这里使用这两种方法操作一下远程登陆,测试客户端是本机的root与jeff用户,远程连接我的阿里云服务器。

      用户及密码登陆

    root@debian:/tmp# ssh root@120.79.254.225
    root@120.79.254.225's password: 
    Last login: Thu Mar 29 20:23:02 2018 from 180.152.104.234
    
    Welcome to Alibaba Cloud Elastic Compute Service !
    
    [root@izwz9bqngpatc008nw00e7z ~]# pwd
    /root
    [root@izwz9bqngpatc008nw00e7z ~]# 

      root为服务端用户,输入帐号密码后,即登陆阿里云服务器。

      密钥登陆

      首先我们要在客户端创建密钥对。

    root@debian:/tmp# ssh-keygen -t rsa -f ~/.ssh/id_rsa

      默认不指定-f则默认存放到当前用户家目录下的.ssh目录下。在~/.ssh目录中生成两个文件:id_rsa(私钥) id_rsa.pub(公钥)。

      然后我们将公钥导入到我们服务端。

      在服务器中,目标用户(用来远程登录的用户)的公钥数据库位于~/.ssh/目录下,默认文件名是authorized_keys

      将我们的公钥输入到authorized_keys文件里。保证authorized_keys文件的权限为600,否则会报错。

    root@debian:/tmp# ssh root@120.79.254.225
    Last failed login: Thu Mar 29 20:36:38 CST 2018 from 103.244.83.194 on ssh:notty
    There were 5 failed login attempts since the last successful login.
    Last login: Thu Mar 29 20:32:42 2018 from 180.152.104.234
    
    Welcome to Alibaba Cloud Elastic Compute Service !
    
    [root@izwz9bqngpatc008nw00e7z ~]# 

      下一次访问,客户端访问服务端则不需要再输入密码了。如上。

      paramiko模块

      一个基于python实现的ssh远程安全连接,用于ssh远程执行命令、文件传输等功能的ssh客户端模块。

      注:在python中的paramiko模块依赖一个加密信息安全模块crypto(pip安装paramiko时就有)。

      使用paramiko登陆,探测,执行命令都需要用到SSHClient()。

    In [1]: import paramiko
    
    In [2]: jfsh = paramiko.SSHClient()

      paramiko.Transport()用来做传输时使用,我们暂时不用。

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

      客户端第一次访问时,服务端会创建一个konw_host文件存下客户端key,上述方式实现自动将不是自己konw_host下保存的key自动加入到里面。通过这一步就可以进行ssh连接了。

    In [4]: jfsh.connect('120.79.254.225', '22', 'root', '密码')

      未报错则连接正常,密码错误或其他则会报错。

      paramiko实现密钥连接的前提必须是在此之前已经配置好密钥连接了。

      然后如上操作到连接步骤。

      我们需要使用paramiko的方法加载出密钥(私钥)。

    In [8]: key = paramiko.RSAKey.from_private_key_file('/home/jeff/.ssh/id_rsa')

      除了RSA的加密,DSS加密要使用DSSKEY方法。

    In [9]: jfsh.connect('120.79.254.225', '22', 'root', pkey=key)

      未报错,则表示登陆成功了。

      远程登陆成功后使用exec_command进行执行命令:

    In [10]: jfsh.exec_command('ls /tmp')
    Out[10]: 
    (<paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0xe8edd668 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>,
     <paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0xe8edd668 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>,
     <paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0xe8edd668 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>)
    In [11]: stdin,stdout,stderr = jfsh.exec_command('ls /tmp')
    In [14]: stdout.read()
    Out[14]: b'Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
    functions
    grub2.cfg
    Python-3.6.4
    systemd-private-92f635f8f8cc42deb37a874145ea6c0e-ntpd.service-nfoTQ6
    test.sh
    '

      

  • 相关阅读:
    如何让Surface RT支持网站的flash
    C# 线程同步
    WPF中Visible设为Collapse时,VisualTreeHelper.GetChildrenCount为0
    Set connectionId threw an exception.
    C# 深化基本概念
    wpf如何获取control template里的元素
    DataGrid当列宽超出当前宽度时,没有数据也恒有滚动条
    利用MEF实现插件机制(可根据输入类型来加载特定dll)
    利用正则表达式类解析SQL语句,达到Worklist兼容各个RIS数据库的目的
    Mysql 创建存储过程 更新表
  • 原文地址:https://www.cnblogs.com/Jeffding/p/8667329.html
Copyright © 2020-2023  润新知