windows安装openssh实现paramiko文件上传功能

1.windows安装openssh实现paramiko文件上传功能

  • 需求分析:需要从python端本地将某个文件上传至远端windows服务器的某个指定目录下。

    这次思路是采用python的 paramiko 库。paramiko是基于SSH用于连接远程服务器并执行相关操作。ssh是一个协议,OpenSSH是其中一个开源实现,

  • 由于windows系统,是不支持linux的openssh功能,所需我们需要下载最新openssh进行windows安装

  • openssh下载地址:https://github.com/PowerShell/Win32-OpenSSH

  • 下载openssh
    image

    下载zip包,32位还是64位根据自己需求下载,我这里下载的64位

  • 解压openssh包,解压到对应位置,C:\Program Files
    windows安装openssh实现paramiko文件上传功能-小白菜博客
    image

    进入文件夹,我可以看到有我们所需要的openssh的安装文件

  • 打开命令行运行工具,windows powershell ISE进行安装

    PS C:\Users\admin> cd "C:\Program Files\OpenSSH-Win64"
    
    PS C:\Program Files\OpenSSH-Win64> powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
    [SC] SetServiceObjectSecurity 成功
    [SC] ChangeServiceConfig2 成功
    [SC] ChangeServiceConfig2 成功
    sshd and ssh-agent services successfully installed
    
  • 配置OpenSSH服务

    • OpenSSH默认端口为22端口,开启防火墙22端口号,在PowerShell执行以下命令:

      PS C:\Program Files\OpenSSH-Win64>  netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
      
      确定。
      

      注:若在云服务器上安装测试需要确认管理的安全组端口是否已经加入规则

    • 设置OpenSSH服务为自动启动,在PowerShell执行以下命令:

      PS C:\Program Files\OpenSSH-Win64> Set-Service -Name sshd -StartupType 'Automatic'
      
    • 启动OpenSSH服务,在PowerShell执行以下命令:

      PS C:\Program Files\OpenSSH-Win64>  Start-Service sshd
      
    • 确认安装

      打开cmd或者PowerShell,输入ssh命令,出现下图所示,则证明安装成功
      image

  • 安装paramiko

    pip install paramiko
    
  • 编写win-test.py配置文件测试是否能远程成功

    • 编写win-test.py文件

      import paramiko
      
      def win_connect(ip, port, username, password):
          try:
              transport = paramiko.Transport(ip, port)  # 获取Transport实例,其中22为端口号
              transport.connect(username=username, password=password)  # 建立连接
      
              # 获取SFTP实例
              sftp = paramiko.SFTPClient.from_transport(transport)
      
              transport.close()
              return {'code': 200, 'msg': 'SSH连接成功'}
      
          except Exception as e:
              return {'code': 500, 'msg': 'SSH连接失败 %s' % e}
      
      
      if __name__ == '__main__':
          result = win_connect('172.16.128.98',22, 'admin', '123456')
          print(result)
      
    • 测试结果
      image

  • 编写win-test.py配置文件测试是否能远程上传文件

    • 编写win-test.py文件

      import paramiko
      import os
      def win_connect(ip, port, username, password):
          try:
              transport = paramiko.Transport(ip, port)  # 获取Transport实例,其中22为端口号
              transport.connect(username=username, password=password)  # 建立连接
              try:
                  # 获取SFTP实例
                  sftp = paramiko.SFTPClient.from_transport(transport)
      
                  # 设置上传的本地/远程文件路径
                  localpath = os.path.join(os.getcwd(), 'test.txt')
                  remotepath = "E:\\test\\test.txt"
                  # 执行上传动作
                  sftp.put(localpath, remotepath)
      
                  transport.close()
                  return {'code': 200, 'msg': '上传文件成功'}
              except Exception as e:
                  return {'code':500, 'msg':'上传文件失败 %s' %e }
          except Exception as e:
              return {'code': 500, 'msg': 'SSH连接失败 %s' % e}
      
      
      if __name__ == '__main__':
          result = win_connect('172.16.128.98',22, 'admin', '123456')
          print(result)