Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x paramiko错误:身份验证(公钥)失败_Python 3.x_Ssh_Paramiko - Fatal编程技术网

Python 3.x paramiko错误:身份验证(公钥)失败

Python 3.x paramiko错误:身份验证(公钥)失败,python-3.x,ssh,paramiko,Python 3.x,Ssh,Paramiko,我正在使用paramiko连接到Bluehost服务器,在那里我最终想要上传一些文件。我在Bluehost SSH页面上生成了一个密钥对,授权了公钥,下载了私钥,并将私钥存储在与python文件相同的文件夹中 Bluehost有FTP帐户,它们指定对SSH/SFTP使用FTP帐户,这就是我在这里所做的 我的代码: 导入paramiko paramiko.common.logging.basicConfig(级别=paramiko.common.DEBUG) host=“some\u url.co

我正在使用paramiko连接到Bluehost服务器,在那里我最终想要上传一些文件。我在Bluehost SSH页面上生成了一个密钥对,授权了公钥,下载了私钥,并将私钥存储在与python文件相同的文件夹中

Bluehost有FTP帐户,它们指定对SSH/SFTP使用FTP帐户,这就是我在这里所做的

我的代码:

导入paramiko
paramiko.common.logging.basicConfig(级别=paramiko.common.DEBUG)
host=“some\u url.com”
用户名=”name@some_url.com"
key=paramiko.RSAKey.from_private_key_文件(“id_rsa”)
ssh_client=paramiko.SSHClient()
ssh\u client.set\u缺少主机\u密钥\u策略(paramiko.AutoAddPolicy())
ssh_client.connect(主机名=主机,用户名=用户名,pkey=密钥)
path=“”
localpath=“logo.png”
sftp.put(本地路径,路径)
sftp.close()
ssh.close()
错误:

DEBUG:paramiko.transport:starting thread (client mode): 0x257c34f0
DEBUG:paramiko.transport:Local version/idstring: SSH-2.0-paramiko_2.7.2
DEBUG:paramiko.transport:Remote version/idstring: SSH-2.0-OpenSSH_5.3
INFO:paramiko.transport:Connected (version 2.0, client OpenSSH_5.3)
DEBUG:paramiko.transport:kex algos:['diffie-hellman-group-exchange-sha256'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes256-ctr', 'aes192-ctr', 'aes128-ctr'] server encrypt:['aes256-ctr', 'aes192-ctr', 'aes128-ctr'] client mac:['hmac-sha2-512', 'hmac-sha2-256', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com'] server mac:['hmac-sha2-512', 'hmac-sha2-256', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com'] client compress:['none', 'zlib@openssh.com'] server compress:['none', 'zlib@openssh.com'] client lang:[''] server lang:[''] kex follows?False
DEBUG:paramiko.transport:Kex agreed: diffie-hellman-group-exchange-sha256
DEBUG:paramiko.transport:HostKey agreed: ssh-rsa
DEBUG:paramiko.transport:Cipher agreed: aes128-ctr
DEBUG:paramiko.transport:MAC agreed: hmac-sha2-256
DEBUG:paramiko.transport:Compression agreed: none
DEBUG:paramiko.transport:Got server p (2048 bits)
DEBUG:paramiko.transport:kex engine KexGexSHA256 specified hash_algo <built-in function openssl_sha256>
DEBUG:paramiko.transport:Switch to new keys ...
DEBUG:paramiko.transport:Adding ssh-rsa host key for some_url.com: b'ac1d97a309bf1ac35b0e37a857756ea2'
DEBUG:paramiko.transport:Trying SSH key b'abcfc3ec9c0aa1f764272f3eaffabf8c'
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (publickey) failed.
DEBUG:paramiko.transport:Trying SSH agent key b'de44e933d9302990aafa2fb76a128889'
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (publickey) failed.
Traceback (most recent call last):
  File "C:\Users\some_user\Documents\develop\projects\doxygen\common\ssh.py", line 15, in <module>
    ssh_client.connect(hostname=host,username=username,pkey=key)
  File "C:\Users\some_user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\paramiko\client.py", line 435, in connect
    self._auth(
  File "C:\Users\some_user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\paramiko\client.py", line 764, in _auth
    raise saved_exception
  File "C:\Users\some_user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\paramiko\client.py", line 700, in _auth
    self._transport.auth_publickey(username, key)
  File "C:\Users\some_user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\paramiko\transport.py", line 1580, in auth_publickey
    return self.auth_handler.wait_for_response(my_event)
  File "C:\Users\some_user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\paramiko\auth_handler.py", line 250, in wait_for_response
    raise e
paramiko.ssh_exception.AuthenticationException: Authentication failed.
DEBUG:paramiko.transport:EOF in transport thread
现在,我在这里使用的私钥“不”相同。FileZila需要一个.ppk文件,所以我使用Puttygen将我的密钥转换为.ppk格式。我意识到,等等,也许这就是问题所在,但是当我使用.ppk版本运行它时,paramiko抛出了以下错误:

    raise SSHException("not a valid {} private key file".format(tag))
paramiko.ssh_exception.SSHException: not a valid RSA private key file
原始密钥对由Bluehost生成,并从其站点下载。
原始私钥是RSA,paramiko似乎只需要该密钥类型。

所以问题是我使用了错误的用户名,但它仍然抛出了密钥身份验证错误

根据@martin prikryl的请求,我尝试使用PuTTY进行连接,并找到了一个很好的教程,专门使用PuTTY将SSH连接到Bluehost

我首先为FTP编写了一个脚本,它使用了Bluehost FTP帐户,您可以在他们的站点上专门创建该帐户。当我决定编写SSH脚本时,我使用了相同的用户名。唉,但是对于SSH,Bluehost想要的是主登录名的用户名,而不是FTP帐户

但它在某种程度上仍然可以识别用户名,但是密钥没有链接到它,因此密钥身份验证错误

所以我使用PuTTy作为主用户名,效果很好

然后我更新了我的脚本(归功于此stackoverflow)

使用SSH将整个目录上载到bluehost的新脚本:

导入paramiko
导入操作系统
导入系统
def main():
target_dir=“some_dir”
local\u path=“some/local/path”
paramiko.common.logging.basicConfig(级别=paramiko.common.DEBUG)
host=“some\u url.com”
username=“MAIN_username”#位于Bluehost上cPanel的右侧页面
key=paramiko.RSAKey.from_private_key_文件(“id_rsa”,password=“some_passwd”)
传输=paramiko.transport((主机,22))
transport.connect(username=username,pkey=key)
sftp=MySFTPClient.from_传输(传输)
mkdir(target\u dir,ignore\u existing=True)
sftp.put\U dir(本地路径、目标路径)
sftp.close()
类MySFTPClient(paramiko.SFTPClient):
def put_dir(自身、源、目标):
对于os.listdir(源)中的项:
如果os.path.isfile(os.path.join(源,项)):
self.put(os.path.join(源,项),“%s/%s%”(目标,项))
其他:
self.mkdir(“%s/%s%”(目标,项),忽略_existing=True)
self.put_dir(os.path.join(源,项),“%s/%s%”(目标,项))
def mkdir(self,path,mode=511,ignore_existing=False):
尝试:
超级(MySFTPClient,self).mkdir(路径,模式)
除IOError外:
如果忽略现有设备:
通过
其他:
提升
如果名称=“\uuuuu main\uuuuuuuu”:
main()

用户名=”name@some_url.com
我的心理调试能力告诉我,试着用“名字”而不是name@some_url.com“我刚才试过了,同样的错误。当我使用FTP时,用户名应该是@some_url.com,所以我用了同样的方法。好主意。我刚刚编辑了一下。FileZilla在哪里使用了
id\u rsa
密钥?它甚至不使用SFTP!您正在FileZilla中使用FTPS。这是一个完全不同的协议,不使用SSH密钥。因此Filezila给了我使用SSH/SFTP的选项,所以我认为它使用的是SSH协议,是的,它使用的是SSH密钥。那么它为什么要使用FTPS呢?所以基本上,你根本就没有编程问题。您只是使用了错误的凭据。此评论的目的是什么?我在脚本中使用了错误的凭据,这引发了一个错误,通过在论坛上发布,我意识到我使用了错误的凭据,这部分要感谢您的帮助。所以这将是一个编程问题。为什么要贬低我的错误?使用错误的凭据不是编程问题。你的帖子对其他人没有帮助。请把它们删掉。噢,这太卑鄙了。我不说了。干杯
    raise SSHException("not a valid {} private key file".format(tag))
paramiko.ssh_exception.SSHException: not a valid RSA private key file