Python请求'权限被拒绝'但与sudo合作

时间:2017-09-05 21:52:27

标签: python linux ubuntu ssl python-requests

我正在使用Python Requests库连接到REST服务器,使用.pem证书来验证我是谁建立连接,这样我就可以开始收集数据,解析它等等。当我通过Eclipse或者运行我的程序时终端,我收到此错误:

['library_dirs'] = '/usr/local/lib'

但是,如果我以' sudo' - 请求库按预期工作,我能够检索数据。不幸的是,以' sudo'有副作用,默认的Python解释器是根解释器,它是Python2。但是,Anaconda需要很多库依赖项。

对于上下文,这是我用来建立连接的函数:

[('system library', 'fopen', 'Permission denied'), ('BIO routines', 'FILE_CTRL', 'system lib'), ('SSL routines', 'SSL_CTX_use_certificate_file', 'system lib')]

TLDR;使用' python rest_connector.py'呈现错误。以sudo的方式运行该命令。

证书的上下文:.pem cert权限设置为600(rw -------)。

为了尝试解决我作为sudo运行的问题,我已经启动了一个终端并运行了“sudo -Es'它将终端设置为以root身份运行并使用Anaconda作为我的默认解释器,但我最终会出现握手错误:

PEM_FILE = os.path.expanduser("path/to/pem/file.pem")   #Path is to a folder in root level
    def set_up_connection(self):

    #URL's to request a connection with
    rest_auth = 'https://www.restwebsite.com/get/data'

    ip_address = self.get_ip_address()

    body = json.dumps({'userid':'user', 'password':'pass', 'ip_address':ip_address})

    try:
        resp = self.session.post(rest_auth, data=body, cert=PEM_FILE, verify=False)
        values = resp.json()
        token = values['token']

    except Exception as e:
        print(e)
        token = None

    return token, ip_address

如果有人可以帮我解决这个问题,那将是一个很好的临时解决方案,但我仍然需要能够在没有sudo的情况下运行它。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

用户名需要能够读取文件。您可以通过运行ls path_to_file.pem进行验证。

如果您更改了文件的所有权,则可能仍然缺少包含该文件的目录的可执行权限。

您可以使用chmod -R +x ~/path/to_directory_containing_perm

进行修复

答案 1 :(得分:0)

好的,所以我设法解决了这个问题,我会发布我所做的事情,以防其他人因此遇到类似问题而遇到此问题。

对certs和pem文件设置权限为600,所有权设置为root,并执行openssl哈希函数,唯一的问题是证书放在子目录中。

当我将证书放入'etc / pki / tls / certs'时,它们实际上属于'etc / ssl / certs'。 .pem文件也是如此,除了.pem将放在受限制的文件夹中,'private'。将文件移动到正确的文件夹后。然后我能够将请求的验证参数设置为cert_path,并且所有工作都像我需要的那样工作。

resp = self.session.post(rest_auth, data=body, cert=PEM_FILE, verify=cert_path)

'etc / pki / tls / certs'是Fedora Linux发行版的目录。 'etc / ssl / certs'是Ubuntu Linux发行版的目录。

我希望这有助于某人。