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

时间:2012-09-08 12:25:42

标签: python ssh fabric

我正在尝试使用Fabric python脚本登录到生产服务器,然后远程运行'ls'命令。好吧,我实际上还有许多其他命令可以运行,但是我开始使用一个简单的列表来实现它。我的生产服务器使用SSH并被锁定,因此需要私钥文件和密码。

现在我一直在阅读一些关于如何使其工作的网站,但由于某种原因无法让它登录。我认为它连接正常,但有消息说:

“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

有关如何使其发挥作用的任何想法?

非常感谢

3 个答案:

答案 0 :(得分: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 :(得分:0)

在我们的服务器再次强化Logjam以实现PCI合规性之后,我们遇到了这个问题。使用https://weakdh.org/sysadmin.html作为参考,我更新了/ etc / ssh / sshd_config以包含该行:

KexAlgorithms curve25519-sha256@libssh.org

从1.15.2开始,paramiko似乎不支持这种椭圆密钥交换算法。 weakdh.org页面说非椭圆group14-sha1 diffie-hellman算法不容易受到Logjam的影响,所以将行改为......

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

...允许我通过SSH进行Fabric部署并保持PCI合规性。

答案 2 :(得分: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")