23

我读过这个这个问题。他们都说 Emacs 可以处理身份验证,但它对我不起作用。

问题是:怎么了?

Emacs 版本是 24.0.97-1,它在 64 位 Linux 上运行。

在工作中,我必须使用代理服务器进行任何 Internet 连接。所以我设置了以下环境变量:

http_proxy="http://username:password@ip:port
https_proxy="https://username:password@ip:port
ftp_proxy="ftp://username:password@ip:port

这行得通。我可以毫无问题地下载软件包。

当我M-x package-refresh-contents在 Emacs 中运行时,它要求我输入代理服务器的登录名和密码,但它无法连接到服务器。它甚至不尝试连接,即在我输入密码并按下EnterEmacs后立即报告: Failed to download 'marmalade' archive

如果我从http_proxy变量中删除用户名和密码或者我url-proxy-services在 Emacs 中设置(即使我取消设置系统变量),也会发生同样的情况。

4

4 回答 4

19

EmacsHOSTPORT使用http_proxy.

我通过以下方式获得授权,无需用户交互:

(setq url-proxy-services
   '(("no_proxy" . "^\\(localhost\\|10.*\\)")
     ("http" . "proxy.com:8080")
     ("https" . "proxy.com:8080")))

(setq url-http-proxy-basic-auth-storage
    (list (list "proxy.com:8080"
                (cons "Input your LDAP UID !"
                      (base64-encode-string "LOGIN:PASSWORD")))))

这适用于 Emacs 24.3。它基于非公共 API 技巧,因此可能无法工作是另一个 Emacs 版本......

用您的身份验证信息替换LOGINPASSWORD...

还有url-http-proxy-digest-auth-storage. 只需使用身份验证数据填写提示并检查 Emacs 使用的 var (通过M-: var RET)...

于 2013-09-09T11:27:54.810 回答
6

看起来 Emacs 在身份验证方面存在一些问题。所以我已经安装了 Squid,现在将它用作外部代理服务器和我所有应用程序之间的中介。Squid 被配置为无需身份验证的代理,并且一切正常。

许多人推荐此解决方案,但没有给出准确的说明。我用/etc/squid/squid.conf另一个为不同目的设计的。可能它包含一些不需要的东西和/或错过了它应该拥有的东西。欢迎任何改进:

# only access from localhost is allowed
acl localhost src 127.0.0.1/32
acl all src all
http_access allow localhost
http_access deny all
icp_access deny all

never_direct allow all

# turn off cache
cache_dir null /tmp
cache deny all

# logs
access_log /var/log/squid/access.log squid

# turn off proxy-headers (no idea what is it :))
via off
forwarded_for off

# describe external proxy server
cache_peer <proxy_ip> parent <proxy_port> 0 no-query default proxy-only login=<my_login>:<my_password>
http_port 10000
acl port10000 myport 10000
cache_peer_access <proxy_ip> allow port10000

这个代理有地址127.0.0.1:10000。在 Emacs 中,我必须执行以下代码:

(setq url-proxy-services '(("http" . "127.0.0.1:10000")))
于 2012-06-14T07:03:32.357 回答
5

这里有两个错误 - 一个在 url-http.el 中,可以用我刚刚发送到http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12069的补丁修复 这将阻止 Emacs每次尝试都会提示您输入密码,当它不提示您时,它应该可以工作。

另一个bug还没有找到,但似乎代理服务器请求认证时,会提示认证,然后代理服务器的认证请求立即被包代码处理。同时,真正的请求在后台继续进行。

于 2012-07-27T17:32:44.017 回答
4

在 emacs < 28.1 中存在另一个相关的错误url-httpurl-https-proxy-connect导致所有通过身份验证代理的 https 调用失败。

请参阅https://debbugs.gnu.org/cgi/bugreport.cgi?bug=42422

作为 emacs < 28.1 的解决方法,使用固定版本覆盖该函数:

(with-eval-after-load 'url-http
  (defun url-https-proxy-connect (connection)
    (setq url-http-after-change-function 'url-https-proxy-after-change-function)
    (process-send-string connection (format (concat "CONNECT %s:%d HTTP/1.1\r\n"
                            "Host: %s\r\n"
                            (let ((proxy-auth (let ((url-basic-auth-storage
                                         'url-http-proxy-basic-auth-storage))
                                    (url-get-authentication url-http-proxy nil 'any nil))))
                              (if proxy-auth (concat "Proxy-Authorization: " proxy-auth "\r\n")))
                            "\r\n")
                        (url-host url-current-object)
                        (or (url-port url-current-object)
                        url-https-default-port)
                        (url-host url-current-object)))))
于 2020-11-06T23:02:37.863 回答