Windows 上的工具清单

但弄雕虫之技,尘芥草莽,于泥泞自勉……

开发

MS VSCode:前端标准 IDE

[便携版], [开源], [跨平台], [免费]

具体可以参考:官网, GitHub, GitBook 中文介绍

MS VSCode 是微软出品的一个跨平台,基于 Web 的,免费的开源文本编辑器。目前已经使用了半年多了,对其的了解也更加深入。就目前看来,VSCode 应该是前端生态最好的 IDE 了。作为一个文本编辑器,大多数的文本文件都有语法支持的扩展真的太棒了,这点要强过专门的 IDE。

主要优点:

  • 开箱即用:基本上下载完就能开始使用了,不需要太多自定义的配置
  • 多语言支持:这是很多文本编辑器/IDE 都没有做到的,例如下面吾辈最喜欢的 IDEA 到目前为止官方仍然只支持英文,但吾辈觉得本土化之后才能对萌新更加友好(门槛低,学习曲线平缓)
  • 插件丰富:目前吾辈使用 VSCode 主要用于前端,编辑 Markdown 文章,一些系统/程序的配置文件等,安装了插件之后使用对各种功能的支持还算不错。

缺点:

很明显,MS 的东西最后会不会变成全家桶/流氓谁也不清楚,虽然去年貌似 MS 在 GitHub 上的贡献量超过了 Google,但想想 MS 的开源黑历史。。。而且,作为一个专门的编程编辑器,有许多的细节上还是很粗糙(貌似开源项目的通病),相比于专业的 IDE(例如 WebStorm)还是相差不少。
下面举一些例子

  • 本地文件历史: 没有加入到 Git 管理中的文件丢失,血与泪的教训啊
  • 单词检查: 英文单词写错了还不知道,萌萌哒!
  • 代码跳转功能很弱: 专业 IDE 里几乎所有有关连的东西都是可以跳转的。例如在 CSS 中查看使用 class 的引用列表,在 HTML 中跳转到 CSS 的 class 定义处,HTML 中有代码提示 CSS 类。JS 中查看函数的引用列表,查看函数的定义处,查看函数的实现(老实说 VSCode 基于 ts 实现的代码提示感觉真是在下一盘大棋。。。)
  • Git 支持: VSCode 中 Git 支持还不成熟,并没有像 IDE 中那么方便与强大
  • HTML 标签修改的时候没有自动修改对应的标签: 纯粹是细节性问题
  • TODO 支持: 对 TODO 标签没有支持

常用的 Plugin

VSCode Settings

Google Chrome:最好的浏览器

[部分开源], [跨平台], [免费]

官网, Google Chromium 各版本下载

非常有名的浏览器,来源于 Google,在 PC 上不管是用于开发还是日常使用都能够满足需求。相比于国内的流氓而言非常干净简洁(至少,看起来而言),相比于 FireFox 来说更快,插件体系也已经足够庞大完整,基本上想要的都有了。

常用的 Plugin:

  • AutoPagerize:自动翻页插件,浏览很多网站时不需要手动点击下一页了,可以自动加载出来下一页的结果。
  • Checker Plus for Gmail™:对于日常使用 Gmail 的吾辈而言非常有用
  • crxMouse Chrome™ 手势:鼠标手势插件,可以使用手势更简单地完成一些事情
  • Dark Reader:为所有网站加上黑色主题,大部分情况下都还不错
  • Enhanced Github:显示 GitHub Repository 大小,允许单独下载每一个文件
  • Enhancer for YouTube™:怎么说呢,Youtube 已经很好了,但吾辈还是觉得需要这个插件来优化播放体验
  • Fatkun 图片批量下载:批量下载网页上的图片,偶尔用一下吧
  • Free Download Manager:FDM Chrome 集成插件,将 Chrome 下载链接使用 FDM 多线程下载
  • GitHub Hovercard:GitHub 增强插件,鼠标悬浮在仓库链接上面就可以预览
  • Image Search Options:使用右键以图搜图
  • Isometric Contributions:GitHub 美化插件,将 GitHub 贡献以 3D 的效果显示出来
  • JetBrains IDE Support:使用 Chrome 实时显示 IDEA 的 HTML/CSS/JavaScript 文件,与 IDEA 的插件配合使用
  • LastPass: Free Password Manager:跨平台的免费密码管理器,有了这个之后再也不用所有网站都使用同一个密码了
  • Mailto: for Gmail™:对于 mailto 协议的链接以 Gmail 网页版打开
  • Markdown Here:在线将 Markdown 转换为有格式的文档,例如在一个普通的富文本编辑器(不支持 Markdown)中,可以先用 Markdown 语法写内容,然后转换一下就得到了有样式的内容了。
  • Neat URL:移除网址中的无用段,例如返利链接后面的参数
  • Octotree:GitHub 代码树状图插件,方便查看项目文件
  • OwO:颜文字插件,多亏了这个让吾辈能够愉快的刷推了
  • Proxy SwitchyOmega:科学上网必需
  • Stylus:使用自定义网站样式的插件,比 Stylish 的名声好一些
  • Tabliss:新标签页插件
  • Tampermonkey:使用自定义网站脚本的插件,可以使用各种 user.js 脚本,相当于小型的插件管理器了
  • The Great Suspender:自动休眠标签页,避免 Chrome 使用的内存太过庞大
  • uBlock Origin:日常上网必须,屏蔽各种广告,比 Adblock 的名声好一些
  • Vue.js devtools:在 DevTool 中添加 Vuejs 选项卡,便于对 Vuejs 进行调试
  • WebRTC Network Limiter:阻止浏览器通过 WebRTC 泄露 IP 地址
  • WEB 前端助手(FeHelper):貌似是百度的前端插件,但目前还没有什么流氓行为
  • 快翻译:这个翻译插件是真心不错,某种意义上讲比 Chrome 自带的翻译都要好(#大雾)
  • 扩展管理器(Extension Manager):插件很少的时候还好,一多起来还是需要一个插件进行管理,快速启用和禁用一些插件,根据场景切换启用插件列表

Chrome 虽然已经很完美了,但 Google 却并非如此,最近 Chrome 开始变得越来越封闭了。首先是 Chrome 应用被删除,现在又禁止安装非官方商店中的第三方插件(目前仍可以通过开发者模式安装),真心越来越麻烦了。

附:这里提供一个快捷安装第三方插件的工具 Chrome 插件伴侣,方便解决 Chrome67 之后安装非商店插件的麻烦

IDEA:最好的 Java IDE

[便携版], [部分开源], [跨平台]

官网, GitHub 社区版
强烈建议升级至 2019.2.3,官方终于把智障的重构字符串查找引用默认关闭了,可喜可贺,可喜可贺

虽然说起最好的 IDE 什么的肯定是各种争论,但吾辈还是想说,在 Java 语言开发方面,IDEA 是目前最好的 IDE 了。

优点:

  • 智能提示
    IDEA 在代码提示方面真的是无可比拟(相比于 Eclipse 来说),通常在还没有打完全部代码的时候,IDEA 就知道想要做什么了,然后给吾辈最常用的提示。并且,对于某些不太好的代码,IDEA 会提出一些建议甚至帮助进行安全的重构。一般而言吾辈认为,如果 IDEA 认为代码有问题,那么一般真的是代码有问题(确实有些情况下也不尽如此)
  • 开箱即用
    虽然很不起眼,但这确实很重要。当下载完 IDEA 之后,几乎不需要安装什么插件,进行繁复的配置,就能开始工作了!因为 IDEA 帮我们准备好了绝大多数情况所需要的插件,很多配置也都有着良好的默认值。
  • 插件系统
    或许 IDEA 的插件数量比不上 Eclipse,但 IDEA 的插件系统确实已经很完善了,至少,对于吾辈而言已然足够了。
  • 界面很棒
    其实这个就是吸引吾辈入坑 IDEA 的原因之一,毕竟曾经其他人都在用着 Eclipse 的时候,吾辈看到了 IDEA 的黑色主题就被吸引了,然后到现在成了 IDEA 的死忠粉。
  • 搜索功能
    非常强大的搜索功能,可以搜索类,文件,字段,以及全文搜索,包括正则表达式,文件后缀名等过滤功能。
  • 调试
    或许有人说,现代的 IDE 基本上都有调试功能吧。但 IDEA 是不同的,它可以同时调试 Java 与 JavaScirpt 以及其他所集成的语言,这可真是强大无比。使用 JavaScript 发送一个请求,然后进入后台代码调试,得到 SQL 语句,去查询数据库,而这一切,都是在 IDEA 内部完成的!
  • 语言注入
    这是 IDEA 比较高级的部分了,但这也是一个相当强大的功能。例如,有时候我们不得不手写 SQL 语句,或者在 JavaScript 中拼接 HTML 代码。难道我们必须要去对应的文件中编辑完之后复制过来么?不不不,语言注入就是可以为某一个代码片段注入为某一种语言,例如你可以为 Java 中的字符串注入 SQL 语言。在字符串中,你写 SQL 语句就有提示了!

    当然,语言注入也是要符合基本法的,必须是 IDEA 支持的语言才行,不过 IDEA 对主流语言的支持都还不错。

缺点:

  • 硬件杀手
    IDEA 是出了名的吃内存(日常),吃磁盘(扫描项目建立索引)以及 CPU(索引)。
  • 小病不断
    虽然 IDEA 很是强大,但各种小问题也是层出不穷。例如自定义的 Maven 到了新的项目就变成默认的了。。。

常用的 Plugin:

  • Jrebel:做 Java Web 开发时真心免不了的 Plugin,能够有效解决 Web 容器(例如 Apache Tomcat)启动速度慢的问题(因为几乎所有的资源都能够热加载,热部署)。
  • LiveEdit:提供了 HTML/CSS/JavaScript 的实时预览和刷新功能。
  • MybatisX:Mybatis 的一个辅助开发插件,能够比较愉快的使用 Mybatis 框架了
  • Alibaba Java Coding Guidelines:Alibaba 出品的一个 Java 规范检查插件,能够规避一些不好的代码。
  • Translation:目前使用感觉最好的翻译插件,能够提供比较长的内容进行翻译(某些翻译插件只能翻译很短的内容)。
  • String Manipulation:字符串操作工具,可以方便对变量名或其他字符串修改为其他风格,例如将变量从 驼峰命名(Java 标准命名) 修改为 下划线命名(SQL 标准命名)或者 中缀线命名(HTML/CSS 标准命名)。

    其实这么多命名规范真心坑。。。

  • Custom Postfix Templates:提供自定义的后缀模板
  • GsonFormat:格式化 json 数据并转换为 Java 中的 POJO,其实对于吾辈而言主要是用来写爬虫时生成 json 数据对应的实体类
  • Markdown Navigator:IDEA 平台的 Markdown 写作插件,比自带的 Markdown Support 要好很多,主要在需要写的 Markdown 内容中含有代码时比较方便。
  • Maven Helper:一个 Apache Maven 的辅助操作插件
  • CodeGlance:在编辑器右侧显示一块代码缩略图,主要为了方便使用滑块进行上下滑动
  • Grep Console:自定义控制台的输出颜色
  • .ignore:在使用版本控制时,快速忽略某些文件/文件夹,目前支持广泛
  • CMD support:Cmd 支持,主要是方便在 IDEA 中直接运行 bat 脚本
  • NodeJS:集成了 NodeJS,可以直接在 IDEA 中运行 NodeJS
  • Vue.js:集成 Vue.js 框架
  • Properties to YAML Converter:将 Properties 文件快速转换为 YAML 格式的配置文件
  • WakaTime:统计使用的编程语言,不同 IDE 的记录。官网

入门推荐教程(简体中文):https://github.com/judasn/IntelliJ-IDEA-Tutorial

drawio:开源免费的画图工具

[便携版], [开源], [免费],[跨平台]

官网, GitHub

目前能找到的最好的免费开源的画图解决方案,能够制作流程图、UML 图、组织结构图、泳道图等绘图。允许导出为图片/HTML/PDF 等各种格式,全平台免费可用的解决方案。

ProcessOn 是一个更加本地化的解决方案,并且添加了思维导图支持,只允许在线编辑导致了数据的最终权力不在自己手上,强制收费则让(小)团队使用成为一件可望而不可及的事情。
注:此处不是故意黑 ProcessOn,因为吾辈也是它的付费用户,但在团队内推广使用确实会存在一些问题。

Cmder:Windows 上模拟 Linux 终端

[便携版], [开源], [免费]

官网, GitHub

曾经有段时间吾辈也很迷信 Linux,觉得 Linux 适合开发者使用(事实上确实如此),但后来还是因为电脑的硬件原因(驱动问题,莫名其妙的卡死在登录页面)而回到了 Windows。而最让人念念不忘的就是 Linux Bash 终端了,相比于 Windows 自带的 Cmd/PowerShell 来说漂亮/强大了许多。当然,Windows 相比于 Linux 的最大优点就是稳定(不怕折腾,很难损坏系统本身)以及可视化(大部分的设计都有可视化界面进行配置)。然而有时候还是不得不使用命令行,而这时便显示出 Windows 的不足了,直到后来吾辈在偶然的机会碰到了 Cmder,发现了 Windows 上果然已经有了解决方案。

Cmder 是一个在 Windows 上模拟 Linux Bash 的终端模拟器,其实对于吾辈而言,主要是因为 Cmder 比较漂亮,集成了很多组件(例如 Git, SSH, Curl, Less, vim),而且还能在上面安装 Windows 下的包管理系统 Chocolatey。安装了包管理器之后就能直接使用 choco command options 命令安装软件了。

具体方法可以参考另外一篇文章:Windows 下 Cmder 安装 Chocolatey

Git:Git 版本控制系统

[便携版], [开源], [跨平台], [免费]

官网, GitHub

最初由 Linus 开发的一个分布式的版本控制系统,现在已经是最流行的版本控制系统之一了。说到 Git 不得不提 GitHub,GitHub 为 Git 实现了一个在线代码(或者其他)托管平台,相当好用而且托管开源项目是免费的。其实对于吾辈而言 Git 只是一个用于在本地操作 GitHub 的客户端罢了(很少有添加到 Git 而没有提交到 GitHub 的代码)。正是因为 GitHub 对 Git 的支持之好,所以吾辈才喜欢使用 Git 的。。。(#因果颠倒)

Termius:简单漂亮的 SSH 连接工具

[跨平台]

官网

非常漂亮的一个远程连接工具,免费版本仅支持 SSH 连接,而 SFTP 则是收费版本的功能,吾辈作为前端感觉算是足够了。

更强大的远程连接工具:Mobaxterm,功能非常强大但界面复古(Win7 时代的风格)。

HeidiSQL:SQL 客户端

[便携版], [开源], [免费]

官网, GitHub

一个支持 MSSQL,MySQL 和 PostgreSQL 的开源数据库轻量级客户端。吾辈使用这个 SQL 客户端最重要的原因就是满足了吾辈对于数据库文件的导入/导出需求,谁让 IDEA 自带的 DataGrip 没有导出功能呢

附:吾辈很清楚 MySQL 有自带的导出命令,然而并不灵活。。。至少这个能够定义创建数据表,插入数据时使用的策略

freeFTPd:免费的 FTP/SFTP 服务端

[开源], [免费]

官网

开源免费的 FTP/SFTP 服务端,非常适合在开发过程中模拟 FTP/SFTP 服务端使用。而且相比于 FileZilla 更加简单,也不会从一开始就出现错误需要解决。


日常

Win + R:快速启动

虽说 Windows 上也有快速启动工具,但 Windows 原生的快速启动已然足够使用了。将快捷方式命名为一个简单的名字,例如将 Google Chrome 命名为 GC,然后丢到当前用户目录下,然后使用 Win + R 弹出运行窗口,然后输入 GC,系统就会启动 Google Chrome 了。

当然,更好的方法是新建一个目录保存这些快速启动的快捷方式,然后将目录添加到环境变量中即可(Path)。

SSR:正常上网必须

[便携版], [开源], [跨平台], [免费]

GitHub

为了正常浏览网络折腾与支付一些代价都是微不足道的,貌似比 ShadowScoks 要稳定一点,不过据传闻作者最初并未打算将其开源。

MacType:字体美化

[开源], [免费]

官网, GitHub

Windows 上的字体就是会出现锯齿(所谓的点阵字体真是坑),不过 MacType 可以缓解这一现象。它可以美化 Windows 对字体的渲染(绝大部分程序都不会出现问题),让吾辈在使用 Windows 的时候看着代码更舒服一点。

附: MacType 配置推荐 注册表加载 + Iof => XHei => Default
附:字体个人推荐 Sarasa-Gothic,中文名是更纱黑体,包含 英/简中/繁中/日 四种语言

Joplin:适合开发者的笔记工具

[便携版], [开源], [跨平台], [免费]

官网, GitHub

一个开源跨平台的笔记工具,使用的模式是本地程序 + 第三方服务同步的方式,编辑功能算是比较弱的,同步也不算是最好的,甚至于客户端也不算是最漂亮的。但是,它有一些非常显著的优点,甚至足以压倒以上的缺点。

主要优点:

  1. 搜索很快,非常快
  2. 可以使用外部编辑器打开
  3. 数据都在自己手里,提供一次性导出全部的功能
  4. 使用标准的 md,可以直接复制到其他平台
  5. 可以基于它进行二次开发

主要缺点:

  1. ui/ux 有点简陋
  2. 没有 vsc 插件导致使用外部编辑器也并不是非常方便

之前吾辈使用过 OneNote 和 Notion,两者都是非常好的笔记工具,但两者存在的一些缺点导致吾辈在使用一段时间后选择了放弃。

  • OneNote:主要问题是需要自己调整文本格式,不支持 markdown,以及富文本带来的分享问题。
  • Notion:主要问题是编辑体验不好,搜索非常慢,以及非标准 markdown 导致的分享问题。可以参考 Notion 使用体验

FDM:免费的多线程下载器

[免费]

官网

全称 Free Download Manager,没什么太多好说的,但用起来还算不错,不会弹个窗口提示下载什么的,然而下载完成也没提示真的坑。。。

基本上满足吾辈日常的下载需求吧

  • 提供客户端界面
  • 多线程
  • 集成 chrome
  • 静默下载
  • 下载后可以打开文件/文件夹
  • 下载完成后没有弹窗提示
  • 便携版(配置可携带化)

Bandizip:压缩/解压缩

[便携版], [免费]

官网

目前吾辈觉得最好的压缩/解压缩软件,具体压缩率/支持格式什么的吾辈也并非专业所以就不说了。但就使用体验上看 Bandizip 是要明显优于其他同类软件的(WinRAR, 7Zip)。

吾辈看到的优点:

  • 预览压缩文件时左侧有文件夹树状列表,不需要再用鼠标点击进进出出的活塞运动了
  • 自动解压,这个功能相当棒,可以智能解压压缩文件到文件夹中(如果压缩包里面只有一个文件夹就直接解压出来,否则会将压缩包里面的内容解压到一个与压缩包同名的文件夹中),这个功能看起来很不起眼,但吾辈在此之前并未找到(需要特别注意压缩包的内容)

Ditto:剪切板增强

[便携版], [免费]

官网, 善用佳软评测

Windows 剪切板增强工具,不得不说 Windows 上的工具确实很多。即使一个功能 Windows 本身支持的不好,然而总有其他的工具对其增强就是了。善用佳软评测 对其的介绍很全面,这里也就无需赘述了,吾辈需要的只是它的剪切板历史功能。

JPEGView:图片浏览

[便携版], [免费]

官网

简单而且好用的图片查看器,相比于吾辈之前使用的 ImageView(中文名是 快眼看图王)更快,相比于 HoneyView 更见简洁和易操作。

主要优点如下:

  • 操作简单:滚轮缩放,按住移动,ESC 关闭,Left/Right 查看上/下张图片
  • 性能很高:实测打开速度比 imageview/honeyview 都要更快

借用知乎网友理想中的图片查看器需求图

理想中的图片查看器

Everything:文件快速搜索

[便携版], [免费]

官网

用过 Windows Explorer(文件管理器)搜索文件的人都知道速度是有多慢,有了 Everything 之后这一切都是往事了。Everything 建立了全盘索引,可以对文件/文件夹进行实时搜索,速度之快简直和默认的文件管理器有天壤之别。当然,也能够根据正则表达式/类型进行高级查询。

Snipaste:截图/贴图

[便携版], [免费]

官网, GitHub, GitBook 中文教程

很漂亮,很漂亮,很漂亮!重要的话说三遍,Snipaste 相比于其他的截图软件(FSCapture)在使用时感觉漂亮了很多,而且在使用时会方便很多(截图完成后直接就进行编辑,而不是跳转到编辑器中编辑截图),保存时自动保存并且复制到剪切板也很方便。总而言之就是细节做的相当棒!

PicGo:图床上传

[开源], [跨平台], [免费]

官网, GitHub

使用 Markdown 写作必备的图床工具,解决了吾辈关于 GitHub 图床的几个痛点。

  • 上传之前重命名
  • 上传一键就好
  • 上传后图片管理

ScreenToGif:录制 GIF 动态图

[便携版], [开源], [免费]

官网, GitHub

虽然吾辈已经有了截图工具,但某些时候单靠截图并不能很好的表达意思,这时候就需要使用 Gif 去记录一系列的操作。这也是 ScreenToGif 的主要功能,将记录转换成 Gif 动态图。

嘛,虽然就使用上吾辈觉得还是有一些不便:

  • 吸附窗口操作不太直观
  • 保存时不能直接一键保存到指定目录并复制到剪切板

不过这也是目前吾辈能找到的比较好用的一个了

QuickLook:文件管理器预览增强

[便携版], [开源], [免费]

官网, GitHub

Windows Explorer 预览功能增强,支持很多种格式的文件/文件夹进行预览,包括但不限于文本、图像、视频、音频、压缩包、文件夹等。在按下空格时,就弹出一个预览窗口,感觉还是不错的。

Steam:国外的游戏平台

[跨平台], [免费]

官网

来自于金三胖出品的非常著名的游戏平台,非常之多的游戏在该平台上发售。Steam 提供了非常多的支付方式,对国内用户相当友好(支付宝/微信/银联)。吾辈个人是只玩 Galgame 的,所以能入正支持到做 Galgame 的公司表示还是很开心的。
唉,不过 Steam 也没能逃过魔掌呢。。。steam 落户上海浦东,吾辈表示转区势在必得了!

附:Steam 上没有什么盗版游戏,所以想免费玩游戏的人就不用抱有什么幻想了

Mozilla FireFox:抱有期待的浏览器

[开源], [跨平台], [免费]

官网, GitHub

FireFox 是一个将 IE 拉下神坛的浏览器,一个开源的注重隐私的浏览器,但现在,它已然有些没落了。尤其是最近的 FireFox57 后为了提升性能更新了浏览器的整体架构,导致旧的扩展基本全部失效,恢复曾经的附加扩展生态却又不知道需要多久了。但是,这些问题,相比于隐私(信息收集)与自由(不限制扩展)来说,还是值得考虑一下的,确实挺期待 FireFox 之后发展的。

相比于其他的浏览器最大的特点就是隐私性和自由,收集隐私是完全可选的(国内的流氓浏览器信息收集简直过分),附加扩展基本不怎么限制(Chrome 限制扩展只能从官方商店直接安装)。

补充:

  • 2019-06-18: 现在 Chrome 居然限制 uBlock Origin 这类的扩展了。。。

AIMP:本地音乐播放器

[免費]

官网

一个非常漂亮的本地音乐播放器,貌似对歌曲音质的支持也很好(没什么感触,不玩耳机的萌新一只)。。。

PotPlayer:视频播放器

[便携版], [免费]

官网

非常强大/漂亮的本地视频播放器,虽然也可以播放 URL 的视频资源,但主要还是播放本地视频,支持大多数常见格式而且对于 1080P 之上的画质支持非常棒!

qBittorrent:BT 下载

[免费]

官网

不错的 BT 客户端,相比于大名鼎鼎的比特彗星,它没有广告,没有等级。对于热门种子的下载速度十分喜人,最高可以跑到 10M 左右,比特彗星永远没有跑到这么高过。。。

Dism++:Windows 的一个集中式的系统管理工具

[便携版], [免费]

官网, GitHub

一个集中式管理 Windows 各种设置的 GUI 控制面板,能够方便的控制系统的各种设置(包括 Windows 10 的更新。。。),提供了一个简单但却还算可以的垃圾清理工具,感觉上很干净而且可以独立运行!

TreeSizeFree:以树状视图查看文件夹

[便携版], [免费]

官网

用来以树状结构查看文件夹大小的工具,可以知道到底是哪些文件占用了硬盘及其大小。

renamer:文件/文件夹重命名

[便携版], [免费]

官网

或许很多人想吐槽,重命名不就一个 F2 的事情么?是的,如果只需要重命名一个文件,F2 是最快捷的方式。但 rename 针对的是需要重命名数十,数百个文件的情况,这种时候手动重命名实在太过于糟糕了点!

waifu2x-caffe:图片清晰化

[便携版], [免费], [开源], [跨平台]

官网, GitHub, GitHub Windows

可以让图片变得清晰,具体技术实现涉及机器学习等尖端技术(#dalao),可以说是很厉害了呢

Bandicam:视频录制

官网

还算好用的视频录制工具,可以很方便的进行视频的录制。
特色功能:

  • 绘制模式:在录制视频时进行频幕上的编辑
  • 窗口依附:可以轻松指定需要录制的窗口
  • 多格式输出:支持输出多种格式,按照不同分辨率,预置平台输出
  • 添加水印:防盗利器,在视频中添加自己的 LOGO

LockHunter:解除文件占用

[免费]

官网

在删除文件/目录时,偶尔会遇到文件占用的问题,这个小工具直接集成到 MS Explorer 右键菜单中,可以方便查看占用程序,并关闭它。

rufus:USB 启动盘制作工具

[便携版], [免费], [开源]

官网, GitHub

小巧方便的 USB 启动盘制作工具,完全的一键操作,下载 => 解压 => 运行 三连之后就是父母辈的人都能看懂的界面了!

Geek Uninstaller:深度卸载

PanDownload:百度网盘下载

[便携版], [跨平台], [免费]

官网

百度网盘下载工具,虽然吾辈已经有百度网盘的会员了,但官方客户端实在太多没鬼用的功能了,吾辈仅仅只需要下载,仅此而已。

KeyTweak:全局按键映射

[便携版], [免费]

全局键盘映射,将一些常用按键与不常用按键交换位置,以避免手指损伤。最典型的例子莫过于 Caps LockCtrl 这两个按键了。

Loseless Audio Validator:音频校验

[便携版], [跨平台], [开源], [免费]

官网

校验音乐是否是真的 Flac/Ape 无损音质的,其实作为一个外行人吾辈表示并不理解什么音频波形什么的。

ApowerMirror: 手机投屏

[跨平台]

官网

在局域网内将手机屏幕投影到 PC 上,延迟性在半秒之内,基本上不影响使用。相比于 TeamViewer 的主要优点是不走中央服务器,延迟没那么高。而与之类似的 AirServer 却延迟很大,而且操作过快时就会崩溃。吾辈主要是在 PC 演示操作时,涉及到手机上的操作时,为了避免录屏中断或是后期拼接,故而需要将手机屏幕投影至 PC 方便持续录制。

国内流氓

QQ:国内不得不用的流氓 IM

官网

垃圾 QQ,毁我人生!
好了,以上纯属吐槽不用在意。QQ 是腾讯的社交 IM,由于国内使用人数极其庞大,所以吾辈也不得不用的软件。一个软件居然会向系统添加驱动服务,而且禁用了还不让使用,真是厉害了呀。。。

百度网盘:国内事实上的垄断网盘

[跨平台], [免费]

官网

国内事实上的大文件共享服务,目前对普通用户的限制非常大,逼得人不得不开通 SVip 才能使用,但同时也不能得到满速下载,在下载量较大后,之后的下载就会在服务端限速,同时百度网盘的客户端非常讨厌,即便是 SVip 也会看到广告。


Pass:以上国内的流氓吾辈使用的都是修改过的绿色版本,基本上没什么太多麻烦的东西了呢


名词解释

便携版

能够下载完解压之后无需安装即可直接使用的软件,所有的配置文件也都在程序运行的文件目录下(非用户目录下),理论上可以配置完成一次之后就可以用一辈子了(#笑)

开源

开放程序源代码,任何人都可以自由浏览

部分开源

指程序既有开源版本又有商业版本,所以标识为部分开源

跨平台

至少兼容两个主流 PC 系统平台(Windows/MacOS #Linux 桌面在哭泣 #笑)才会标记为跨平台

免费

所有功能都完全免费(或许有捐助请求)才会标识为免费,有收费的高级功能的程序不会被标记为免费,例如 IDEA 就不会被标识为免费

以上均为吾辈个人主观认知,参考一下就好。。。

Java 跨域问题处理

问题

在页面上要使用 Ajax 请求去获取另外一个服务的数据,由于浏览器的 同源策略,所以直接请求会得到一个 Error

1
Failed to load https://www.baidu.com/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

大概就是这样的一个错误,关键词是 Access-Control-Allow-Origin,一般出现这个都是跨域问题。

解决方案

解决跨域问题的方式有很多,但这里之说 Cors 的方案。

在后台添加一个 Filter 过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* 使用自定义的 Filter 拦截器实现跨域请求、
* 适用于所有的 Java Web 项目并且不局限于某个框架
* 注:此处的 @Component 仅为让 Spring 知道这个 Bean, 不然拦截器不会加载
*
* @author rxliuli
*/
public class CustomCorsFilterConfig implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//允许所有来源
String allowOrigin = "*";
//允许以下请求方法
String allowMethods = "GET,POST,PUT,DELETE,OPTIONS";
//允许以下请求头
String allowHeaders = "Content-Type,X-Token,Authorization";
//允许有认证信息(cookie)
String allowCredentials = "true";

String origin = request.getHeader("Origin");
//此处是为了兼容需要认证信息(cookie)的时候不能设置为 * 的问题
response.setHeader("Access-Control-Allow-Origin", origin == null ? allowOrigin : origin);
response.setHeader("Access-Control-Allow-Methods", allowMethods);
response.setHeader("Access-Control-Allow-Credentials", allowCredentials);
response.setHeader("Access-Control-Allow-Headers", allowHeaders);

//处理 OPTIONS 的请求
if ("OPTIONS".equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
filterChain.doFilter(request, response);
}

@Override
public void destroy() {
}
}

web.xml 文件中添加拦截器配置(注:如果可能就配置成第一个 Filter

1
2
3
4
5
6
7
8
9
<!--cors 跨域访问-->
<filter>
<filter-name>customCorsFilterConfig</filter-name>
<filter-class>CustomCorsFilterConfig</filter-class>
</filter>
<filter-mapping>
<filter-name>customCorsFilterConfig</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Spring Web 的解决方案

配置一个每次请求都过滤一次的 Filter 就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Configuration
public class CorsConfig {
@Bean
public OncePerRequestFilter corsFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//允许所有来源
String allowOrigin = "*";
//允许以下请求方法
String allowMethods = "GET,POST,PUT,DELETE,OPTIONS";
//允许以下请求头
String allowHeaders = "Content-Type,X-Token,Authorization";
//允许有认证信息(cookie)
String allowCredentials = "true";

String origin = request.getHeader("Origin");
//此处是为了兼容需要认证信息(cookie)的时候不能设置为 * 的问题
response.setHeader("Access-Control-Allow-Origin", origin == null ? allowOrigin : origin);
response.setHeader("Access-Control-Allow-Methods", allowMethods);
response.setHeader("Access-Control-Allow-Credentials", allowCredentials);
response.setHeader("Access-Control-Allow-Headers", allowHeaders);

//处理 OPTIONS 的请求
if ("OPTIONS".equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
filterChain.doFilter(request, response);
}
};
}
}

使用示例

下面是一些简单的使用 fetch 进行跨域请求的示例:

  • 简单 fetch 请求,和正常使用 fetch 并无区别

    1
    2
    3
    fetch(url)
    .then(res => res.json())
    .then(json => console.log(json))
  • 表单请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var fd = new FormData()
    fd.append('username', 'rx')
    fd.append('password', 'rx')

    fetch(url, {
    method: 'POST',
    body: fd,
    })
    .then(res => res.json())
    .then(json => console.log(json))
  • 需要认证的请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fetch(url, {
    /**
    * 关键就在这里,代表用户是否应该在跨域的情况下发送 cookies 和 HTTP Basic authentication 等验信息以及服务端能否返回 Set-Cookie(服务端 Session 需要使用这个向 cookie 中设置 sessionId)。
    * 包含三个可选值:omit(从不发送), same-origin(同源才发送), include(总会发送)
    * 参考链接:<https://developer.mozilla.org/zh-CN/docs/Web/API/Request/credentials>
    */
    credentials: 'include',
    })
    .then(res => res.json())
    .then(json => console.log(json))

    注:如果想要服务端返回 Set-CookieSessionId 也需要通过这个响应属性去设置) 就必须设置这个请求参数!

那么,之后在前端跨域请求的时候就可以愉快地玩耍啦(v^_^)v

Git 频繁要输入密码的问题

场景

突然就遇到了,每次使用 Git 进行 pull/push 操作时都要输入密码,真是超级麻烦!

原因

Git 服务器上面设置了 SSH 密钥但仍然使用 HTTP/HTTPS 连接就会出现这个问题

解决方案

1. 配置一个本地文件记录用户名/密码

进入到 git 根目录下,执行下面的命令即可

1
git config --global credential.helper store

2. 使用 SSH 连接

在本机生成一个密钥对(已有的话就不需要了),参见 使用-SSH-连接-Linux-服务器,将密钥对的公钥(id_rsa.pub)配置到你的远程仓库即可。

GitHub SSH 设置

MySQL 无法插入中文数据

刚刚在 Linux Centos 装完 MySQL 后,想试一下是否能正常使用,但在插入中文数据时发生了下面的这个错误。

1
[HY000][1366] Incorrect string value: '\xE7\x90\x89\xE7\x92\x83' for column 'name' at row 1

感觉是 MySQL 编码问题,查看一下编码格式

1
show variables like '%char%';

结果

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem latin1
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
validate_password_special_char_count 1

果然有几个编码是不支持中文的,所以将 latin1 编码修改为 utf8mb4/utf8 就好啦

有关编码格式请参考:latin1, utf8, utf8mb4utf8 区别可以参考 https://my.oschina.net/xsh1208/blog/1052781

修改它们

1
2
3
4
5
6
set character_set_client = utf8mb4;
set character_set_connection = utf8mb4;
set character_set_database = utf8mb4;
set character_set_filesystem = utf8mb4;
set character_set_results = utf8mb4;
set character_set_server = utf8mb4;

然后再次尝试插入中文数据,好像还是不行呀,怎么办呢?实际上上面修改的是数据库默认的编码格式,对于已经存在的表和列并未生效

查看一下数据表编码

1
show create table user;
Table Crate Table
user CREATE TABLE user ( id bigint(20) NOT NULL COMMENT '编号', name varchar(20) NOT NULL COMMENT '名字', sex tinyint(1) DEFAULT NULL COMMENT '性别', age int(11) DEFAULT NULL COMMENT '年龄' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户'

查看全部列编码

1
show full columns from user;
Field Type Collation Null Key Default Extra Privileges Comment
id bigint(20) null NO “” “” select,insert,update,references 编号
name varchar(20) utf8_general_ci NO “” “” select,insert,update,references 名字
sex tinyint(1) null YES “” “” select,insert,update,references 性别
age int(11) null YES “” “” select,insert,update,references 年龄

现在有两个选择

  • 删除数据库重新建一个,数据库的编码格式就默认是 utf8mb4 了
  • 手动修改数据库,数据表,字段的编码方式
  1. 删除重建数据库的话只需要将数据库导出 sql 脚本,然后重新执行即可(如果存在很多数据/数据库正在使用则此方法不适用)
  2. 手动修改编码
    1. 修改数据库编码
      1
      alter database <db_name> character set utf8mb4;
    2. 修改数据表编码
      1
      alter table <table_name> character set utf8mb4;
    3. 修改字段编码
      1
      ALTER TABLE <table_name> MODIFY COLUMN <field_name> <field_type> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

那么,关于 MySQL 不能插入中文数据的问题就到这里啦

MongoDB 用户认证及操作

如果还没有安装 MongoDB 可以参考:Windows 下 MongoDB 便携版安装与初始化

启动 mongodmongo shell 服务

1
2
3
4
5
# 启动 mongodb 服务
mongod --port 27017 --dbpath "D:\Program\mongodb-win32-x86_64-2008plus-ssl-4.0.1\mongodb_data\data" --logpath "D:\Program\mongodb-win32-x86_64-2008plus-ssl-4.0.1\mongodb_data\log\mongodb.log"

# 启动 mongo shell
mongo --port 27017

注:mongodb 的默认 port 就是 27017,所以也可以省略不写

创建管理员用户

1
2
3
4
5
6
7
8
9
10
11
12
# 切换到 admin 数据库
use admin;
# 创建用户 root, 密码是 root 的 admin 账号了
db.createUser(
{
user: "root",
pwd: "root",
roles: [
{role: "root", db: "admin"}
]
}
)

验证用户登录

  1. 重启一下 mongod 服务
1
2
# 这里的 --auth 选项就代表着启用身份认证
mongod --auth --port 27017 --dbpath "D:\Program\mongodb-win32-x86_64-2008plus-ssl-4.0.1\mongodb_data\data" --logpath "D:\Program\mongodb-win32-x86_64-2008plus-ssl-4.0.1\mongodb_data\log\mongodb.log"
  1. 测试 root 用户是否能正常登录
  • 使用用户名/密码认证连接 mongodb
    1
    2
    # 这里添加了 --authenticationDatabase 设置认证的数据库
    mongo --port 27017 -u "root" -p "root" --authenticationDatabase "admin"
  • 连接到 mongo 客户端后验证
    1
    2
    3
    mongo --port 27017
    use admin;
    db.auth("root", "root");

创建普通用户

1
2
3
4
5
6
7
8
9
10
11
12
13
# 切换到 test 数据库
use test;
# 创建用户 test, 密码是 test 的普通账号了
# 主要变化在于 role,修改为对数据库 [test] 拥有 [可读写] 权限
db.createUser(
{
user: "test",
pwd: "test",
roles: [
{ role: "readWrite", db: "yapi" }
]
}
)

使用 test 这个普通用户在登陆后能看到的也只有自己的数据库呢(如果数据库存在的话)

内建权限

下面是一些常用的权限

  • Read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
  • userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
  • clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
  • dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
  • root:只在 admin 数据库中可用。超级账号,超级权限

使用 url 访问

1
2
3
4
# 不使用用户认证
mongodb://ip:port/db
# 使用用户认证
mongodb://username:password@ip:port/db

查看用户

  • 查看全局的所有账号

    1
    2
    use admin;
    db.system.users.find().pretty()
  • 查看当前库下的用户

    1
    2
    use admin;
    show users;

修改权限

  • 追加

    1
    2
    3
    4
    5
    # 给用户 test 追加新的权限
    db.grantRolesToUser(
    "test",
    [{role:"readWrite", db:"test"}]
    )
  • 替换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 替换用户 test 的权限
    db.updateUser(
    "test",
    {
    roles: [
    {role:"read", db:"test"}
    ]
    }
    )

删除用户

删除掉名为 test 的用户

1
db.dropUser('test')

IDEA 调试技巧

背景

IDEA 最强大的功能之一就是 Debug 了,然而如此强大的工具却有很多人在使用了很久之后依旧只会使用断点,然后一步步的走下来,这里便稍微讲解一下 IDEA 的调试功能。

基本

启动调试

最简单直观的就是点击工具栏的 Debug 按钮(S-F9)即可开始调试当前运行选项,然后便会弹出 Debug 选项卡(A-5)。

启动调试有三种情况:

  • S-F9 如果运行选项不为空,调试当前运行选项
  • CS-F9 如果当前文件可以运行的话,就调试当前文件
  • SA-F9/F9 显示所有可以调试的运行选项
    注:F9 只有在非调试环境下生效,在调试环境下的作用是运行到下一个断点。

断点

在左侧边栏上点击一下(亦或是 A-F8 添加一个?)就可以为当前可以运行到的代码行添加一个红色的小圆点(断点),当代码运行到断点时会自动停下(并自动跳转过来),然后我们就可以自己的查看运行时的细节了。

注:我们不能为不可能运行到的位置添加断点。例如以下情况:

  • 方法右侧大括号单独所在的行(会报错但仍能添加),错误:No executable code found at line
  • 类的方法之间的空行,这些地方甚至不能打断点(因为毫无意义!

移动

  • F7:跳转到方法内部
  • S-F7:选择跳转到哪个方法内部
  • F8:执行到下一行代码,如果没有下一行代码,则跳转到调用者方法(非类库的)。
  • S-F8:跳转到方法的调用者处,即便代码是类库里面的。
  • F9:让程序恢复到运行状态(未遇到断点的情况下),想跳到下一个断点或者让程序恢复正常运行状态就用这个吧
  • A-F9:跳转到当前行,主要用于在想进入方法内部看看时(一般很多人习惯打个断点吧?)

忽略所有断点

有这么一种情况,我们想要正常运行看一下效果,又不想重启服务器(一会有错误还要调试呢),就可以使用这个功能避免我们无谓的进入断点。

功能的名字是 Mute Breakpoints,但默认没有快捷键。可以使用结构查询 CS-A 输入这个名字进行查找,或者在调试选项卡中找到它点击一下就可以了。

执行表达式

IDEA 调试非常棒的一个功能,有时候想看看某个表达式的值,但又不想真正执行它(例如调用有可能因为参数报错的方法),想先看一下结果,这里就可以使用执行表达式(A-F8)这个功能了。
IDEA 能够自动感知当前调试的环境(例如当前调试代码行能访问到的所有变量执行表达式窗口中都能访问,反之亦然),也能在弹窗中自动提示代码。

但请注意,执行表达式中执行的代码是真的执行了,所以例如只能读取一次的流,数据库,文件等等,都是真正被改变的了,所以需要稍微注意一下哦

变量监视

上面的执行表达式可以查看表达式的值,然而如果我们想要看一个表达式的值在代码运行过程中发生了什么变化怎么办?难道每运行一行代码就使用执行表达式查看一下表达式的值么?那效率也太低了!
所以这里就需要用到变量监视这个功能了(Add to Watches),既可以右键将表达式的值添加到监视变量中,也能够在执行表达式窗口直接将当前表达式的值添加到监视变量中去(CS-Enter)。每一次代码走到下一步都会自动刷新值(其实就是执行了一次)。

高级

条件断点

可以给一个断点添加一个条件,指定在什么情况下会停留到这个断点(例如 if 语句里面的判断表达式为 true 时就停留),但断点条件只能是 true/false。操作的话在断点代码行使用 CS-F8 或者直接右键单击断点,就会弹出一个窗口,在 Condition 部分输入需要的条件就可以啦

断点管理

断点太多了怎么办?调试的时候想要测试某个请求的时候总是进入不相关的断点,这里可以使用断点管理功能。放在任意一个非断点代码行的位置按下 CS-F8 就会弹出一个断点管理弹窗,里面列出了所有,你可以在这里对断点进行更加细致的管理(启用/禁用/添加/删除/是否是多线程都有效/条件表达式/执行日志/相关代码修改/双击断点则后面的选项跳转到断点处)。

异常断点

有一种情况是我们在控制台看到了异常,但很想知道会在什么地方发生某个指定的异常。这时候就可以使用这个功能了。这个功能依赖于断点管理,需要在断点管理弹窗中进行添加断点异常(A-Ins)才可以。以后当每次发生指定异常时,都会停留在相应的代码处,以便于查看更加详细的原因。

代码回退

跳跃到上一个方法调用链处,或者在 Frames 选项卡中右键 Drop Frame 选择调用链的位置,然后回到这个位置。感觉上就像是回退一样,但其实并没有这么神奇。该功能只能回退到以前的方法调用位置,而且回退后 未来 的记录会被删除,总而言之这也是 IDEA 提供的一个调试的功能之一呢(吾辈个人用的不是很多)

强制返回

有时执行某个方法时已经发生了错误(例如参数有问题),但又不想继续执行下去(发生异常),所以就可以直接中断指定方法,强制返回指定的值。在方法调用链选项卡中选择一处(一般是当前方法),右键选择 Force Return 就可以强制结束该方法并返回指定的值了。

模拟抛出异常

场景:在需要测试方法在非正常执行时(例如测试数据库关闭发生数据库连接错误时的情况),如果还在手动添加测试异常代码就有点落后了,IDEA 已经为我们提供了优秀的工具!使用方法也很简单,就是在方法调用链选项卡指定位置右键选择 Throw Exception

MySQL 创建用户及授权

用户

创建用户

使用 root 用户登录到 MySQL

1
2
CREATE USER rxliuli
IDENTIFIED BY '123456';

删除用户

1
DROP USER rxliuli;

授权

添加授权

命令格式:

1
GRANT privilegesCode ON dbName.tableName TO username@host IDENTIFIED BY "password";

例如下面就是为 rxliuli 用户赋予了 mytimelinedb 数据库所有表的所有操作权限

1
2
GRANT ALL PRIVILEGES ON mytimelinedb.* TO rxliuli
IDENTIFIED BY '123456';

privilegesCode 代表权限,常用选项如下:

  • ALL PRIVILEGES :所有权限
  • SELECT:读取权限
  • DELETE :删除权限
  • UPDATE :更新权限
  • CREATE :创建权限
  • DROP :删除数据库、数据表权限

dbName.tableName 代表数据库.数据表,常用选项如下:

  • .:所有数据库的所有表的权限
  • dbName.*:指定数据库的所有表的权限
  • dbName.tableName:指定数据库下指定数据表的权限

username@host 表示授予的用户及允许该用户登录的 IP 地址。host 常用选项是:

  • 不填:允许任意 IP 地址登录
  • localhost:只允许本地登录
  • %:只允许远程登录
  • 192.168.2.100:只允许指定 IP 地址登录

password 代表该用户的登录密码
FLUSH PRIVILEGES 代表刷新权限

查看授权

1
SHOW GRANTS FOR rxliuli;

删除授权

1
revoke select on *.* from rxliuli;

刷新权限

1
flush privileges;

使用 SCP 上传和下载服务器的文件

简介

SCP 是一个用于 Linux 之间文件传输的轻量工具(基于 SSH),命令使用起来十分简单,唯一的缺点大概就是不支持断点续传了。

本地 >> 远程

  1. 将本地文件上传到服务器
    命令格式:

    1
    scp localFile user@ip:remoteDir
    • localFile:本地文件的路径
    • user@ip:服务器的用户名/IP
    • remoteDir:服务器上的目录,本地文件将被上传到该目录下

    例如下面将本地的 ssh 公钥上传到服务器的 ~(当前用户目录)

    1
    scp ~/.ssh/id_rsa.pub user@191.2.2.131:~
  2. 将本地目录上传到服务器
    命令格式:

    1
    scp -r localDir user@ip:remoteDir
    • -r:递归整个目录
    • localDir:本地目录的路径
    • user@ip:服务器的用户名/IP
    • remoteDir:服务器上的目录,本地目录将被上传到该目录下

    例如下面将本地的 /d/ssh 目录上传到服务器 ~ 目录下

    1
    scp -r /d/ssh/ user@191.2.2.131:~

其实你应该已经发现了,文件与目录的却别就在于一个 -r 参数而已

远程 >> 本地

  1. 下载服务器文件到本地
    命令格式:

    1
    scp user@ip:remoteFile localDir
    • user@ip:服务器的用户名/IP
    • remoteFile:服务器上文件的路径
    • localDir:本地的目录,服务器文件将被下载到该目录下

    例如下面将服务器的 ssh 公钥下载到本地的 ~ 下面

    1
    scp user@191.2.2.131:~/.ssh/id_rsa.pub ~
  2. 下载服务器目录到本地
    命令格式:

    1
    scp -r user@ip:remoteDir localDir
    • -r:递归整个目录
    • user@ip:服务器的用户名/IP
    • remoteDir:服务器上的目录
    • localDir:本地的目录,服务器目录将被下载到该目录下

    例如下面将服务器的 .ssh 目录下载到本地的 ~ 下面

    1
    scp -r user@191.2.2.131:~/.ssh ~

下面列出 SCP 的全部选项

很多并不一定用得到,但还是有存在的意义的

  • 1: 强制 scp 命令使用协议 ssh1
  • 2: 强制 scp 命令使用协议 ssh2
  • 4: 强制 scp 命令只使用 IPv4 寻址
  • 6: 强制 scp 命令只使用 IPv6 寻址
  • B: 使用批处理模式(传输过程中不询问传输口令或短语)
  • C: 允许压缩。(将 - C 标志传递给 ssh,从而打开压缩功能)
  • p:保留原文件的修改时间,访问时间和访问权限。
  • q: 不显示传输进度条。
  • r: 递归复制整个目录。
  • v:详细方式显示输出。scp 和 ssh(1) 会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
  • c cipher: 以 cipher 将数据传输进行加密,这个选项将直接传递给 ssh。
  • F ssh_config: 指定一个替代的 ssh 配置文件,此参数直接传递给 ssh。
  • i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给 ssh。
  • l limit: 限定用户所能使用的带宽,以 Kbit/s 为单位。
  • o ssh_option: 如果习惯于使用 ssh_config(5) 中的参数传递方式,
  • P port:注意是大写的 P, port 是指定数据传输用到的端口号
  • S program: 指定加密传输时所使用的程序。此程序必须能够理解 ssh(1) 的选项。

使用 SSH 连接 Linux 服务器

首先我们要在客户端(本机)生成密钥对

这里的密钥对是 Public key,具体请参考 公开密钥加密

使用命令

1
ssh-keygen -t rsa

接下来会提示让你输入一个路径来保存密钥对,默认在 ~/.ssh/id_rsa 下面生成 id_rsa(私钥)和 id_rsa.pub(公钥),如果没什么特殊需求就直接默认就好。

然后提示你输入密码(即本机使用 SSH 连接时的密码 #和服务器密码无关),也是直接回车默认为空即可。

将公钥上传到服务器上

这里以使用 SCP 为例,上传公钥 id_rsa.pub 到服务器上

1
scp ~/.ssh/id_rsa.pub root@139.59.22.131:~

将公钥追加到服务器的认证密钥中

将上传到服务器上的 id_rsa.pub 公钥追加到 authorized_keys 文件中,命令是

1
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

修改服务器的配置以启用公钥认证

修改 vi /etc/ssh/sshd_config 配置文件(如果有的话就进行修改,没有的话就添加进来)

1
2
3
4
RSAAuthentication yes        # 启用 RSA 认证(默认是注释掉的,将注释去掉,如果不是 yes,改为 yes)
PubkeyAuthentication yes # 启用公钥认证(默认是注释掉的,将注释去掉,如果不是 yes,改为 yes)
PasswordAuthentication no # 禁止密码认证 (改为 no, 默认为 yes 是用密码认证)
StrictModes no # 修改为 no, 默认为 yes. 如果不修改用 key 登陆是出现 server refused our key(如果 StrictModes 为 yes 必需保证存放公钥的文件夹的拥有与登陆用户名是相同的.“StrictModes” 设置 ssh 在接收登录请求之前是否检查用户家目录和 rhosts 文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。)

重启 SSH 服务

1
2
3
service sshd restart
# 或者
/etc/init.d/ssh restart

最后验证一下

连接服务器,这里以 SSH 客户端为例

1
ssh root@139.59.22.131

然后,就直接连上了,不需要输入密码了呢 O(≧▽≦)O

Cmder 启动报错

场景

每次打开 Cmder 时都会出现这么一个错误,虽然貌似对之后的使用没什么影响,但强迫症表示受不了呀

1
WARNING! The MacType's hooks are detected at 0x00007FF8E9D10000 D:\Program\MacType\MacType64.dll Please add ConEmuC.exe and ConEmuC64.exe to the exclusion list to avoid crashes! https://conemu.github.io/en/Installation.html#mactype

其实在初次使用 Cmder 时可能会遇到这种情况,因为你的 PC 上肯定是同时安装了 MacType,在遇到这种情况时看一下官方的链接就好了(虽然官方也没给出如何将程序添加到排除列表中 23333)

官方链接

官方的解释是:

1
2
If you are using MacType you can get crashes when starting any application from a shell started in ConEmu tab.
That is because MacType tries to hook ConEmuC.exe and ConEmuC64.exe processes. But ConEmuC is a console application and it does not draw any text on graphical canvas at all.

大意就是说 ConEmuC.exeConEmuC64.exe 是命令行程序,不在窗口上绘制什么文本,所以在其中打开时可能会发生异常。

解决方案

1. 使用图形编辑器

详情见下面的 Gif

Cmder 启动报错

2. 编辑配置文件

修改 MacType 的配置文件 MacType.ini(位于 ${MacType}/MacType.ini),在 UnloadDll(排除的 DLL)下添加 ConEmuC64.exeConEmuC.exe 即可。