郑泽鑫的博客https://zhengzexin.com/一个生信工作者的独立博客http://www.rssboard.org/rss-specificationpython-feedgenhttps://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/logo.png郑泽鑫的博客https://zhengzexin.com/zh-CNThu, 21 May 2020 06:28:40 +0806Thu, 21 May 2020 06:28:40 +08062018 年终总结https://zhengzexin.com/archives/Summary_of_2018/<p>12月27日 养了5年的垂耳兔“拾三”走了</p> <p>12月29日 从工作了2年多的公司离职</p> <p>说是2018年总结,但是由于年底还在忙着离职交接,因此并没有赶在19年前完成,最近去了一趟旅游回来,终于有时间好好总结一下。</p> <p>2018年,对于我来说,是不一样的一年。由于生活的关系,慢慢地变得成熟,会去思考以后两个人的生活,慢慢地会觉得工作2年以来,自己似乎为了放弃了很多,或者说渐渐地懈怠,不再为以前的目标而努力,只是安逸于每天下班后刷刷剧,然后便休息了。</p> <p>有时会翻回博客,或者以前自己设定的一些目标,才发现好多都时过境迁,有些目标如今可能已经不再适合,有些目标却还是没有实现,不免心中有些沮丧,同时对突破自我的渴望又强烈了一些。</p> <h2>工作</h2> <blockquote> <p><del>孩子,我要求你读书用功,不是因为我要你跟别人比成绩,而是因为,我希望你将来会拥有选择的权利,</del>选择有意义、有时间的工作,而不是被迫谋生。当你的工作在你心中有意义,你就有成就感。当你的工作给你时间,不剥夺你的生活,你就有尊严。成就感和尊严,能给你快乐。</p> <p>——《亲爱的安德烈》</p> </blockquote> <p>我认为从事二代测序、医疗器械行业的同行,都应该抽空阅读一下这篇关于《滴血成金》的推送,<a href="https://zhuanlan.zhihu.com/p/52888244">深度:女版 “乔布斯” 覆灭记!硅谷美女 CEO 被曝百亿美元大骗局 | 远读重洋</a>。里面有很多细节,都可以引以为鉴。</p> <h2>消费</h2> <p>2018年的消费,除了一些依旧的订阅服务,还多了一些家庭感觉的物件。</p> <ul> <li>买了任天堂Switch,和女友一起玩马车8、分手厨房1、2</li> <li>入手飞利浦吸尘器(因为猫)</li> <li>富士拍立得 Mini9,居家、旅游都能拍上一张,立马就能看到相片,给生活带来惊喜</li> </ul> <p><figure style="flex: 81.33802816901408" ><img width="1848" height="1136" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/7dc56053ff1c118f15438657d7475aa5.png" /><figcaption>图1. Bobby 的订阅统计!</figcaption></figure></p> <p>订阅服务方面,2018年网络阅读的习惯逐渐从 RSS 订阅转向微信公众号,而书本则是实体书和电子书并存;另外今年入了京东 Plus 会员以及 setapp 家庭计划。</p> <h2>输出</h2> <p>今年博客只更新了2篇文章,其实相当于也是没有更新,即便如此,博客还是不断有新访客;相较于17年,其实内心是知道现状的,也想要去做。</p> <p>![图2. Google Analytics 的统计](./assets/2019-02-08-下载 -7-.png)</p> <h2>生活</h2> <p>12月27日时,拾三突然离去了,很后悔平时没有好好照顾兔子,平时生活得最近的家人,其实也经常忽略。送去宠物医院时,医生也说,要是前两天送来检查就好,但是也没有征兆,无法预料到情况会如此严重。希望它能在兔星球幸福生活。</p> <p><figure style="flex: 100.0" ><img width="8064" height="4032" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/8d03b0937c1ea69a089a41218b145ddb.png" /><figcaption>图3. 8月份时给兔子拍的照片</figcaption></figure></p> <p>今年3月份,和女友一起领养了一只小奶牛猫,是个女生,给它取名“小脑斧”。这个家伙是个拖把精,整天把自己搞得脏兮兮;到处乱窜,我工作时经常躺倒在我电脑上,让人哭笑不得。</p> <div class="photos"> <figure style="flex: 37.5" ><img width="1080" height="1440" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/9cbd301706b9964998dd9b039f9c5aec.jpg" /><figcaption>图4. 小家伙刚来的时候,和兔子的合影</figcaption></figure> <figure style="flex: 88.88888888888889" ><img width="1920" height="1080" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/e1296809f6c16bfd57ce309189709986.jpg" /><figcaption>图5. 霸占我的电脑,不让我工作</figcaption></figure> </div><h2>2019</h2> <p>再多一点输出,勤更新博客;对感兴趣的事物,付出努力去学习。</p> <p>祝大家2019心想事成。</p> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/Summary_of_2018/Sat, 12 Jan 2019 16:59:00 +0806macOS Case Sensitive to Case Insensitive(使用 Carbon Copy Cloner)https://zhengzexin.com/archives/macOS_Case_Sensitive_to_Case_Insensitive/<p>最近,入手了 MBP 2018,就想着将旧电脑的数据<a href="https://support.apple.com/zh-cn/HT204350">使用“迁移助理”迁移到新 macbook</a>,但是打开迁移助理后却提示由于旧电脑的文件系统格式是“Mac OS 拓展(区分大小写,日志式)”(Case-sensitive, Journaled),而新 macbook 则是默认“Mac OS 拓展(日志式”(without the Case-sensitive),因此不支持数据迁移。</p> <p>这可难倒我了,旧电脑使用了很久,里面有很多购买的软件,也有很有程序的设置和文件,如果要手动拷贝到新 macbook 上,无疑是很低效,而且效果也不好的。</p> <h2>初步搜索结果</h2> <p>于是我初步 Google 了一下,先是找到了2种方法:</p> <ul> <li>将新 macbook 格盘成大小写敏感重装系统,再数据迁移(缺点是新 macbook 的文件系统格式变成了大小写敏感)</li> <li>将旧电脑修改所有大小写重名的文件,做一个 TimeMachine,然后旧电脑格盘成大小写不敏感,再使用 TimeMachine 恢复,最后数据迁移(缺点是较繁琐,且旧电脑的数据被格掉,方法来自 <a href="https://github.com/cr/MacCaseSensitiveConversion"><a href="https://github.com/cr/MacCaseSensitiveConversion">https://github.com/cr/MacCaseSensitiveConversion</a></a>)</li> </ul> <p>先说一下2个方法,第一个方法肯定可行,但是 macOS 默认大小写不敏感是有道理的,很多软件默认不支持大小写敏感的文件系统,比如我装 steam 平台时就遇到过。且目前而言,大小写不敏感的文件系统利大于弊,因此我决定使用大小写不敏感的文件系统,第一个方法被否掉。</p> <p>第二个方法,其实也算比较冒险且繁琐,需要经历查找-重命名-备份-格盘-恢复-迁移的步骤,而且万一格盘后不能恢复(网上曾见过大小写敏感的 TimeMachine 不能被恢复成大小写不敏感),原始文件都没了。如果没有找到第三个方法,那么我可能被迫只能使用第二个方法了。</p> <p>另外在Google 过程中,找到一个<a href="https://coriolis-systems.com/">名为“iDefrag”的软件(旧名称为“iPartition”)</a>,有人称是可以进行大小写敏感的转换的,遗憾的是,该软件预计在19年7月份才更新到支持 macOS 10.10以上,因此同样放弃。</p> <h2>解决方法</h2> <p>碰巧的是,当我过了几天,再 Google 搜索时,居然找到有人使用 <a href="https://bombich.com/">Carbon Copy Cloner</a> 将文件系统转换成大小写不敏感的经历,虽然是16年的帖子,但是有成功的经历,且我自己看了整个流程后,发现不用格盘,因此信心倍增。</p> <p>流程如下:</p> <ol> <li>下载 Carbon Copy Cloner(以下简称 CCC),安装,有30天的试用期,因此完全够用了;</li> </ol> <p>![](./assets/2019-02-08-CleanShot 2019-02-02 at 01.08.27@2x.png)</p> <ol start="2"> <li>使用 CCC 将 Mac 系统盘备份到一个大小写不敏感的分区(此步我是在旧电脑的硬盘上分出1个足够大小的大小写不敏感分区,读者使用移动硬盘或者足够大小的 U 盘也是可以的)</li> </ol> <p>![磁盘工具](./assets/2019-02-08-磁盘工具 2019-02-01 at 17.06.15.png) ![Carbon Copy Cloner](./assets/2019-02-08-Carbon Copy Cloner 2019-02-01 at 17.01.02.png)</p> <ol start="3"> <li>检查备份是否成功,下图可见大小写重名冲突只是少量文件,因此我推测可以成功</li> </ol> <p>![Carbon Copy Cloner](./assets/2019-02-08-Carbon Copy Cloner 2019-02-01 at 17.01.37.png) ![Carbon Copy Cloner](./assets/2019-02-08-Carbon Copy Cloner 2019-02-01 at 17.01.59.png)</p> <ol start="4"> <li>挂载备份盘(备份盘分区时命名为 Recovery HD)</li> <li>在“系统偏好设置”中,进入“启动磁盘”,并选择Recovery HD,重新启动</li> </ol> <p>![系统偏好设置](./assets/2019-02-08-系统偏好设置 2019-02-01 at 17.06.32.png) ![系统偏好设置](./assets/2019-02-08-系统偏好设置 2019-02-01 at 17.06.45.png)</p> <ol start="6"> <li>以 Recovery HD 重启 mac 系统,登录进入(会发现克隆了一个一模一样的环境,CCC 真强大)</li> <li>此时我们已经拥有了一个大小写不敏感的 Mac 系统了,启动迁移助理,成功完成数据迁移!(最后需要提醒,使用数据迁移,尽量使用雷电数据线或者网线进行数据传输,速度将会快很多,70G 的数据迁移,<del>WIFI 下需要12h 以上</del>,网线情况下我只使用了约2h)</li> </ol> <p><figure style="flex: 66.66666666666667" ><img width="1024" height="768" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/9a37dc5f3051d20ae782f4324bbb452f.jpg" /></figure></p> <h2>参考网页</h2> <ol> <li><a href="https://discussions.apple.com/thread/7546003">https://discussions.apple.com/thread/7546003</a></li> <li><a href="https://forums.macrumors.com/threads/case-sensitive-to-normal.1969880/">https://forums.macrumors.com/threads/case-sensitive-to-normal.1969880/</a></li> <li><a href="https://twiceyuan.com/2018/12/11/MacCaseSensitiveConversion/">macOS 文件系统的大小写敏感转换</a></li> </ol> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/macOS_Case_Sensitive_to_Case_Insensitive/Sat, 02 Feb 2019 12:33:00 +0806基因组、cDNA、氨基酸坐标转换神器:Transvarhttps://zhengzexin.com/archives/Transvar/<h2>简介</h2> <p>Transvar 是 MD Anderson 开发的一款多种方向的突变/坐标转换工具,它支持基因组坐标、cDNA 坐标以及蛋白氨基酸坐标之间的转换。Google 了一下,发现对于这个工具的介绍还是很少的,于是来介绍一下。</p> <p>举个实际例子,肺癌中的EGFR基因突变,在 COSMIC 上见到的一个突变的描述网页如下,我们可以看到id 为<code>COSM6223</code>的突变,是一个 EGFR 基因上的缺失突变,对应的 cDNA 上的突变为<code>c.2235_2249del15</code>,而氨基酸突变为<code>p.E746_A750delELREA</code>,基因组坐标则为<code>7:55242465..55242479</code>;那么这个突变是否属于 EGFR 19号外显子缺失呢?缺失的序列是哪些?</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-11 at 00.27.17@2x.png)</p> <h2>网页版使用</h2> <p>首先我们打开 Transvar 的网页版:<a href="https://bioinformatics.mdanderson.org/transvar/"><a href="https://bioinformatics.mdanderson.org/transvar/">https://bioinformatics.mdanderson.org/transvar/</a></a></p> <p>![](./assets/2019-03-16-CleanShot 2019-02-11 at 00.14.17@2x.png)</p> <h3>基因组正向注释</h3> <p>首先我们来尝试从基因组正向注释到 cDNA 及氨基酸坐标上。勾选<code>Forward Annotation: gDNA</code>,我们可以看见示例输入如下。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-11 at 00.38.49@2x.png)</p> <p>于是如上图,我们勾选<code>GRCh37/hg19</code>,并且勾选下面的<code>RefSeq</code>(需要其他数据库的可以都勾选上),在右侧的输入框中输入<code>chr7:g.55242465_55242479del</code>,点击<code>Submit</code>提交。</p> <p>然后我们就能看到结果如下,</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-11 at 00.41.17@2x.png)</p> <p>如下图,<code>XM_</code>开头的为预测转录本,我们只看<code>NM_005228</code>的结果,该突变确实为 EGFR 19号外显子缺失,并且缺失的序列为<code>AGGAATTAAGAGAAGC&gt;A</code>。滑动滚动条,我们还能看到更多的注释结果。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-11 at 00.42.06@2x.png)</p> <h3>cDNA 反向注释</h3> <p>尝试了基因组正向的注释,我们来测试一下通过 cDNA 坐标反向注释回基因组以及氨基酸坐标,这在我们只知道某种转录本的特定突变,需要查找基因、基因组坐标时特别有用。</p> <p>如下图,勾选<code>Reverse Annotation: cDNA</code>,保持勾选<code>GRCh37/hg19</code>以及下面的<code>RefSeq</code>,根据示例提示,输入<code>EGFR:c.2235_2249del</code>,Submit。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-12 at 01.40.24@2x.png)</p> <p>如下图我们可以看到结果与之前的基因组正向注释的输入、结果都是一致的。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-12 at 01.41.18@2x.png)</p> <h3>氨基酸反向注释</h3> <p>最后我们来尝试一下通过氨基酸突变的反向注释,当我们获得以氨基酸水平的突变表示时,我们可以通过 Transvar,轻松地转换成基因组/cDNA 水平的突变。如下图勾选<code>Reverse Annotation: Protein</code>,同样保持勾选<code>GRCh37/hg19</code>以及下面的<code>RefSeq</code>,根据示例提示,输入<code>EGFR:p.E746_A750delELREA</code>,Submit。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-12 at 01.45.00@2x.png)</p> <p>如下图,结果毫无疑问是一致的。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-12 at 01.54.30@2x.png)</p> <p>另外,当我们输入为<code>EGFR:p.746_750</code>时,如下图我们看到 Transvar 依然可以给我们转换出这个密码子的基因组水平的坐标范围以及 cDNA 水平的坐标范围,这在我们需要通过密码子来查找对应的基因组范围时特别有用。</p> <p>![](./assets/2019-03-16-CleanShot 2019-02-12 at 01.56.34@2x.png)</p> <h2>终端版使用</h2> <p>这么有用的工具,即使在网页上上传输入文件<strong>批量转换坐标</strong>,对于我们生信工作者来说,有时仍然有些麻烦。</p> <p>那么能否将 Transvar 部署到本地呢?答案是肯定的!</p> <p>Transvar 提供了本地部署的方法:</p> <p>旧版的代码托管主页放在了 SourceTree,<a href="https://bitbucket.org/wanding/transvar"><a href="https://bitbucket.org/wanding/transvar">https://bitbucket.org/wanding/transvar</a></a>,<em>last modified 2016-04-12</em></p> <p>而新版的代码托管则迁移到了 Github 上,<a href="https://github.com/zwdzwd/transvar"><a href="https://github.com/zwdzwd/transvar">https://github.com/zwdzwd/transvar</a></a>,并且用户文档位于<a href="https://transvar.readthedocs.io/en/latest/index.html">Read the Docs</a>。</p> <p>而且还提供了 <a href="https://cloud.docker.com/repository/docker/zhouwanding/transvar/general">Docker 镜像</a>。</p> <h3>安装</h3> <p>参考<a href="https://transvar.readthedocs.io/en/latest/download_and_install.html">用户文档</a>,安装 Transvar 主要分<code>pip安装</code>和<code>Docker 镜像</code>2种;但安装后需要下载配置 reference 数据库。</p> <p>使用Python pip进行安装:</p> <div class="highlight"><pre><span></span>sudo pip install transvar <span class="c1"># 全局安装</span> pip install --user transvar <span class="c1"># 用户安装</span> </pre></div> <p>使用 Docker 镜像进行安装</p> <div class="highlight"><pre><span></span>docker pull zhouwanding/transvar:2.4.6 docker run -v ~/references/hg38:/data -ti zhouwanding/transvar:2.4.6 transvar panno -i PIK3CA:p.E545K --ensembl --reference /data/hg38.fa <span class="c1"># -v 加载~/references/hg38到 Docker Container 中的/data路径</span> <span class="c1"># transvar panno -i PIK3CA:p.E545K --ensembl --reference /data/hg38.fa 为注释调用命令</span> </pre></div> <p>下载配置 Reference 数据库也很简单,以<code>hg19</code>为例</p> <div class="highlight"><pre><span></span><span class="c1"># set up databases</span> transvar config --download_anno --refversion hg19 <span class="c1"># in case you don&#39;t have a reference</span> transvar config --download_ref --refversion hg19 <span class="c1"># in case you do have a reference to link</span> transvar config -k reference -v <span class="o">[</span>path_to_hg19.fa<span class="o">]</span> --refversion hg19 </pre></div> <p>也可以自己自定义配置数据库,具体设置请参考<a href="https://transvar.readthedocs.io/en/latest/setup_and_customize_transvar.html#setup-and-customize">Setup and Customize</a>。</p> <p>另外,由于直接使用Transvar的命令下载参考数据库有点像<code>ANNOVAR</code>,容易因网络问题出错,因此你也可以到<a href="http://transvar.info/transvar_user/annotations/"><a href="http://transvar.info/transvar_user/annotations/">http://transvar.info/transvar_user/annotations/</a></a>直接自行下载,然后配置(PS:默认的hg19的 dbSNP 数据库是2016年的,而2018年dbSNP v150等SNP 数量直接翻一番,所以建议自行重新下载)。</p> <h3>使用</h3> <p>使用命令也很清晰明了,由于与网页版类似,所以只列出对应的命令,更详细的内容请参考<a href="https://transvar.readthedocs.io/en/latest/index.html">用户文档</a>。</p> <div class="highlight"><pre><span></span>transvar ganno --ccds -i <span class="s1">&#39;chr3:g.178936091G&gt;A&#39;</span> <span class="c1"># 基因组正向注释</span> transvar canno --ccds -i <span class="s1">&#39;PIK3CA:c.1633G&gt;A&#39;</span> <span class="c1"># cDNA反向注释</span> transvar panno -i <span class="s1">&#39;PIK3CA:p.E545K&#39;</span> --ensembl <span class="c1"># 氨基酸反向注释</span> <span class="c1"># 其中--ccds、--ensembl为使用不同的数据库,如网页版,可以同时多选,\</span> <span class="c1"># 如 --ccds --ensembl --refseq --ucsc 来进行多选</span> <span class="c1"># 批量注释</span> <span class="c1">## 样式一</span> <span class="c1"># cat data/small_batch_input</span> <span class="c1"># chr3:g.178936091G&gt;A</span> transvar ganno -l data/small_batch_input --ccds <span class="c1"># 直接-l输入格式已转换好的输入文件</span> <span class="c1">## 样式二</span> <span class="c1"># cat data/small_batch_input</span> <span class="c1"># chr3 178936091 G A CCDS43171</span> <span class="c1"># chr9 135782704 C G CCDS6956</span> transvar ganno -l data/small_batch_input -g <span class="m">1</span> -n <span class="m">2</span> -r <span class="m">3</span> -a <span class="m">4</span> -t <span class="m">5</span> --ccds <span class="c1"># 指定-g、-n、-r、-a、-t对应的列(染色体、位置、ref、alt、transcript)</span> <span class="c1">## 样式三</span> <span class="c1"># cat data/small_batch_hgvs</span> <span class="c1"># CCDS43171 chr3:g.178936091G&gt;A</span> <span class="c1"># CCDS6956 chr9:g.135782704C&gt;G</span> transvar ganno -l data/small_batch_hgvs -m <span class="m">2</span> -t <span class="m">1</span> --ccds <span class="c1"># 类似样式一,-t可选,指定-t、-m对应的列(mutation、transcript)</span> </pre></div> <h2>总结</h2> <p>以上,我们可以看到 Transvar 作为坐标转换的神器的作用,特别是大批量的基因组区域、突变需要进行转换/注释时,甚至能指定 VCF 格式的输出。Transvar 其实16年甚至更早就已经发布,一开始源码放在Bitbucket上,经历了很长一段时间的没有更新,后来又转到 Github 上,令人可喜地发现最近又频繁更新起来。</p> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/Transvar/Sat, 16 Mar 2019 12:38:00 +0806静态编译 Tmuxhttps://zhengzexin.com/archives/Tmux_static_compilation/<p>最近在学习使用 Tmux 这个终端复用神器,由于服务器上并不是管理员用户,因此就想自己静态编译安装 Tmux。</p> <p><a href="https://github.com/tmux/tmux/wiki">Tmux 的Github wiki</a></p> <h2>CentOS 静态编译</h2> <p>方法很简单,但是也绕了不少弯路。</p> <p>根据wiki,首先我们下载 <a href="https://github.com/tmux/tmux/releases">tmux</a>,以及所依赖的<code>libevent 2.x</code>与<code>ncurses</code>。</p> <div class="highlight"><pre><span></span><span class="nb">cd</span> ~/Downloads <span class="c1"># 将文件下载到Downloads</span> wget -c https://github.com/tmux/tmux/releases/download/2.8/tmux-2.8.tar.gz wget -c https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz wget -c ftp://ftp.invisible-island.net/ncurses/ncurses.tar.gz </pre></div> <p>首先编译安装依赖项</p> <div class="highlight"><pre><span></span>tar zxf ncurses.tar.gz <span class="nb">cd</span> ncurses-6.1 ./configure --prefix<span class="o">=</span>path/to/temp <span class="o">&amp;&amp;</span> make <span class="o">&amp;&amp;</span> make install <span class="c1"># 将 ncurses 安装到path/to/temp,请注意使用绝对路径</span> tar zxf libevent-2.1.8-stable.tar.gz <span class="nb">cd</span> libevent-2.1.8-stable ./configure --prefix<span class="o">=</span>path/to/temp <span class="o">&amp;&amp;</span> make <span class="o">&amp;&amp;</span> make install <span class="c1"># 将 libevent 安装到path/to/temp,请注意使用绝对路径</span> </pre></div> <p>然后编译安装 tmux</p> <div class="highlight"><pre><span></span>tar zxf tmux-2.8.tar.gz <span class="nb">cd</span> tmux-2.8 <span class="nb">export</span> <span class="nv">LDFLAGS</span><span class="o">=</span><span class="s2">&quot;-L/usr/lib -Lpath/to/temp/lib -Wl,-R/usr/lib -Wl,-Rpath/to/temp/lib&quot;</span> <span class="c1"># 注意修改成上述编译依赖项的绝对路径,注意是-Wl,-R,不会 C 的我卡在这里好久</span> <span class="nb">export</span> <span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">&quot;-I/usr/include -Ipath/to/temp/include&quot;</span> <span class="c1"># 注意修改成上述编译依赖项的绝对路径</span> ./configure --prefix<span class="o">=</span>path/to/tmux2 <span class="c1"># 注意修改路径</span> make <span class="o">&amp;&amp;</span> make install <span class="c1">###</span> <span class="nv">PATH</span><span class="o">=</span><span class="nv">$PATH</span>:path/to/tmux/bin/ <span class="c1"># 将这句添加到~/.bashrc或~/.zshrc,然后重启终端或 source 一下</span> <span class="c1">###</span> </pre></div> <h2>其他方法以及在 Mac 上</h2> <p>在 Mac 上安装肯定是使用 brew 安装最简单快捷,</p> <div class="highlight"><pre><span></span>brew install tmux </pre></div> <p>但其实在 Linux 上,也有<a href="https://docs.brew.sh/Homebrew-on-Linux">Linuxbrew</a>,安装完 Linuxbrew 后,也可以使用以上语句进行安装,但我尝试后失败,可能是由于非root用户,所以部分依赖项还是无法安装上,所以这个方法也不是很推荐。</p> <p>最后一个方法,当然是使用万能的 conda 啦,当时服务器上我并没有安装 conda,因此就直接使用了静态编译。</p> <p><a href="https://anaconda.org/conda-forge/tmux">conda-forge/packages/tmux 2.7</a></p> <div class="highlight"><pre><span></span>conda install -c conda-forge tmux </pre></div> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/Tmux_static_compilation/Sun, 24 Mar 2019 23:22:00 +0806记录一次 Name.com 自动续费成功退款的经过https://zhengzexin.com/archives/successful_refund_from_Name_com/<p>上个月的某天,我收到 Name.com 的邮件提示,告诉我的一个网站自动续费了;之前我已经收到关于这个域名快要到期的邮件了,但是没想到在域名有效期还剩下一个月左右的时候,Name.com 就帮我自动续费了。</p> <p>本来我是打算在 Name.com 上续费的,因为 Name.com 续费可以使用优惠码进行打折,而且 WHOIS 隐私服务也可以使用优惠码来兑换,算是挺实惠的。</p> <p>![](./assets/CleanShot 2019-05-04 at 12.02.37@2x.png)</p> <p>但是没想到 Name.com 抢先在我之前就自动续费了,而且还是按着全额的价格来续费(可以看到,本来 10.99 刀,而现在 12.99+4.99 刀,多花了将近 7 刀)。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.11.13@2x.png)</p> <p>于是我想,不能吃了这个哑巴亏呀,我要尝试一下能不能退款。毕竟 7 刀也差不多够我再买一个新的.com 域名了(Name.com COM 注册为 8.99 刀)。于是我到网上 Google,没想到大部分人说的都是,这是不能退款,有的人说这钱是交给注册局的,有的说域名注册能退但续费不能退,也有的说能退款,但是必须删除掉你的域名,这样注册局才能退钱之类云云。但是我也在网上搜到极少数的说成功退款的经历,主要还是域名注册的。</p> <p>不管怎么说,不试试怎么知道呢,于是我 Google 了一下退款的工单的例子,然后提交了一份工单。一般外国的服务商上班时间都是国内的晚上,所以提交工单之后,就需要耐心地等待那边上班了。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.13.58@2x.png)</p> <p>隔了差不多一天,Name.com 给我回复了,</p> <p>![](./assets/CleanShot 2019-05-04 at 17.17.05@2x.png)</p> <p>其中有几个需要注意的点,:</p> <ol> <li>退款需要在交易的 5 天内完成;</li> <li>需要删除我的域名;</li> </ol> <p>同时他也提到,需要我回复确认是否删除域名;另外删除后我可以提交退款单,退款就会打到我的邮箱。</p> <p>这时我就有点懵逼了,真的如网上所说的,需要删掉我的域名才能给我退款?但是邮件里他的表达又有点含糊其辞,没有表达清楚这个删除是什么意思?是向注册局提交我放弃我的域名(我的域名还有 1 个月左右的有效期)?还是在 Name.com 上删除我的域名?于是我给他回了邮件,希望他再次解释清楚,并且询问是否能不删除域名,只是取消续费的操作。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.22.19@2x.png)</p> <p>很快又收到 Name.com 工作人员的回复了,这次他的回复再次表达到,如果需要退款,必须先删除掉我的域名。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.24.04@2x.png)</p> <p>但是后面的第二段内容则有点意思了,他说到我可以选择转移域名或者将域名留在这里。这是否意味着,我将域名转移走,也属于在 Name.com 删除我的域名的操作?于是我怀着希望,再次给他回复邮件了。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.27.00@2x.png)</p> <p>很快,我又收到了回复,</p> <p>![](./assets/CleanShot 2019-05-04 at 17.27.14@2x.png)</p> <p>没错,这次他肯定地答复,如果我在自动续费交易发生的 5 天内完成域名的转移,那么将能够退款给我。OK,那么其实这个时候已经距离自动续费的交易过了有 3、4 天了,而我则需要尽快完成域名转移。</p> <p>这时候就要使用 <a href="https://www.domcomp.com/">domcomp</a> 这个神器了,这个网站,可以查询不同后缀的域名,注册、续费、转移的最便宜的价格的域名服务商有哪些。于是我搜索了.com 转移的最便宜的服务商。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.33.43@2x.png)</p> <p>没错,我们能看到,.com 最便宜的转移价格在 1&amp;1 这个网站,价格为 1 刀,其实这里可能由于 domcomp 这个网站的数据有些错误,所以 1&amp;1 的转移价格并不是 1 刀,只是新注册.com 的价格为活动价 1 刀。</p> <p>但是我之前也有域名在 1&amp;1 上面,于是正好,也免得注册别的了,就转移到 1&amp;1 上面吧,这里不得不夸奖 Name.com 的服务,还有 ** 加速转移域名 ** 的按钮,于是很快我的域名就提交了加速转移了。</p> <p>接着我就直接提交了退款单,等待 Name.com 的退款了,这时还是有点紧张的,因为已经接近 5 天的限期,而且不知道 Name.com 的工作人员上班处理时间是什么时候,也不知道域名是否已经完全转移成功。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.39.00@2x.png)</p> <p>接着我就收到与之前几乎一模一样的回复,于是这次我就回复确认删除且退款。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.39.41@2x.png)</p> <p>![](./assets/CleanShot 2019-05-04 at 17.40.00@2x.png)</p> <p>然后,我就收到了确认退款的回复了,大概需要 3-5 天的时间,退款将会退回到我的信用卡。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.40.16@2x.png)</p> <p>最后耐心地等待,就收到银行的退款确认了。可以看到,从自动续费到退款,整个事件在 5、6 天左右。最后称赞一下,Name.com 的服务还是很棒的,工单回复也算及时,而且域名服务有免费的 WHOIS 隐私赠送。</p> <p>![](./assets/CleanShot 2019-05-04 at 17.48.20@2x.png)</p> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/successful_refund_from_Name_com/Sat, 04 May 2019 23:22:00 +0806记录 VEP 关于 COSMIC 注释的一个坑https://zhengzexin.com/archives/VEP_note1/<p>工作中有用到VEP,确实是一款出色的注释软件。相比ANNOVAR,最大的优点是支持HGVS标准的注释。</p> <p>可能由于ANNOVAR面世比较早,当时很多变异描述的标准还没有通行,ANNOVAR采取的是按照基因组来<code>left-normalization</code>的方法,而HGVS的标准,则是根据基因/转录本的方向来<code>left-normalization</code>,因此有可能有的基因与ANNOVAR注释的方向相反。在某些地方,如<code>delins</code>的突变,ANNOVAR与VEP的注释也会不相同,当然,我们还是认为两者都是很出色的注释软件。(关于注释软件的比较,可以看看Golden Helix的这篇文章,<a href="http://blog.goldenhelix.com/goldenadmin/the-sate-of-variant-annotation-a-comparison-of-annovar-snpeff-and-vep/%EF%BC%89">http://blog.goldenhelix.com/goldenadmin/the-sate-of-variant-annotation-a-comparison-of-annovar-snpeff-and-vep/%EF%BC%89</a></p> <p>这次,主要是<a href="https://zhengzexin.com/bioinfo/ji-lu-vepguan-yu-cosmiczhu-shi-de-yi-ge-keng">记录一个VEP关于COSMIC注释的坑</a>,避免大家以后踩到。事情的缘由,还是Ryu的一个同事,发现在一个Somatic突变上,VEP注释了多个COSMIC记录,而查证后却发现,很多事不正确的。</p> <p>比如,我们用编号为<code>COSM476</code>的<code>BRAF:V600E</code>来举例:</p> <p>![](./assets/CleanShot 2019-06-30 at 20.45.05@2x.png)</p> <p>可见,VEP确实注释了多个COSMIC ID,但只有<code>COSM476</code>才是正确的。What?这是怎么发生的。</p> <p>于是Ryu就去查VEP的文档,终于被我发现了原因。VEP注释是可以注释COSMIC的记录的,但是这个注释,主要是根据染色体坐标而进行的<code>co-located variants</code>注释,没有判断这个突变是什么碱基变化的。</p> <p>![](./assets/CleanShot 2019-06-30 at 20.49.41@2x.png)</p> <p>那么为什么要这么做呢?VEP明显是可以实现分辨碱基突变的功能的。援引VEP的原文,原来Ensembl并没有COSMIC、HGMD等数据库的精细到碱基突变的使用许可协议,因此这些数据能够被注释,但是却是换了一个方法,只能精细到染色体位置的层级。</p> <blockquote> <p>For some data sources (COSMIC, HGMD), Ensembl is not licensed to redistribute allele-specific data, so VEP will report the existence of co-located variants with unknown alleles without carrying out allele matching. To disable this behaviour and exclude these variants, use the --exclude_null_alleles flag.</p> </blockquote> <p>看到这里,不禁感叹外国人对于版权的意识。在国内,可能COSMIC的注释,分分钟就被人注释上去了,也不会有人追究。其实ANNOVAR的COSMIC注释也止步更新于V70,而现在的COSMIC版本都已经快V90了。</p> <p><figure style="flex: 76.91807542262679" ><img width="2366" height="1538" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/92ccc821fdb7eeeafaee497d99569e0f.png" /></figure></p> <p>大家以后使用VEP的时候,不要直接使用注释其中的COSMIC记录哦。</p> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/VEP_note1/Sun, 30 Jun 2019 23:22:00 +0806Typecho博客被刷垃圾评论https://zhengzexin.com/archives/fuck_the_spam/<p>事情的起由,源自于上周想到看看博客的情况。结果打开aliyun就发现博客最近几天的流量异常多;而打开Cloudflare的监控发现,有2个国家的IP访问数非常多;一打开博客,居然被刷了几千条垃圾评论。</p> <h2>1. 监控显示异常</h2> <p>![上周的流量监控](./assets/CleanShot 2019-10-28 at 22.15.38@2x.png)</p> <p>可以看到,由于访问量较少,所以一般情况下,每天流量只用到几M,而从20日开始,居然每天都刷了几百M甚至1G的流量,到我发现的25日,其实已经被垃圾评论刷了5天,将近3000条垃圾评论。</p> <p>![上周的IP统计](./assets/CleanShot 2019-10-28 at 22.17.08@2x.png)</p> <p>而从Cloudflare的统计则显示,来自法国、美国的访问量很异常,甚至比中国的还多;啥时候我的博客有这么多法国🇫🇷读者了?</p> <h2>2. 解决垃圾评论</h2> <p>发现这些垃圾评论的第一瞬间,我就明白博客被攻击了/被刷垃圾评论了,攻击者的目的可能是刷爆你的数据库容量/主机流量||(后来有看到别的博客提到莆田的IP狂发垃圾广告评论等)||。于是第一时间当然是防止垃圾评论,禁止IP访问。</p> <h3>2.1 删除评论,修改Typecho设置</h3> <p>打开aliyun后台,打开数据库的管理工具DMS,打开表<code>typecho_comments</code>,查找垃圾评论的coid范围,然后打开SQL窗口,输入语句</p> <div class="highlight"><pre><span></span><span class="k">DELETE</span> <span class="k">FROM</span> <span class="ss">`typecho_comments`</span> <span class="k">WHERE</span> <span class="ss">`coid`</span> <span class="k">BETWEEN</span> <span class="mi">3180</span> <span class="k">AND</span> <span class="mi">3185</span> <span class="c1"># 3180到3185是垃圾评论的coid范围</span> </pre></div> <p>打开Typecho后台-&gt;设置-&gt;评论,勾选“所有评论必须经过审核”或“评论者之前须有评论通过了审核”,由于脚本是会更改IP来刷评论,因此勾选这2项,可以先禁止文章中继续产生垃圾评论。而“允许使用的HTML标签和属性”一栏中,也应该清空,防止垃圾评论里的网页链接。</p> <p>![Typecho后台评论选项](./assets/CleanShot 2019-10-28 at 22.34.41.png)</p> <h3>2.2 安装Typecho 插件或修改PHP文件</h3> <ul> <li>小墙AntiSpam</li> <li><a href="http://www.yovisun.com/archive/typecho-plugin-smartspam.html">SmartSpam by YoviSun</a></li> <li>comment.php修改为只允许中文环境评论</li> <li><a href="https://www.ruletree.club/archives/1167/">CC 5秒盾</a></li> </ul> <p>推荐使用SmartSpam,因为该插件可以屏蔽IP、选择评论的处理方式(标记为待审核/标记为垃圾/评论失败)、禁止关键字/词汇等。也支持只允许中文评论。</p> <p>而小墙AntiSpam确实能挡住垃圾评论,但是我看了源码,源码只有90行左右,且容易误判。所以还是不推荐。</p> <p>而CC五秒盾,更多的是防止CC攻击或者频率很高的脚本。如果不清楚作用的,建议不要使用。</p> <h3>2.3 主机平台屏蔽或Cloudflare防御</h3> <p>如果你的主机平台有屏蔽IP的措施,那么你也可以增加规则;而我则使用Cloudflare来防御。首先可以打开Cloudflare的“Overview”下的“Under Attack Mode”,会产生如CC五秒盾一样的效果,每个访问会先等待5秒再进入;而“Firewall”下的“Firewall Rules”也可以增加屏蔽特定国家/IP的访问。</p> <p>![Cloudflare攻击防御模式](./assets/CleanShot 2019-10-28 at 23.09.35.png)</p> <p>![Cloudflare防火墙规则设置](./assets/CleanShot 2019-10-28 at 23.09.55.png)</p> <h3>2.4 安装评论提醒插件</h3> <ul> <li><a href="https://blog.imalan.cn/archives/349/">Mailer by 熊猫小A</a></li> <li><a href="https://lscho.com/tech/comment_to_wechat.html">CommentToWechat by lscho</a></li> </ul> <p>这次被攻击了5天才知道,就是由于没有安装评论提醒插件,所以吸取教训,也为了改善评论访客的体验,所以安装这2款插件;Mailer是VOID主题作者配套的邮件提醒插件,果然刚设置好,立刻收到好几封垃圾评论邮件,也算间接测试了;而CommentToWechat则借用了Server酱发送微信提醒,更加能随时随地收到评论提醒。</p> <h2>3. 从垃圾评论说开来</h2> <p>有了以上的这些手段,一般的攻击应该是可以防御了。其实从将博客迁移回Typecho前,我就有这方面的担心,因为很久以前使用Wordpress搭建博客时,也遇到过攻击;那时大部分博客工具如Wordpress、Emlog等都是php语言写的,而很多这方面的攻击工具就针对php的站点,如扫描你数据库的端口等各种攻击。</p> <p>其实,躲在网络另一边的攻击者,一般技术没有多厉害,不然的话,我的博客早就被打瘫了。而这种人只是找到了这些工具,然后就迫不及待地去找别人的站点来尝试,如果尝试成功了,就感觉得到莫名的成就感/虚荣感。</p> <p>很神奇的是,并不止博客类站点有这种情况,其实网络上就是充斥了很多这种损人不利己的行为,如我之前听到GGtalk里的<a href="https://talk.swift.gg/43">《游戏加速纵横谈》</a>这期,就提到曾经有段时间,加速器服务厂商们经常受到DDOS攻击,其实大家都能猜到大概是哪些人做的。对付无聊的人,最好的方法就是不理他们。</p> <p>截止到目前,攻击还在继续,而它们再也不能威胁到我的博客。</p> <p>![24小时内的IP统计](./assets/CleanShot 2019-10-28 at 23.21.47.png)</p> <p>背景图:Photo by Franck V. on Unsplash</p> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/fuck_the_spam/Tue, 29 Oct 2019 00:07:00 +0806VPS装机记录(1):SSH篇https://zhengzexin.com/archives/VPS_No1_SSH/<p>前段时间趁黑五折扣,买了个<a href="https://zhuanlan.zhihu.com/p/23151978">小鸡</a><sup class="footnote-ref" id="fnref-1"><a href="#fn-1">1</a></sup>来玩,由于是什么都没有的centos系统,因此一切装机都要靠自己来,也顺便记录一下自己的心得。</p> <p>首先,开启一台VPS后,第一步肯定是登录上去,才能进行后续的操作,而我们的VPS平时放在网上,肯定有一堆无聊的人会去扫端口,密码爆破这种<a href="https://zhengzexin.com/2019/10/29/fuck_the_spam">无聊的事情</a>,所以我们第一步是保证服务器的登录安全。</p> <p>我想要达到的目的是这样的,以下方法均是在centos7上:</p> <ol> <li>修改SSH默认的22端口</li> <li>使用fail2ban去屏蔽多次尝试密码的IP</li> <li>禁止root用户直接登录</li> <li>使用密码加 Google Authenticator 2步验证进行登录</li> <li>或使用有密码的SSH密钥进行登录</li> </ol> <h2>1. 修改SSH端口</h2> <p>修改ssh端口需要修改ssh配置、修改firewall配置、修改SElinux配置三个文件,以下均是使用管理员权限执行。</p> <h3>1.1 修改<code>/etc/ssh/sshd_config</code>文件</h3> <p><code>vi /etc/ssh/sshd_config</code>进入该文件,找到<code>Port 22</code>这一行,然后在下面添加一行如<code>Port 43</code>作为新的端口,注意在确定可以使用新端口登录前,不要注释<code>Port 22</code>这一行,以免无法登录。</p> <p>![](./assets/CleanShot 2019-12-09 at 22.12.01@2x.png)</p> <h3>1.2 修改firewall配置</h3> <div class="highlight"><pre><span></span>firewall-cmd --zone<span class="o">=</span>public --add-port<span class="o">=</span><span class="m">43</span>/tcp --permanent <span class="c1"># firewall添加你选择的ssh端口,--permanent是保存设置,否则下次重启后不生效</span> systemctl start firewalld <span class="c1"># 若firewall未启动,则先启动</span> firewall-cmd --reload <span class="c1"># 重新加载firewall</span> firewall-cmd --zone<span class="o">=</span>public --query-port<span class="o">=</span><span class="m">43</span>/tcp <span class="c1"># 查看端口是否添加成功,yes表示成功,no表示未添加成功</span> </pre></div> <p>![](./assets/CleanShot 2019-12-09 at 22.18.38@2x.png)</p> <h3>1.3 修改SELinux配置</h3> <p>这一步有的VPS可能是关闭SELinux的,就不需要修改;但是默认应该是打开了SELinux的,因此推荐修改。</p> <div class="highlight"><pre><span></span>semanage port -l <span class="p">|</span> grep ssh <span class="c1"># 查看当前SELinux允许的ssh端口</span> </pre></div> <p>如果显示<code>semanage command not found</code>,则</p> <div class="highlight"><pre><span></span>yum provides semanage <span class="c1"># 或 yum whatprovides semanage</span> yum -y install policycoreutils-python <span class="c1"># 安装</span> </pre></div> <div class="highlight"><pre><span></span>/usr/sbin/sestatus -v <span class="c1"># 查看SELinux状态,enabled即为开启状态</span> </pre></div> <p>若未开启,则<code>vi /etc/selinux/config</code>,将<code>SELINUX=disabled</code>修改为<code>SELINUX=enforcing</code>,需要重启。</p> <div class="highlight"><pre><span></span>semanage port -a -t ssh_port_t -p tcp <span class="m">443</span> <span class="c1"># 添加ssh端口</span> semanage port -l <span class="p">|</span> grep ssh <span class="c1"># 再执行一次查看是否添加成功</span> </pre></div> <h3>1.4 重启服务,并测试是否成功</h3> <div class="highlight"><pre><span></span>systemctl restart sshd systemctl restart firewalld.service shutdown -r now <span class="c1"># 重启机器,最好重启一下</span> </pre></div> <p>重启后使用新端口进行ssh登录,测试是否添加成功。</p> <div class="highlight"><pre><span></span>ssh usrname@server -p <span class="m">43</span> <span class="c1"># 使用-p指定端口</span> </pre></div> <p>登录成功后<code>vi /etc/ssh/sshd_config</code>将<code>Port 22</code>这一行注释,并继续重启服务以生效。</p> <h2>2. 使用fail2ban去屏蔽多次尝试密码的IP</h2> <p>修改默认ssh端口后已经可以防御很多只扫描特定端口的脚本,但是还是有被密码爆破的风险,因此我们安装fail2ban来屏蔽多次尝试密码的坏人。</p> <div class="highlight"><pre><span></span>yum -y install epel-release <span class="c1"># CentOS内置源并未包含fail2ban,需要先安装epel源</span> yum -y install fail2ban <span class="c1"># 安装fail2ban</span> </pre></div> <p><code>vi /etc/fail2ban/jail.local</code>来新建fail2ban的配置,复制以下配置作为默认规则:</p> <div class="highlight"><pre><span></span><span class="o">[</span>DEFAULT<span class="o">]</span> <span class="nv">ignoreip</span> <span class="o">=</span> <span class="m">127</span>.0.0.1/8 <span class="nv">bantime</span> <span class="o">=</span> <span class="m">86400</span> <span class="nv">findtime</span> <span class="o">=</span> <span class="m">600</span> <span class="nv">maxretry</span> <span class="o">=</span> <span class="m">5</span> <span class="c1">#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写</span> <span class="nv">banaction</span> <span class="o">=</span> firewallcmd-ipset <span class="nv">action</span> <span class="o">=</span> %<span class="o">(</span>action_mwl<span class="o">)</span>s <span class="o">[</span>sshd<span class="o">]</span> <span class="nv">enabled</span> <span class="o">=</span> <span class="nb">true</span> <span class="nv">filter</span> <span class="o">=</span> sshd <span class="nv">port</span> <span class="o">=</span> <span class="m">43</span> <span class="c1"># 这里的43为你修改后的端口</span> <span class="nv">action</span> <span class="o">=</span> %<span class="o">(</span>action_mwl<span class="o">)</span>s <span class="nv">logpath</span> <span class="o">=</span> /var/log/secure </pre></div> <p>上面的配置为十分钟内,如果连续错误超过5次,就ban掉这个IP。</p> <p>输入<code>systemctl start fail2ban</code>启动fail2ban。<code>fail2ban-client status sshd</code>显示fail2ban的状态,查看是否有被攻击的记录。</p> <h2>3. 禁止root用户直接登录</h2> <p>前面由于要修改、安装各种服务,因此使用root账户比较方便。但在VPS的实际使用中,首先我们要避免被坏人攻陷,直接root登录;其次我们要避免使用root用户执行危险的操作,发生意外,所以我们禁止root用户直接登录,新建一个拥有sudo权限的用户,平时使用其来登录和执行操作,减低风险。</p> <div class="highlight"><pre><span></span>useradd newone <span class="c1"># 新建名为newone的用户</span> passwd newone <span class="c1"># 设置newone的密码</span> </pre></div> <p><strong>注意!!!该步骤非常重要,否则新用户可能无法登录。</strong>输入<code>vi /etc/ssh/sshd_config</code>,使用<code>AllowUsers newone</code>添加可以ssh登录的用户,<code>systemctl restart sshd</code>重启ssh服务。</p> <p>![](./assets/CleanShot 2019-12-09 at 23.02.19@2x.png)</p> <p>修改上一步后,保留一个终端窗口,测试新用户是否能成功登录,如果能成功登录,则禁用root用户登录。<code>vi /etc/ssh/sshd_config</code>修改其中<code>PermitRootLogin yes</code>为<code>PermitRootLogin no</code>。<code>systemctl restart sshd</code>重启ssh服务。此时root账户已经无法登录。</p> <h2>4. 使用密码加 Google Authenticator 2步验证进行登录</h2> <p>比较安全的SSH登录方式,一种是禁止密码且只允许密钥登录,只要保证密钥的安全,就能保证登录的安全;而另外一种2步验证的方法了。这里我们会用到Google Authentication,其实很多网站/App已经运用到2步验证了。</p> <h3>4.1 安装Google Authenticator</h3> <div class="highlight"><pre><span></span>yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install google-authenticator </pre></div> <p>切换到要使用Google Authenticator的用户,然后输入<code>google-authenticator</code>,屏幕会显示一个超大的二维码,你需要使用支持Google Authenticator的软件,扫描该二维码或者输入“secret key”以生成动态的验证码。</p> <p>![](./assets/CleanShot 2019-12-10 at 22.48.02@2x.png)</p> <p>![](./assets/CleanShot 2019-12-10 at 22.50.11@2x.png)</p> <p>红色方框就是“secret key”,而绿色方框中是临时密码,这几个密码使用一次就会失效;后面的选择可以参考我的设置;另外,Google Authenticator会在当前用户的home目录生成<code>.google_authenticator</code>文件,如果你需要更换,删掉该文件,然后重新生成即可。</p> <h3>4.2 修改配置</h3> <p>修改pam配置文件,<code>vi /etc/pam.d/sshd</code>,在首行加入<code>auth required pam_google_authenticator.so</code>,这样子在输入密码登录之前,会先要求输入Google Authentication的验证码,如果是希望反过来,则将这行代码写入到pam配置文件的最后则可;</p> <p>修改ssh配置文件,<code>vi /etc/ssh/sshd_config</code>将<code>ChallengeResponseAuthentication no</code>修改为<code>ChallengeResponseAuthentication yes</code>。</p> <p>检查系统时间,</p> <div class="highlight"><pre><span></span><span class="c1">#查看下服务器时间</span> date <span class="c1">#如果时区不一样,再使用命令修改为本地时间</span> ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime </pre></div> <p>最后,在保留一个活动的终端窗口的前提下,重启ssh服务,<code>systemctl restart sshd</code>,然后重新登录该用户测试是否成功(登录失败也有可能是因为终端软件的问题,比如,尝试更换软件)。</p> <h2>5. 使用有密码的SSH密钥进行登录</h2> <p>其实,使用密钥进行登录已经算非常安全了,但是为了更加安全,我们还可以给密钥文件添加密码。建议在自己的常用工作电脑上使用密钥登录服务器,而在其他电脑上则保留使用密码登录的方式。</p> <p>使用密钥登录,我们会生成非对称加密的一对密钥(不清楚非对称加密是什么?看看阮一峰老师的<a href="https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html">这篇文章</a>),分别称之为“私钥”和“公钥”。如果公钥加密的信息只有私钥才能解开,那么只要私钥不泄露,通信就是安全的。</p> <blockquote> <p>(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。</p> <p>(2)甲方获取乙方的公钥,然后用它对信息加密。</p> <p>(3)乙方得到加密后的信息,用私钥解密。</p> </blockquote> <p>而我们使用密钥来进行登录也是这样,将公钥放在远程要登录的服务器上,从远程发送过来的数据,只有我们在本地的私钥才能解读,从而保证两者之间的通信是安全的。</p> <h3>5.1 生成密钥对</h3> <p>在终端输入<code>ssh-keygen</code>来生成密钥,默认会保存在<code>~/.ssh/id_rsa</code>,可以自定义该文件的地址和名称,例如<code>~/.ssh/remote_server</code>。然后会询问是否添加密钥,默认是不设置密码的,这里我输入了设定的密码。然后会生成密钥文件,其中你指定的路径就是私钥文件,而<code>.pub</code>结尾的就是公钥文件。</p> <p>![](./assets/CleanShot 2019-12-14 at 19.09.50@2x.png)</p> <p>然后在本地的<code>~/.ssh/config</code>中添加以下代码,用于指定密钥</p> <div class="highlight"><pre><span></span>Host RemoteServer <span class="c1"># 随意自己起,但是要用到</span> HostName <span class="m">102</span>.133.250.111 <span class="c1"># 修改为服务器的地址,域名或IP</span> User newone <span class="c1"># 指定登录的用户</span> PreferredAuthentications publickey IdentityFile ~/.ssh/remote_server <span class="c1"># 指定私钥的地址</span> Port <span class="m">43</span> <span class="c1"># 默认端口为22,如果你修改了端口,则修改为对应的端口</span> </pre></div> <h3>5.2 将公钥存放到目标服务器上</h3> <p>打开目标服务器的目标用户的<code>~/.ssh</code>路径,然后将<code>.ssh/remote_server.pub</code>文件的内容复制到<code>~/.ssh/authorized_keys</code>里,如果没有<code>~/.ssh</code>文件夹则参考以下代码,先localhost登录一次。</p> <div class="highlight"><pre><span></span>$ ssh localhost <span class="c1"># 输入密码登录</span> The authenticity of host <span class="s1">&#39;localhost (::1)&#39;</span> can<span class="s1">&#39;t be established.</span> <span class="s1">ECDSA key fingerprint is SHA256:DYd7538oOsqpIIDTs01C3G4S6PRE7msA91yUgk9Dzxk.</span> <span class="s1">ECDSA key fingerprint is MD5:88:80:21:03:b2:52:6b:06:ff:c7:3b:d5:2d:47:c9:ad.</span> <span class="s1">Are you sure you want to continue connecting (yes/no)? yes</span> <span class="s1">Warning: Permanently added &#39;</span>localhost<span class="s1">&#39; (ECDSA) to the list of known hosts.</span> <span class="s1">newone@localhost&#39;</span>s password: Last login: Sat Dec <span class="m">14</span> <span class="m">19</span>:49:07 <span class="m">2019</span> from localhost $ <span class="nb">exit</span> </pre></div> <p>登录过后就会生成<code>~/.ssh</code>文件夹了。注意<code>~/.ssh</code>目录权限必须为700,<code>~/.ssh/authorized_keys</code>权限必须为600。</p> <h3>5.3 修改配置文件</h3> <p>又来到熟悉的配置文件,输入<code>vi /etc/ssh/sshd_config</code>,将该文件添加以下3行,如果已有则改成一样的。</p> <div class="highlight"><pre><span></span>RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys </pre></div> <p>然后<code>systemctl restart sshd</code>重启ssh服务。</p> <p>在本地使用类似<code>ssh newone@RemoteServer</code>的命令进行登录,如果登录成功则说明设置生效了。</p> <p>至此,我们所希望的5个目标已经完全实现了。</p> <h2>Reference</h2> <ul> <li><a href="https://juejin.im/post/5c8bba80e51d4562cd767dfe">Centos7 修改 SSH 端口 - 掘金</a></li> <li><a href="https://www.xiaoz.me/archives/9831">CentOS 7 安装 fail2ban + Firewalld 防止爆破与 CC 攻击 - 小 z 博客</a></li> <li><a href="https://www.abcode.club/archives/230">CentOS 7 中添加一个 sudo 新用户并授权 ssh 登录 | happysir's blog</a></li> <li><a href="https://www.moerats.com/archives/928/">Linux VPS 安装 Google Authenticator 实现 SSH 登陆二次验证</a></li> <li><a href="https://www.cnblogs.com/luckyall/p/10368152.html">Centos7 通过 SSH 使用密钥实现免密登录</a></li> </ul> <section class="footnotes"> <ol> <li id="fn-1"><p>1台独立服务器开出来的多台虚拟机,叫作小鸡<a href="#fnref-1" class="footnote">&#8617;</a></p></li> </ol> </section> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/VPS_No1_SSH/Sat, 14 Dec 2019 20:07:00 +08062019 年终总结https://zhengzexin.com/archives/Summary_of_2019/<blockquote> <p>“听到一个段子:2019 年可能会是过去十年里最差的一年,但却是未来十年里最好的一年。” ——美团 王兴</p> </blockquote> <p><figure style="flex: 124.5136186770428" ><img width="640" height="257" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/e8718ce1f6ebc4234570a131a79ae974.png" /><figcaption>图1. 美团王兴:2019年,是未来十年最好的一年</figcaption></figure></p> <p>好像离18年年终总结,才没过几个月的时间,19年就悄然结束了。相比上一年,今年做出了很多第一次的尝试,因此也多了很多跟其他同龄人的交流,收获了不少大家处于相似阶段的体会。</p> <h2>工作</h2> <p>去年年底裸辞,就连社保都断交了,过年后,在面试了好几家公司后,挑选了一个符合自己意愿的offer,继续从事NGS的生物信息学数据分析的工作,不过相比以前,反而专注生物信息学和程序本身,有和团队一起开发生信的软件,也有捡起HTML+CSS+JavaScript来开发工具。</p> <p>若论影响最大的,莫过于机器学习。以前我对于机器学习只处于稍微读过公众号的阶段,觉得机器学习在目前的生活和工作中用不上,而且深度学习需要的成本也颇高,对于个人,是没有条件去学习或者实践的。机缘巧合的条件下,今年更加深入地了解机器学习,同时由于自己也在学习各种算法,对我造成的震撼还是很大的。我认为机器学习,不需要牵涉到大数据那么高的层面,反而是一类新的算法,用于辅助人们在有限的成本下,找到近似最优解。</p> <h2>学习</h2> <p>今年,给自己定了许多学习计划,有一些还未完成;有成就感的是,将北京大学的《生物信息学导论》重新刷了一遍。在我刚毕业那会,其实就看过一次,但是当时刚入行,里面有很多不会用到的、太过深奥的,自己就跳过了,所以今年才要求自己完完全全重新学习一遍。我是在Coursera上学习的,在ipad上缓存好,然后就在通勤的时间里一点一点看完。</p> <p><figure style="flex: 91.44908616187989" ><img width="2802" height="1532" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/6c2ead337518a9aa39e9c8e33ecffd9e.png" /><figcaption>图2. 北京大学-生物信息学导论</figcaption></figure></p> <h2>消费</h2> <p>2019年的消费,依旧是一些订阅服务,费用与去年差不多。强力推荐Office 365的订阅,1T的Onedrive存储,真的很好用!</p> <p><figure style="flex: 81.33802816901408" ><img width="1848" height="1136" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/b5cd1c75a48ed8a93f30e7b935cdc192.png" /><figcaption>图3. Bobby 的订阅统计</figcaption></figure></p> <ul> <li>终于购入了年轻人的第一台macbook pro,生产力,不需要解释;</li> <li>iPad Pro 10.5寸 + Apple Pencil,我在通勤路上,看了很多视频教程,也用MarginNote来看文献;</li> <li>雅马哈 F600,学了一首生日歌唱给女友听,不过目前闲置ing🤦‍♂️</li> </ul> <h2>输出</h2> <p>今年博客较去年多更了一些,总共7篇日志,还是不理想。不过今年发的大部分都是较长的一些经验记录,所以也不算水,还要督促自己,有什么好的想法,就要及时记录,不要拖延到忘记。</p> <p>博客的阅读量相比上年,其实是差不多的;今年尝试过重新用Typecho来搭建博客,感觉还不错;现在则是Github Page + Maverick来生成静态博客,希望来年能多输出有价值的文章给大家。</p> <p><figure style="flex: 95.24590163934427" ><img width="1162" height="610" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/1667f9243e0037627a302606c83222de.png" /><figcaption>图4. Google Analytics 的统计</figcaption></figure></p> <h2>生活</h2> <p>今年搬了一次家,换了一个更好的环境,虽然通勤时间长了些,却也正好我可以沿途听听播客、看看视频。</p> <p>今年还试过去野餐,铺上一张野餐布,躺在上面吃点心,2个人一起玩switch,原来在大城市里还有那么闲暇的下午时光。</p> <h2>2020</h2> <blockquote> <p>最后,这几天我常常在想, 这个十年只剩下了最后一个月,二十一世纪 10 年代马上就要过去了,这个十年期我到底做了哪些事情,达到了十年前我对自己的期望吗。 ——科技爱好者周刊:第 83 期(20191122)</p> </blockquote> <p>前几天,在V2EX,看到这篇<a href="https://iwenson.com/2010-2020-lost-golden-decade/">2010-2020 我错过的黄金十年</a>,如果有什么新兴的事物,你想去做,就抓紧时间去做,10年里新兴的事物太多,你能赶上抓住的太少。</p> <p>2020年的目标,</p> <ul> <li>用Python写一个包,开源在Github上</li> <li>从头到尾地看完几本书,并做好笔记</li> <li>掌握R等语言</li> <li>养成锻炼的习惯,减掉一身的肥肉</li> </ul> <p>前几天和同事吃饭才说起,以前过年时,试过大年三十晚上出门给我爸找手机充值,那时候还没有支付宝充值这些,大家过年也是互相发短信祝福。其实现在想想,也就是几年前的事,但是智能手机和移动支付的时代来得是如此迅猛;十年后,2029年时我写的年终总结会是什么样。。。。。。</p> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/Summary_of_2019/Tue, 31 Dec 2019 18:00:00 +0806VPS装机记录(2):使用moshhttps://zhengzexin.com/archives/VPS_No2_mosh/<p>家里的网络有点差,之前买的VPS,直接连接SSH,输命令时有时卡卡的,于是就想到之前看到过的<a href="https://mosh.org/"><code>mosh</code></a>。引用维基百科的话来介绍一下<code>mosh</code>的特性。</p> <blockquote> <p><code>mosh</code>不绑定使用者端的 IP address,这使得使用者从移动网络(像是 3G、4G)与 WiFi 之间切换时,不会造成连线中断。 <code>mosh</code>保持连线开启,当此用者断线时,服务器端只会认定为暂时离线(sleep)让使用者可以稍候连回来。相对的,SSH 因为透过 TCP,在使用者断线时会造成连线中断。 <code>mosh</code>会试着在本地端马上显示使用者所输入的按键,这使得使用者会感觉到更少的延迟。</p> </blockquote> <h2>CentOS安装mosh</h2> <p>CentOS安装mosh比较简单,使用<code>yum install mosh</code>就可以。如果你提示错误,参考Reference里的文章,可能需要先添加源。</p> <p>另外,如果你之前参考我的文章,服务器的防火墙关闭了多余的端口,那么这时候就要手动打开端口。</p> <p>因为<code>mosh</code>默认是走UDP协议的,然后默认使用的端口是<code>60000-61000</code>,第一个连接时用的是60000,第二个连接使用的就是60001,以此类推。当然,你也可以手动指定。</p> <div class="highlight"><pre><span></span>firewall-cmd --zone<span class="o">=</span>public --add-port<span class="o">=</span><span class="m">60000</span>/udp --permanent <span class="c1"># firewall添加你选择的ssh端口,--permanent是保存设置,否则下次重启后不生效</span> systemctl start firewalld <span class="c1"># 若firewall未启动,则先启动</span> firewall-cmd --reload <span class="c1"># 重新加载firewall</span> firewall-cmd --zone<span class="o">=</span>public --query-port<span class="o">=</span><span class="m">60000</span>/udp <span class="c1"># 查看端口是否添加成功,yes表示成功,no表示未添加成功</span> </pre></div> <p>使用管理员权限执行上面的命令,打开防火墙的端口就可以了,不要相信网上某些文章,将整个防火墙都关掉那种,简直饮鸩止渴。</p> <h2>Mac使用mosh连接服务器</h2> <p>macOS默认是没有安装mosh的,类似于ssh,我们需要mosh连接,要首先安装好mosh,在mac下直接用brew安装。</p> <div class="highlight"><pre><span></span>brew update <span class="c1"># 可以不更新</span> brew install mosh </pre></div> <p>如果没有修改过服务器的ssh端口,直接以下命令就可以连接;如果参考我的文章,修改过服务器的ssh默认端口的,参考第二条命令来连接;如果你连防火墙的udp端口也修改了,那么参考第三条命令,指定mosh走的udp端口。</p> <div class="highlight"><pre><span></span>mosh username@server_ip <span class="c1"># 默认情况下的命令</span> mosh username@server_ip --ssh<span class="o">=</span><span class="s2">&quot;ssh -p 245&quot;</span> <span class="c1"># 修改ssh端口为你设置的端口</span> mosh username@server_ip -P <span class="m">60011</span> <span class="c1"># -P 指定mosh走的udp端口,如果你只打开了某个udp端口的话</span> </pre></div> <h2>Win使用mosh连接服务器</h2> <p><figure style="flex: 95.77464788732394" ><img width="1360" height="710" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/6488cc29c807dbcfb38dbc1b97ee3517.png" /></figure></p> <p>Win下我习惯使用<a href="">Termius</a>来登录mosh连接,当然如果你有其他终端软件也可以,如图将mosh的开关打开,然后填入你自己定义的SSH端口,如2222;填入用户名和密码,保存即可。</p> <h2>后言</h2> <p>mosh有其优点,比如对ssh支持很好,安全性也很好;但是也有一些缺点,比如只能刷新一个屏幕,如果你的运行结果超出一个屏幕,无法滚动看回,只能用<code>less</code>来捕获来看了。</p> <p>另外,我查看mosh的官网,发现mosh在很多不同的平台,都有支持,所以真的很优秀。</p> <p><figure style="flex: 40.78116025272832" ><img width="2840" height="3482" src="https://cdn.jsdelivr.net/gh/ryuzheng/static-Blog@gh-pages/archives/assets/56c0a5a0b5128ab92608c37f6da50e0d.png" /></figure></p> <h2>Reference</h2> <ul> <li><a href="https://juejin.im/post/5d654f716fb9a06acf2b6af0">ssh卡顿还经常掉线?试下mosh吧! - 掘金</a></li> <li><a href="https://www.jianshu.com/p/8e9940ac64d4">centos7安装mosh - 简书</a></li> </ul> ryu@zhengzexin.com (ryuzheng)https://zhengzexin.com/archives/VPS_No2_mosh/Thu, 16 Apr 2020 22:43:03 +0806