【问题标题】:Paramiko ssh without password using host based authentication使用基于主机的身份验证没有密码的 Paramiko ssh
【发布时间】:2018-12-19 02:13:09
【问题描述】:

我可以使用命令从 Linux 机器 A SSH 到 Linux 机器 B

ssh user@ip.com 

此连接不需要密码。我正在尝试使用 Python Paramiko 实现相同的自动化。这是代码

import os
import paramiko
ssh_client =paramiko.SSHClient()
ssh_client.connect(
    hostname="myhost.com",
    username="jagan",
    password=None,
    look_for_keys=False
)

它给出以下错误:

/lib/python3.6/site-packages/paramiko/client.py in connect(self, hostname, port, username, password, pkey, key_filename, timeout, allow_agent, look_for_keys, compress, sock, gss_auth, gss_kex, gss_deleg_creds, gss_host, banner_timeout, auth_timeout, gss_trust_dns, passphrase)
    422             username, password, pkey, key_filenames, allow_agent,
    423             look_for_keys, gss_auth, gss_kex, gss_deleg_creds, t.gss_host,
--> 424             passphrase,
    425         )
    426 

/Application/DataScience/Anaconda/anaconda3/envs/hub/lib/python3.6/site-packages/paramiko/client.py in _auth(self, username, password, pkey, key_filenames, allow_agent, look_for_keys, gss_auth, gss_kex, gss_deleg_creds, gss_host, passphrase)
    713         if saved_exception is not None:
    714             raise saved_exception
--> 715         raise SSHException('No authentication methods available')
    716 
    717     def _log(self, level, msg):

SSHException: No authentication methods available

这是在没有密码或任何内容的情况下连接到服务器的正确方法


身份验证机制是基于主机的。在/etc/ssh/ssh_config

HostbasedAuthentication yes
EnableSSHKeySign yes setting

我相信这就是它不要求输入密码的原因。

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    Paramiko 不支持SSH "hostbased" authentication

    考虑切换到常规公钥身份验证。

    请注意,有些人认为“基于 IP 的身份验证”(= 不需要客户端提供任何内容的身份验证)是 SSH“基于主机”的身份验证。它不是。对于“基于 IP”的身份验证”,您不需要在客户端进行任何设置。

    【讨论】:

      【解决方案2】:

      有一个类似的问题,因为我想使用 paramiko ssh 的传输层执行安全复制 (scp)。

      我花了几个小时才从 scp python lib 的文档中找到解决方案,并且我设法连接到一个不使用密钥和密码的主机。也许这个传输层也可以用于 SSH 客户端。按照我的示例代码:

      import paramiko
      from scp import SCPClient
      import sys
      
      def transfer_image(source, destination):
          def progress(file, size, transferred):
              sys.stdout.flush()
              sys.stdout.write("\rTransferred {0:.2f}Mb of {1:.2f} Mb total. {2:.2f}%"
                    .format(transferred / 1048576, size / 1048576, transferred * 100 / size))
      
          hostname = '192.168.1.100'
          username = "root"
          port = 22
      
          try:
              print('Trying to connect...')
      
              t = paramiko.Transport((hostname, port))
              t.connect()
              t.auth_none(username)
      
              scp = SCPClient(t, progress=progress)
              print('Connected, sending file {}'.format(source))
              scp.put(source, destination)
      
              scp.close()
          except:
              print('Error transferring files.')
      

      【讨论】:

      • 我认为这只有在身份验证不是基于主机的情况下才有效。我也试过了。我可能缺少一些操作系统级别的设置?
      • 这个答案与HostbasedAuthentication无关。它只是连接到不需要客户端进行任何身份验证的服务器。
      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 2015-07-12
      • 1970-01-01
      • 2020-09-04
      • 2016-04-19
      • 1970-01-01
      • 2012-11-01
      • 2020-04-20
      相关资源
      最近更新 更多