Ruby 做了一个关于换源的小工具

Artoria · November 30, 2016 · Last by Artoria replied at December 02, 2016 · 2823 hits

2016-12-2 更新一个注释

dalao 们说我钦点安全源 gems.ruby-china.org 的力度不够,那么涉及到 rails 有关的可以使用这个 rails new app -m https://raw.githubusercontent.com/RGSS3/rails-new/master/zh-CN/win/app.rb 这个不是 gem 换源,而是在已有 rails 情况下提供source “http://gems.ruby-china.org/”和 devkit 的 url 的硬编码支持

关于有唯一 option 的情况是否要做成钦点而不是靠自动/手动推荐的问题,真正钦点的例子我只见过like Gecko

原贴

新装好的 Ruby 可以直接运行:

ruby -ropen-uri -e"puts open('http://codepad.org/CPe9wJuo/raw.rb', &:read)" | ruby

包括:

  • 检查现在的源是不是有效
  • 如果无效或者指定了强制参数 (环境变量 FORCE_SOURCE 存在),则自动找源,并且验证(一般来说第一个就是 ruby-china 的源)
    • 验证说的是比如 gems.github.com 虽然是个有效的源,会被 gem 添加,但是连 rails 这样的 gem 都没有……
  • 如果找到了源,设为当前源和 bundler 的默认镜像 也就是说可以直接
gem install rails 

rails new app (不打断)  

cd app  

rails s  
  • windows 上也有效

项目的 github: https://github.com/RGSS3/gemsource

顺便卖 https://github.com/RGSS3/doremi

顺便求深圳或远程 Ruby 岗位

我感觉很危险。

#1 楼 @Rei 那那个人一定很会 SEO,毕竟我的动态源表其实是:

u = get("http://www.baidu.com/s?wd=ruby%20%E5%9B%BD%E5%86%85%E6%BA%90")

hhhhh

看了下楼主的文件,打开一看源码,我吓尿了……

听说过“百度一下,你就上当”吗?由于很多人针对百度做垃圾站木马站排名。

楼主这段代码直接从百度取搜索结果,强行替换用户的 gem 源,不出 1 个月,就会有木马站来做排名,木马进入所有用这段代码换源的开发者电脑中,到时候再经过 Rails 项目发布,感染到更多网站。。。。

RubyGems 源的问题,早已被解决了。

  1. 云梯,直接连官方 RubyGems 源,安全干净,且没有 gem 不同步的问题。云梯香港 2 号平时下载有 60M 左右,秒下 gems。
  2. 用 RubyChina 维护的RubyGems 镜像,国内很快,偶尔有不同步,但一会儿就好。

#3 楼 @marksloan 楼主我读书不多,当然认可层主这一楼的方法。层主的担忧不无道理,但是也并不见得有这么大的风险。毕竟层主的描述是有具体上下文的,而我这个脚本的写作也是有具体上下文的,并且两者并不太一样。

不过既然层主是谈解决方案,这里谈一下这个脚本作为微型产品的合理性的角度,并非一定要争论什么的,而且真的出现了此类攻击,甚至可以作为 rails 或相关 gems 的安全性的一个技术研究蜜罐,见详述 :

  • 用户群的角度 (谁会用这个脚本):

    • 已有 gems.ruby-china.org 或者其他长期固定源的用户自然不需要用。
    • 经常不在一个地方或移动式开发,或
    • 演示给新手或需要快速展开的环境,出来什么网站是可见的,并且不需要临时购买或者注册翻墙工具的情况,(甚至层主还给了推荐码)。
      • 对于其他人,当然可以直接换成 gem sources -r https://rubygems.org/ -a http[s]://gems.ruby-china.org/
      • 对于新手,应当说两句话,https://rubygems.org/ 是最权威的源,http[s]://gems.ruby-china.org/ 是在天朝最应当首选考虑的镜像,这么说不致于造成误导和混淆。
  • 开源自动化的角度

    • you can fork it as your own tool
    • 这脚本是从人搜索 Ruby 源的方式和角度出发的。(即用户未知 gems.ruby-china.org )
      • 如果木马站针对这个我今天至少就维护了三次代码逻辑 (对应也换了三个 codepad.org 路径) 的地址进行欺骗
      • 甚至不出一个月排名就挤下去了 ruby-china.org
      • 手动百度源的用户一样中招 hhh
      • 强行替换和只从百度取属于体验问题而并非绑架问题,-ropen-uri -e 本来就是 geek 角度,从 geek 角度到 UX 角度本来就有一个过程。
  • RubyGems 源的角度(源的问题,不能算是完全解决)

  • 被木马站针对的问题的对应以及攻击的角度

    • 常用的 curl -sSL https://get.rvm.io | bash
      • 如有欺骗攻击,与我这里是同类的,虽然是个 ssl,能到层主说的威胁程度,那也扛不住证书欺骗和 DNS 污染。
      • rvm.io 也要求用户首先用 gpg 校验,而存在一些人和教程也没进行校验步骤。
      • 如果出现了层主所说的攻击,如果只给一个月时间,似乎更应该走 rvm 的路线更加广泛。
      • 至少也是 http://gems.ruby-china.org/ 的 DNS 污染更加方便
    • 木马具体逻辑放置的位置及工程的角度:
      • 一般不会是 gem 中
      • 因为部署时就该用正式的方法去 bundle install 一套,gem 中如有奇怪的逻辑也带不到对面(但生成的除外,下述)
      • 可能是生成器等生成的代码中
        • 开发者可能会直接修改的,如 controller 和一些启动配置等。如果是层主那种高要求的担忧,是逃不过 Code Review 的
          • 当然也有安全级别高但是不进行 Code Review 的情况,这个问题出在人员。
        • 开发者不直接改的,可以追溯到 bundle install 中,同前一节。
      • 层主和我都能想到奇怪的攻击方法,还能绕开这个部分的 1,2 节,但没有进行攻击,从经常使用 Ruby 进行开发和维护的开发者数量来看,孤陋寡闻的我暂且认为绕开并且攻击而且大面积扩散是大牛闲闹着玩……
        • 真的出现了此类攻击
        • 并且绕开了新手用户群和工程代码质量管理
        • 那其实有把用这个脚本的工程作为蜜罐探讨 rails 或有关的 gems 中植入木马的技术问题的必要性了,也不只是这一个脚本的个例了。

#4 楼 @Artoria 哎,说这么多,不知道你在说什么

你搞这个东西还是在于你自身的问题:

  • 国内镜像据我了解的情况除了 https://gems.ruby-china.org 这个,其他的可用性是打问号的。所以你不要浪费时间搞什么切换了,没有意义的,你只有两条路,要么用 Ruby China 这个,要么翻墙用官方的。
  • 为何你不能用 Linux 或 macOS 环境开发?Ruby 以及 Rails 的各类生态圈本身就对 Windows 支持不好。
  • 怎么可能用百度搜索这种方式,你搞了 Mirror List 手工维护也比百度搜索这种方法靠谱啊!

所以,你还是安安心心换一种环境,不要在错误的道路上一条路走到死,还为了错误的路搞一些无用的解决方案。

#4 楼 @Artoria 已有 gems.ruby-china.org 或者其他长期固定源的用户自然不需要用。那么为什么不推荐别人直接用这些源 而是使用你这个脚本呢。

#5 楼 @huacnlee 我长期在 windows 下维护,mirror list 也是另一种方式(见 repo),但我也希望发现更多的源,而且曾经连不上 ruby-china 用了备选 sdutlinux 一段时间,速度还是可以的。

  • 我说这么多就在于表明,即便只有两条路(甚至可能只有一条),也还是可以做一个泛化的工具,因为 pragmatic way。而且是 Ruby 解决 Ruby 的问题,不是某 shell 解决 ruby 的环境问题。

  • 为何不能换环境的问题,可能我对环境的依存不是那么大吧,而且 ruby 系列对 windows 的支持是越来越好了,至少我现在接触到的问题里面,只有 rubinius 是官方明确表明不支持 windows,而且我也尝试了一周还是移植失败了的。至于其他的问题…… 不过我的路线可能比较非主流,11 年开始玩 RPGMaker,RPGMaker 的 Ruby 不能 require 二进制插件的问题(比如 socket.so),以及无法使用 Fiddle 作为 windows 回调函数的问题,到现在也找到了 Ruby way 的解决方法。而且我现在主要的方向是 Ruby 生成,Ruby 的 runtime 和生成代码的 runtime 可以不在一个环境,所以对环境的依赖真心不大。

#6 楼 @hging 见我的解释的第一节

#4 楼 @Artoria 你说了这么多,并没有解决大家说的你的脚本的安全问题。

  • 能翻的人,肯定用 RubyGems 官方源。
  • 不能翻的人(咦,为什么还有不能翻的?),肯定用 Ruby-China 的源(还有更好的替代吗?)

你的脚本自动从百度随便找个源,太危险了!

三四个长篇回复下来连别人在关心啥都没搞清楚,哎...

此外:

  • 知道 Ruby China 镜像的不需要用(你承认的)
  • 经常不在一个地方开发,只要不出国,首选 Ruby China 镜像
  • 演示给新手或是什么别的目的,不想特别翻一下墙,那直接使用 Ruby China 镜像就好了
  • 跟新手解释镜像和源的概念不是这脚本要解决的
  • 既然假设用户不知道 Ruby China 镜像,那更不会知道你的脚本,用户真不知道 Ruby China 镜像,直接告诉他 Ruby China 镜像就好了
  • 安全是最重要的问题,任何时候都必须选择受信任的源或者镜像
  • 你 geek 不 geek 跟开源跟自动化没关系,没人关心这个

Ruby China 镜像是国内最首选考虑的镜像(你承认的),那直接介绍和使用 Ruby China 镜像就已经解决问题了,遇到访问不畅的情况,及时提交 issue。

对于环境问题,Ruby 在 Windows 环境的生态就是不好:

  • Ruby 官方不提供 Windows 的构建版本,官方推荐的 Ruby Installer 不能及时跟进 Ruby 最新版本
  • Rails 的生态就是在 Windows 环境极差,即使能进行开发,在部署到 *nix 环境时候也有潜在遇到问题
  • 你承认你的路线非主流,这本身就不是什么值得拿出来说的事情,没人关心你的故事
  • 非主流对环境依赖不大,跟主流没有关系

所以,你还是安安心心换一种环境,不要在错误的道路上一条路走到死,还为了错误的路搞一些无用的解决方案。

#9 楼 @kgen

大家关心的安全问题

  • 自动找个源居然不是 ruby-china.org 第一这才是最危险的。

为何不直接写呢

  • 有两个 option 这是公认了的,即便只有一个 option 直接写会给人一种钦点的感觉不够灵活,写程序总要在解决现在问题基础上泛化一下解决几个未来可能的问题。
  • 未来可能的问题是什么呢?
    • ruby-china 的 url 被挤下去了
    • 临时局部地区的不可访问

我这个脚本并不是一定要钦点本论坛的源或者黑它的立场。你知道我为了跟进这个结果换了多少个百度关键词吗
如果想要完全钦点的你可以rails new app -m https://raw.githubusercontent.com/RGSS3/rails-new/master/zh-CN/win/app.rb

#10 楼 @jasl 说两个事, 第一,

既然假设用户不知道 Ruby China 镜像,那更不会知道你的脚本,用户真不知道 Ruby China 镜像,直接告诉他 Ruby China 镜像就好了

用户不知道 RC 镜像但有可能知道我的脚本,事实上我是 QQ 群党,之前论坛上来得不多,也同样很多不来论坛的人士。这是论坛的普及问题,如果普及力度不够再怎么样也只会有种钦点的感觉。

第二,

安全是最重要的问题,任何时候都必须选择受信任的源或者镜像

用户真不知道 RC,也以跑起来为第一要务的情况,是不能光说安全的。 给你讲个真实的故事,有个人在 rails 群找源,当时还是 ruby.taobao.org 的时代,然后其他人随口说了句淘宝源。然后他去淘宝上面逛了一下午没看到卖源的,接着他就从http://rubygems.org 手动下载* .gem 然后本地安装,然后这些 gem 又有依赖 gem 吧,然后人就继续手动解决依赖关系,反正最后也就陆续装上了几个 gem,也没有解决他的主要问题。

虽然当时现场是当笑话看的,这也可能是个个例,我想说的只是,光说淘宝源或者 ruby-china 源,知道的还是知道,不知道的还是不知道。安全问题当然重要,但人家要求的是 availability 的时候强调 security 是毫无意义的。

第三

对于环境问题,Ruby 在 Windows 环境的生态就是不好:
Ruby 官方不提供 Windows 的构建版本,官方推荐的 Ruby Installer 不能及时跟进 Ruby 最新版本

https://github.com/ruby/ruby/blob/trunk/win32/configure.bat
请解释用这个成功跟进到 HEAD,而且其依赖工具链可以只用 winsdk.exe 安装的理由。
可以理解你把[*-mingw32]当做 win 上全部 ruby 构建的理由,毕竟[*-mswin32]的 case 是另一个折腾方向。

且 gem instaill rails 现在可以直接在 windows 装。

第四 我所谓的非主流只是自嘲而并不是什么把柄,你所谓的主流不要给人一种钦点的感觉,世界上都在打破和融合原来的界限,比如 rubyinstaller 从无到有, rails 现在无障碍在 windows 下gem install,而我们还在拒绝给 windows 用户技术支持,是想等彻底成熟了直接拿来别人的成果吗。

@ #10 楼 @jasl

Ruby China 镜像是国内最首选考虑的镜像(你承认的),那直接介绍和使用 Ruby China 镜像就已经解决问题了,遇到访问不畅的情况,及时提交 issue。

前一句我承认,后一句我只能说我一般不提交也不建议优先 issue,一般提交 pr,这样对于当时发生问题的个例解决问题的时间进度比较有利。

#12 楼 @Artoria

  • 首先,用户知不知道你的脚本跟用户知不知道 RC 源没有关系,跟你是不是 QQ 党也没有直接关系。其次,作为国内唯一可信赖的镜像,就是要钦点。
  • 我们一直在想办法让更多 Ruby 开发者加入 Ruby China,起码你认识我,知道我在 QQ 群做过什么。我们也通过 RubyConf China,促进各地区的聚会去集中中国的 Ruby 开发者,论坛里也有很多人用自己的方法传播 Ruby,各种培训、RailsGirls、参加其他技术交流活动、公司内部分享等等。普及力度不够,那就再大力点,尽力而为。社区也在利用自身影响力去造福所有 Ruby 的使用者以及提供各种服务。
  • 不知道的,就让他知道,既然都知道他不知道了,那告诉他有 RC 源或者直接告诉他如何配置以使用 RC 源就行了,这就解决了可用性(同时兼顾了安全)。没有人愿意完整解决他问题的,导致他出丑或是没有达成目的,这个没有办法(其实,甩给他 Ruby China 的 Wiki 能解决一部分问题)。另一方面,你给他一个脚本,跟直接告诉他如何使用 RC 源,成本一样
  • 我没有必要解释 Ruby 源码里的东西,ruby-lang.org 的 download 里写清楚了 On Windows machines, you can use RubyInstaller. 这是官方的推荐,并且对比 RubyInstaller 对各个 build 的发布时间,明显没有紧跟步伐,至今 2.3.3 的包还没有提供
  • 主流就是 Ruby(尤其是 Rails)在 Windows 上有很大问题,这是事实,确实应该帮助在 Win 上更好的运行,但是你路子错了,唯一的办法就是帮助改进严重依赖 POSIX 环境 的 gems 还有 Ruby 本身,这是在 Windows 环境下各种问题的本质。gem install 本身并没有什么问题现在
  • PR 解决不了问题,简单地说,这不是代码层面的问题,实际上构建一个 Ruby Gems 镜像,Bundler 官方已经给出开箱即用方案了,难度为 0,世界上几乎所有镜像站点都是这样构建的(比如清华 TUNA 的源,RC 源虽不是标准方案,但运营一年技术上已经足够稳定,为啥不用标准方案,原因很简单,穷),更大的问题是镜像服务器的部署、国内复杂的网络问题,还有钱,RC 源能成为最靠谱、最权威,恰恰是这三点相对最有保障,还有最重要的一点,信誉。

#14 楼 @jasl 其实这样的回答我是认可的,而且我基本上是暗自钦点 rc 源了(见#11 我的解释)。但是作为脚本,并且我的标题是换源工具 (中立向) 而不是换 RC 源的工具 (特化向), 毕竟我和楼上的 dalao 不一样,并没有 ruby-china 的钦点的立场。

作为换 RC 源的情况可以做另一个工具或者加选项,那又是另一件事了,起码我不能用一个中立的 repo,明显做钦点的事情吧。其他的回答里面提到的 information security(vulnerability) 的问题,跟这个工具在意的 information safety(availability) 的问题还是有点不同的。

You need to Sign in before reply, if you don't have an account, please Sign up first.