Использовать ELPA (Emacs) за прокси-сервером, требующим аутентификации
Я прочитал этот и этот вопрос. В обоих они говорят, что Emacs может иметь дело с аутентификацией, но это не работает для меня.
Вопрос: что не так?
Версия Emacs - 24.0.97-1, и она работает в 64-разрядной версии Linux.
На работе я должен использовать прокси-сервер для любого интернет-соединения. Поэтому я устанавливаю следующие переменные среды:
http_proxy="http://username:[email protected]:port
https_proxy="https://username:[email protected]:port
ftp_proxy="ftp://username:[email protected]:port
Это работает. Я могу без проблем загружать пакеты.
Когда я запускаю M-x package-refresh-contents
в Emacs, он запрашивает у меня логин и пароль для прокси-сервера, но он не может подключиться к серверу. Он даже не пытается подключиться, т.е. После ввода пароля и нажатия Enter
Emacs мгновенно отчетов:
Failed to download 'marmalade' archive
То же самое происходит, если я удалю имя пользователя и пароль из переменной http_proxy
или если я установил url-proxy-services
в Emacs (даже если я отключу системную переменную).
Ответы
Ответ 1
Emacs использует только HOST
и PORT
часть из 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...
Замените LOGIN
и PASSWORD
на вашу информацию об авторе...
Также есть url-http-proxy-digest-auth-storage
. Просто введите приглашение с данными аутентификации и проверьте, какой var используется Emacs (M-:
var RET
)...
Ответ 2
Похоже, что у 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")))
Ответ 3
Здесь есть две ошибки: одна находится в url-http.el и может быть исправлена с исправлением, которое я только что отправил на http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12069
Это заставит Emacs запрашивать пароль для каждой попытки, и когда он не запрашивает вас, он должен работать.
Другая ошибка еще не была отслежена, но кажется, что когда прокси-сервер запрашивает аутентификацию, запрашивается аутентификация, а затем запрос аутентификации с прокси-сервера обрабатывается кодом пакета. Между тем реальный запрос продолжается в фоновом режиме.