使用Fabric和SSH密钥文件无法连接到远程服务器

4
我正在尝试使用Fabric Python脚本登录到生产服务器,然后在远程运行"ls"命令。实际上,我有很多其他要运行的命令,但是我先从一个简单的列表开始使其工作。我的生产服务器使用SSH并且被锁定,因此需要私钥文件和密码。
现在我已经阅读了一些关于如何让它正常工作的站点,但无法登录。我认为它连接得很好,但会出现以下消息:
Login password for 'root':
所以我输入我的密码(与env.password中的密码相同),但它仍然一直弹出该消息。
这是我的fabfile.py:
from fabric.api import *

env.use_ssh_config = True
env.hosts = ["myserver.net"]
env.user = "root"
env.key_filename = "/home/myusername/.ssh/id_rsa.ppk"
env.password = "mypassword"
env.port = 22

def testlive():
  run("ls")

这是我在/home/myusername/.ssh/config文件中的SSH配置:

Host myserver
  hostname myserver.net
  port 22
  IdentityFile ~/.ssh/id_rsa.ppk

有关如何让此项工作的任何想法吗?
非常感谢。

2
如果您尝试使用该密码作为root通过SSH登录,您能够成功登录吗? - favoretti
1
正如favoretti所说,加上-vvv以获取调试信息。同时,首先尝试通过终端进行基于密钥的操作。 - Jasper van den Bosch
从命令行单独测试SSH非常有帮助,感谢@favoretti和Jasper。 - zuallauz
3个回答

8
我先在命令行中单独测试SSH配置,以确保该部分可以正常工作。我认为SSH密钥存在问题,因为我使用PuTTY生成的密钥格式可能与Linux使用的OpenSSH密钥格式不兼容。

所以我首先在我的Linux机器上制作了新的SSH密钥,并为私钥设置了一个没有密码的选项,这为我生成了两个文件:id_rsa和id_rsa.pub。然后我将id_rsa.pub中的公钥字符串复制到生产服务器上的authorized_keys文件中。接着我从命令行进行了测试。一旦它能够正常运行,我便开始使用Fabric进行测试。

因此,设置已更改为:

from fabric.api import *

env.use_ssh_config = True
env.hosts = ["myserver"]
env.user = "root"
env.key_filename = "/home/myusername/.ssh/id_rsa"
env.password = ""
env.port = 22

def testlive():
  run("ls")

以下是我在/home/myusername/.ssh/config中的SSH配置:

Host myserver
  hostname myserver.net
  port 22
  IdentityFile ~/.ssh/id_rsa

现在,当我从命令行运行fab testlive时,一切正常。

1
如果在fabfile中设置了主机、用户名和标识文件,同时将env.use_ssh_config = False,则~/.ssh/config中的详细信息是多余的(用于fabric)。 - Ville

0
这个问题在我们加强服务器以符合PCI合规性的Logjam之后出现了。参考https://weakdh.org/sysadmin.html,我已经更新了我们的/etc/ssh/sshd_config文件,包括以下行:
KexAlgorithms curve25519-sha256@libssh.org

截至1.15.2,paramiko似乎不支持此椭圆密钥交换算法。weakdh.org页面表示非椭圆group14-sha1Diffie-Hellman算法不容易受到Logjam的攻击,因此将该行更改为...

KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group14-sha1

...让我能够通过SSH进行Fabric部署,同时保持PCI合规性。


0
解决方案: ssh-add ~/.ssh/aws_instance.pem 文件名: fabfile.py
从命令提示符中运行: 首先添加密钥,然后运行fab脚本
1] ssh-add ~/.ssh/aws_instance.pem
2] fab check_status
from fabric.api import run, env

env.hosts = ['myserver_name.in']
env.user = 'ubuntu'

def check_status():
    """
    Will show status for nginx service
    """
    run ("systemctl status nginx.service")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接