如何在代理(ISA-NTLM)后更新Ruby Gems

239

我身处的防火墙正在以 NTLM-only 模式运行 Microsoft ISA 服务器。是否有人成功通过 Ruby SSPI gem 或其他方法安装/更新他们的 Ruby gems?

...还是我只是懒惰?

注意:rubysspi-1.2.4 不起作用。

这也适用于 IronRuby 项目中的 "igem"。


我已经让rubysspi工作了,但需要进行很多调整。如果你想从Git Bash shell中使用它,你需要在你的.bashrc文件中添加一个别名,例如:alias gem='ruby -rspa \which gem`'`。 - iconoclast
1
如果在执行大多数答案中的步骤后出现代理问题,请尝试确保sudo可以访问您的环境变量,方法是添加-E开关,例如:sudo -E doSomething - kayleeFrye_onDeck
20个回答

229

针对 Windows 操作系统,我使用了 Fiddler 解决了这个问题。

  1. 从 www.fiddler2.com 安装/运行 Fiddler。
  2. 运行 gem:

    $ gem install --http-proxy http://localhost:8888 $gem_name
    

3
非常好用,比起 ntlmaps 和 cntlm 要简单得多。 - atomicules
36
这对我很有用。请注意,并非所有情况都需要使用Fiddler。对我来说,只需使用“gem install --http-proxy http://COMPANY.PROXY.ADDRESS $gem_name”即可。 - Polaris878
在Windows 7上,--http-proxy标志必须放在gem名称之后,例如gem install <gemaname> --http-proxy http://yourproxy.address;port。否则,它会抱怨无效的命令行开关。 - Alek Davis
适用于Windows 10。 - ggiunta
这是我在公司代理后面使用的方法,无需使用Fiddler。例如,要安装jekyll gem,只需运行以下命令:sudo gem install jekyll --http-proxy=http://web-proxy.company.com:8080 - Joseph

218

我没能够通过命令行开关来让我的程序工作,但我已经能够通过设置HTTP_PROXY环境变量来实现。(注意大小写似乎很重要)。我有一个批处理文件,在其中添加了以下代码:

SET HTTP_PROXY=http://%USER%:%PASSWORD%@%SERVER%:%PORT%

显然,在我到达这一行之前,我已经设置了这四个引用变量。例如,如果我的用户名是"wolfbyte",我的密码是"secret",我的代理称为"pigsy",并在端口8080上运行:

SET HTTP_PROXY=http://wolfbyte:secret@pigsy:8080

由于该方法会以明文形式在计算机的会话中存储您的密码,因此您可能需要小心管理。但我认为这不应该成为太大的问题。


6
似乎 'gem' 无法识别代理字符串中的反斜杠,无论是通过 http_proxy 环境变量还是 --http-proxy 参数。例如,从我的 Ubuntu 机器上执行 --http-proxy http://domain\\userid@server:port 会给我报错 "invalid argument: --http-proxy ...";幸运的是,我的代理服务器不需要域名规范,并且 gem 在没有该规范时也能正常工作。 - spoulson
ISA允许管理员指定一个默认域进行身份验证。你可以尝试省略域名,只使用用户名,就像spoulson建议的那样。如果你的ISA管理员已经指定了该默认域,并且你的用户账户就在这个域中,那么这对你来说应该是可行的(假设防火墙上没有阻止规则)。 - squillman
11
如果需要域名,您需要对反斜杠进行URI编码,例如:http://domain%5Cuserid@server:port。请注意不要改变原文意思,尽可能使翻译简明易懂。 - Ian G
13
在Windows中,你可以将"set http_proxy"行添加到gem.bat文件中,这样你就不必每次都记得设置代理了。 - Ed Manet
1
顺便提一下,如果您的密码包含特殊符号,您应该对它们进行urlencode编码。例如,将@替换为%40等。 - Andrey Regentov
显示剩余2条评论

130

这个方法完全有效:

gem install --http-proxy http://COMPANY.PROXY.ADDRESS $gem_name

15
这是最新的答案,也适用于Windows操作系统。不过我需要添加我的用户名和密码:gem install --http-proxy http://[user]:[password]@[server]:[port]。 - egerardus
我无法安装jekyll,一直出现SSL_connect SYSCALL returned=5 errno=0 state=unknown state (https://rubygems.global.ssl.fastly.net/quick/Marshal.4.8/jekyll-3.0.0.gemspec.rz)。使用gem install --http-proxy http://127.0.0.1:8580 jekyll对我有效。 - Majid Fouladpour
2
我在我的bash配置文件中添加了一个别名:alias geminstall='gem install --http-proxy ${http_proxy}',以使我的生活更轻松。 - bgStack15

48

2
这是所有尝试中最不痛苦的方式。在Ubuntu/Debian上,我使用apt-get install cntlm,编辑配置文件,然后导出http_proxy="http://localhost:3128"。可行! - Konrads
在Windows上也完美运行。谢谢! - Subrat Pattnaik

39

我尝试了一些解决方案但都没有成功。最终我找到了一个能够对我有效的解决方案:

gem install -p http://proxy_ip:proxy_port rails

使用-p参数来传递代理。我正在使用Gem版本1.9.1。


1
通过将代理部分替换为http://username:password@proxy_ip:proxyport,成功完成了安装。 - Gary Tsui
我不得不添加用于https连接的proxy_ip才能使其正常工作!太棒了 :D (gem版本2.0.14) - madlymad

21
在/etc/gemrc或~/.gemrc或例如使用chef gem在/opt/chef/embedded/etc/gemrc中创建一个.gemrc文件,其中包含:
http_proxy: http://proxy:3128

然后您可以像平常一样使用 gem install 进行安装。


如果使用 --http-proxy 可以工作,但是使用 .gemrc 文件无法工作,可能是由于 sudo 配置引起的。我不得不检查 /etc/sudoers 文件并添加以下内容: Defaults env_keep = "http_proxy ftp_proxy" 在:Defaults env_reset 之前。 - DependencyHell

16

这个完美地解决了我的问题:

gem install -p http://proxy_ip:proxy_port compass

您可能需要添加您的用户名和密码:

gem install -p http://[username]:[password]@proxy_ip:proxy_port compass

11
如果您在代理身份验证时遇到问题,请确保按照以下格式设置环境变量:
set HTTP_PROXY=some.proxy.com
set HTTP_PROXY_USER=user
set HTTP_PROXY_PASS=password
< p > user:password@ 语法似乎不起作用,而且在 Stack Overflow 和各种论坛帖子中也有一些命名不当的环境变量。

另外,请注意,gem 的下载可能需要一段时间才能开始。 起初我以为它不起作用了,但耐心等待后,它们开始按预期下载。


采用Benjamin Wootton的建议,在我连接到公司局域网的Windows 7笔记本电脑上运行得非常好。在DOS提示符下的命令行窗口中,我将HTTP_PROXY设置为http:// localhost:8888(忽略空格),然后分别使用我的LAN用户名和密码作为HTTP_PROXY_USER和HTTP_PROXY_PASS。 - raycarr

10

快速答案:在安装/更新中添加参数的代理配置

gem install --http-proxy http://host:port/ package_name

gem update --http-proxy http://host:port/ package_name

5
在给已有回答的老问题添加新回答时,解释你的回答具有哪些新信息是很有用的。 - Jason Aller
直接指定命令而无需详细阅读所有细节(快速答案)。 - Shantonu
而且,设置环境变量并不是每个人的选择(当您只需要进行一次更新时)。 - Shantonu
请将所有解释添加到答案本身,而不是评论部分。 - Nico Haase
不用担心,这个答案正是我在寻找的准确信息,谢谢。 - doublespaces

8
我尝试了上述所有解决方案,但都没有奏效。如果您使用的是Linux/MacOS系统,我强烈建议您在SSH隧道上使用tsocks。为了使此设置工作,您需要一台可以通过SSH登录的机器,以及安装了一个名为tsocks的程序。
这里的想法是通过SSH创建一个动态隧道(一个socks5代理)。然后我们配置tsocks使用此隧道并启动我们的应用程序,在本例中:
tsocks gem install ...

或者考虑针对Rails 3.0:

tsocks bundle install

更详细的指南可以在以下网址找到:

http://blog.byscripts.info/2011/04/bypass-a-proxy-with-ssh-tunnel-and-tsocks-under-ubuntu/

尽管该程序是为Ubuntu编写的,但该过程适用于所有基于Unix的机器。Windows的tsocks替代品是FreeCap (http://www.freecap.ru/eng/)。Windows上一个可行的SSH客户端被称为putty。


我在我的备份中找到了这篇文章,并使用相同的URL重新发布了它。 - Byscripts
1
URL仍然不可用。当提供一个非Stack Exchange网站的链接时,请在此处总结其要点并给予该网站信用。这样,当链接中断时,重要部分仍然存在于此处。 - the Tin Man

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