Vivek Gite 发布的文章

重复性压迫损伤 Repetitive Strain Injury (RSI)是职业性损伤综合症,非特异性手臂疼痛或工作引起的上肢障碍。RSI 是由于过度使用双手从事重复性任务导致的,如打字、书写和使用鼠标. 不幸的是,大部分人不了解什么是 RSI 以及它的危害有多大。你可以使用名叫 Workrave 的开源软件轻松的预防 RSI。

RSI 有哪些症状?

我从这个页面引用过来的,看看哪些你被说中了:

  1. 疲惫缺乏忍耐力?
  2. 手掌及上肢乏力
  3. 疼痛麻木甚至失去知觉?
  4. 沉重:你有没有感觉手很沉?
  5. 笨拙: 你有没有感觉抓不紧东西?
  6. 你有没有感觉手上无力?很难打开罐子或切菜无力?
  7. 缺乏协调和控制?
  8. 手总是冰凉的?
  9. 健康意识有待提高?稍不注意身体就发现有毛病了。
  10. 是否过敏?
  11. 频繁的自我按摩(潜意识的)?
  12. 共鸣的疼痛?当别人在谈论手痛的时候,你是否也感觉到了手疼?

如何减少发展为 RSI 的风险

  • 使用计算机的时候每隔 30 分钟间隔休息一下。借助软件如 workrave 预防 RSI。
  • 有规律的锻炼可以预防各种损伤,包括 RSI。
  • 使用合理的姿势。调整你的电脑桌和椅子使身体保持一个肌肉放松状态。

Workrave

Workrave 是一款预防计算机用户发展为 RSI 或近视的自由开源软件。软件会定期锁屏为一个动画: “Workrave 小姐”,引导用户做各种伸展运动并敦促其休息一下。这个软件经常提醒你暂停休息一下,并限制你每天的限度。程序可以运行在 MS-Window、Linux 以及类 UNIX 操作系统下。

安装 workrave

在 Debian/Ubuntu Linux 系统运行以下 apt 命令/apt-get 命令

$ sudo apt-get install workrave

Fedora Linux 发行版用户运行以下 dnf 命令:

$ sudo dnf install workrave

RHEL/CentOS Linux 用户可以启动 EPEL 仓库并用 yum 命令安装:

### [ **在CentOS/RHEL 7.x 及衍生版本上测试** ] ###
$ sudo yum install epel-release
$ sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum install workrave

Arch Linux 用户运行以下 pacman 命令来安装:

$ sudo pacman -S workrave

FreeBSD 用户可用以下 pkg 命令安装:

# pkg install workrave

OpenBSD 用户可用以下 pkg\_add 命令安装:

$ doas pkg_add workrave

如何配置 workrave

Workrave 以一个小程序运行,它的用户界面位于面板中。你可以为 workrave 增加一个面板来控制软件的动作和外观。

增加一个新 workrave 对象到面板:

  • 在面板空白区域右键,打开面板弹出菜单
  • 选择新增到面板
  • 新增面板对话框打开,在加载器顶部,可以看到可用的面板对象按照字母排列。选中 workrave 程序并单击新增。

图 01:新增 workrave 对象到面板

图 01:新增 workrave 对象到面板

如果修改 workrave 对象的属性,执行以下步骤:

  • 右键 workrave 对象打开面板对象弹出
  • 选中偏好。使用属性对话框修改对应属性

图 02:修改 Workrave 对象属性

图 02:修改 Workrave 对象属性

Workrave 运行展示

主窗口显示下一次提醒休息的剩余时间,这个窗口可以关闭,时间提示窗口会显示在面板上。

图 03:时间计数器

图 03:时间计数器

图 04:Workrave 小姐 - 引导你做伸展运动的动画

图 04:Workrave 小姐 - 引导你做伸展运动的动画

休息提示窗口,请求你暂停一下工作:

图 05:休息提示倒计时

图 05:休息提示倒计时

图 06:你可以跳过休息

图 06:你可以跳过休息

参考链接:

  1. Workrave 项目 主页
  2. pokoy 防止 RSI 和其他计算机压力的轻量级守护进程
  3. GNOME3 下的 Pomodoro 计数器
  4. RSI 的维基百科

关于作者

作者是 nixCraft 创始人,经验丰富的系统管理员,同时也是一个 Linux/Unix 系统下的 shell 脚本培训师。他曾服务于全球客户,并与多个行业合作包括 IT、教育、国防和航天研究,以及非盈利机构。可以在 TwitterFacebookGoogle+ 上关注他。


via: https://www.cyberciti.biz/tips/repetitive-strain-injury-prevention-software.html

作者:Vivek Gite 译者:guevaraya 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

手册页(man)是由系统管理员和 IT 技术开发人员写的,更多的是为了作为参考而不是教你如何使用。手册页对于已经熟悉使用 Linux、Unix 和 BSD 操作系统的人来说是非常有用的。如果你仅仅需要知道某个命令或者某个配置文件的格式那么你可以使用手册页,但是手册页对于 Linux 新手来说并没有太大的帮助。想要通过使用手册页来学习一些新东西不是一个好的选择。这里有将提供 30 个学习 Linux 和 Unix 操作系统的最佳在线网页文档。

 title=

值得一提的是,相对于 Linux,BSD 的手册页更好。

1:Red Hat Enterprise Linux(RHEL)

 title=

RHEL 是由红帽公司开发的面向商业市场的 Linux 发行版。红帽的文档是最好的文档之一,涵盖从 RHEL 的基础到一些高级主题比如安全、SELinux、虚拟化、目录服务器、服务器集群、JBOSS 应用程序服务器、高性能计算(HPC)等。红帽的文档已经被翻译成 22 种语言,发布成多页面 HTML、单页面 HTML、PDF、EPUB 等文件格式。好消息同样的文档你可以用于 Centos 和 Scientific Linux(社区企业发行版)。这些文档随操作系统一起下载提供,也就是说当你没有网络的时候,你也可以使用它们。RHEL 的文档涵盖从安装到配置器群的所有内容。唯一的缺点是你需要成为付费用户。当然这对于企业公司来说是一件完美的事。

  1. RHEL 文档:HTML/PDF格式(LCTT 译注:此链接需要付费用户才可以访问)
  2. 是否支持论坛:只能通过红帽公司的用户网站提交支持案例。

关于 CentOS Wiki 和论坛的说明

 title=

CentOS( 社区企业操作系统 Community ENTerprise Operating System )是由 RHEL 提供的自由源码包免费重建的。它为个人电脑或其它用途提供了可靠的、免费的企业级 Linux。你可以不用付出任何支持和认证费用就可以获得 RHEL 的稳定性。CentOS的 wiki 分为 Howto、技巧等等部分,链接如下:

  1. 文档:wiki 格式
  2. 是否支持论坛:

2:Arch 的 Wiki 和论坛

 title=

Arch linux 是一个独立开发的 Linux 操作系统,它有基于 wiki 网站形式的非常不错的文档。它是由 Arch 社区的一些用户共同协作开发出来的,并且允许任何用户添加或修改内容。这些文档教程被分为几类比如说优化、软件包管理、系统管理、X window 系统还有获取安装 Arch Linux 等。它的官方论坛在解决许多问题的时候也非常有用。它有总共 4 万多个注册用户、超过 1 百万个帖子。 该 wiki 包含一些 其它 Linux 发行版也适用的通用信息

  1. Arch 社区文档:Wiki 格式
  2. 是否支持论坛:

3:Gentoo Linux Wiki 和论坛

 title=

Gentoo Linux 基于 Portage 包管理系统。Gentoo Linux 用户根据它们选择的配置在本地编译源代码。多数 Gentoo Linux 用户都会定制自己独有的程序集。 Gentoo Linux 的文档会给你一些有关 Gentoo Linux 操作系统的说明和一些有关安装、软件包、网络和其它等主要出现的问题的解决方法。Gentoo 有对你来说 非常有用的论坛,论坛中有超过 13 万 4 千的用户,总共发了有 5442416 个文章。

  1. Gentoo 社区文档:手册Wiki 格式
  2. 是否支持论坛:

4:Ubuntu Wiki 和文档

 title=

Ubuntu 是领先的台式机和笔记本电脑发行版之一。其官方文档由 Ubuntu 文档工程开发维护。你可以在从官方文档中查看大量的信息,比如如何开始使用 Ubuntu 的教程。最好的是,此处包含的这些信息也可用于基于 Debian 的其它系统。你可能会找到由 Ubuntu 的用户们创建的社区文档,这是一份有关 Ubuntu 的使用教程和技巧等。Ubuntu Linux 有着网络上最大的 Linux 社区的操作系统,它对新用户和有经验的用户均有助益。

  1. Ubuntu 社区文档:wiki 格式
  2. Ubuntu 官方文档:wiki 格式
  3. 是否支持论坛:

5:IBM Developer Works

 title=

IBM Developer Works 为 Linux 程序员和系统管理员提供技术资源,其中包含数以百计的文章、教程和技巧来协助 Linux 程序员的编程工作和应用开发还有系统管理员的日常工作。

  1. IBM 开发者项目文档:HTML 格式
  2. 是否支持论坛:

6:FreeBSD 文档和手册

 title=

FreeBSD 的手册是由 FreeBSD 文档项目 FreeBSD Documentation Project 所创建的,它介绍了 FreeBSD 操作系统的安装、管理和一些日常使用技巧等内容。FreeBSD 的手册页通常比 GNU Linux 的手册页要好一点。FreeBSD 附带有全部最新手册页的文档。 FreeBSD 手册涵盖任何你想要的内容。手册包含一些通用的 Unix 资料,这些资料同样适用于其它的 Linux 发行版。FreeBSD 官方论坛会在你遇到棘手问题时给予帮助。

  1. FreeBSD 文档:HTML/PDF 格式
  2. 是否支持论坛:

7:Bash Hackers Wiki

 title=

这是一个对于 bash 使用者来说非常好的资源。Bash 使用者的 wiki 是为了归纳所有类型的 GNU Bash 文档。这个项目的动力是为了提供可阅读的文档和资料来避免用户被迫一点一点阅读 Bash 的手册,有时候这是非常麻烦的。Bash Hackers Wiki 分为各个类,比如说脚本和通用资料、如何使用、代码风格、bash 命令格式和其它。

  1. Bash 用户教程:wiki 格式

8:Bash 常见问题

 title=

这是一个为 bash 新手设计的一个 wiki。它收集了 IRC 网络的 #bash 频道里常见问题的解决方法,这些解决方法是由该频道的普通成员提供。当你遇到问题的时候不要忘了在 BashPitfalls 部分检索查找答案。这些常见问题的解决方法可能会倾向于 Bash,或者偏向于最基本的 Bourne Shell,这决定于是谁给出的答案。大多数情况会尽力提供可移植的(Bourne)和高效的(Bash,在适当情况下)的两类答案。

  1. Bash 常见问题:wiki 格式

9: Howtoforge - Linux 教程

 title=

博客作者 Falko 在 Howtoforge 上有一些非常不错的东西。这个网站提供了 Linux 关于各种各样主题的教程,比如说其著名的“最佳服务器系列”,网站将主题分为几类,比如说 web 服务器、linux 发行版、DNS 服务器、虚拟化、高可用性、电子邮件和反垃圾邮件、FTP 服务器、编程主题还有一些其它的内容。这个网站也支持德语。

  1. Howtoforge: html 格式
  2. 是否支持论坛:是

10:OpenBSD 常见问题和文档

 title=

OpenBSD 是另一个基于 BSD 的类 Unix 计算机操作系统。OpenBSD 是由 NetBSD 项目分支而来。OpenBSD 因高质量的代码和文档、对软件许可协议的坚定立场和强烈关注安全问题而闻名。OpenBSD 的文档分为多个主题类别,比如说安装、包管理、防火墙设置、用户管理、网络、磁盘和磁盘阵列管理等。

  1. OpenBSD:html 格式
  2. 是否支持论坛:否,但是可以通过 邮件列表 来咨询

11: Calomel - 开源研究和参考文档

 title=

这个极好的网站是专门作为开源软件和那些特别专注于 OpenBSD 的软件的文档来使用的。这是最简洁的引导网站之一,专注于高质量的内容。网站内容分为多个类,比如说 DNS、OpenBSD、安全、web 服务器、Samba 文件服务器、各种工具等。

  1. Calomel 官网:html 格式
  2. 是否支持论坛:否

12:Slackware 书籍项目

 title=

Slackware Linux 是我的第一个 Linux 发行版。Slackware 是基于 Linux 内核的最早的发行版之一,也是当前正在维护的最古老的 Linux 发行版。 这个发行版面向专注于稳定性的高级用户。 Slackware 也是很少有的的“类 Unix” 的 Linux 发行版之一。官方的 Slackware 手册是为了让用户快速开始了解 Slackware 操作系统的使用方法而设计的。 这不是说它将包含发行版的每一个方面,而是为了说明它的实用性和给使用者一些有关系统的基础工作使用方法。手册分为多个主题,比如说安装、网络和系统配置、系统管理、包管理等。

  1. Slackware Linux 手册:html 格式、pdf 和其它格式
  2. 是否支持论坛:是

13:Linux 文档项目(TLDP)

 title=

Linux 文档项目 Linux Documentation Project 旨在给 Linux 操作系统提供自由、高质量文档。网站是由志愿者创建和维护的。网站分为具体主题的帮助、由浅入深的指南等。在此我想推荐一个非常好的文档,这个文档既是一个教程也是一个 shell 脚本编程的参考文档,对于新用户来说这个 HOWTO 的列表也是一个不错的开始。

  1. Linux 文档工程 支持多种查阅格式
  2. 是否支持论坛:否

14:Linux Home Networking

 title=

Linux Home Networking 是学习 linux 的另一个比较好的资源,这个网站包含了 Linux 软件认证考试的内容比如 RHCE,还有一些计算机培训课程。网站包含了许多主题,比如说网络、Samba 文件服务器、无线网络、web 服务器等。

  1. Linux home networking 可通过 html 格式和 PDF(少量费用)格式查阅
  2. 是否支持论坛:是

15:Linux Action Show

 title=

Linux Action Show(LAS) 是一个关于 Linux 的播客。这个网站是由 Bryan Lunduke、Allan Jude 和 Chris Fisher 共同管理的。它包含了 FOSS 的最新消息。网站内容主要是评论一些应用程序和 Linux 发行版。有时候也会发布一些和开源项目著名人物的采访视频。

  1. Linux action show 支持音频和视频格式
  2. 是否支持论坛:是

16:Commandlinefu

 title=

Commandlinefu 列出了各种有用或有趣的 shell 命令。这里所有命令都可以评论、讨论和投票(支持或反对)。对于所有 Unix 命令行用户来说是一个极好的资源。不要忘了查看评选出来的最佳命令

  1. Commandlinefu 支持 html 格式
  2. 是否支持论坛:否

17:Debian 管理技巧和资源

 title=

这个网站包含一些只和 Debian GNU/Linux 相关的主题、技巧和教程,特别是包含了关于系统管理的有趣和有用的信息。你可以在上面贡献文章、建议和问题。提交了之后不要忘记查看最佳文章列表里有没有你的文章。

  1. Debian 系统管理 支持 html 格式
  2. 是否支持论坛:否

18: Catonmat - Sed、Awk、Perl 教程

 title=

这个网站是由博客作者 Peteris Krumins 维护的。主要关注命令行和 Unix 编程主题,比如说 sed 流编辑器、perl 语言、AWK 文本处理工具等。不要忘了查看 sed 介绍、sed 含义解释,还有命令行历史的权威介绍

  1. catonmat 支持 html 格式
  2. 是否支持论坛:否

19:Debian GNU/Linux 文档和 Wiki

 title=

Debian 是另外一个 Linux 操作系统,其主要使用的软件以 GNU 许可证发布。Debian 因严格坚持 Unix 和自由软件的理念而闻名,它也是很受欢迎并且有一定影响力的 Linux 发行版本之一。 Ubuntu 等发行版本都是基于 Debian 的。Debian 项目以一种易于访问的形式提供给用户合适的文档。这个网站分为 Wiki、安装指导、常见问题、支持论坛几个模块。

  1. Debian GNU/Linux 文档 支持 html 和其它格式访问
  2. Debian GNU/Linux wiki
  3. 是否支持论坛:

20:Linux Sea

Linux Sea 这本书提供了比较通俗易懂但充满技术(从最终用户角度来看)的 Linux 操作系统的介绍,使用 Gentoo Linux 作为例子。它既没有谈论 Linux 内核或 Linux 发行版的历史,也没有谈到 Linux 用户不那么感兴趣的细节。

  1. Linux sea 支持 html 格式访问
  2. 是否支持论坛: 否

21:O'reilly Commons

 title=

O'reilly 出版社发布了不少 wiki 格式的文章。这个网站主要是为了给那些喜欢创作、参考、使用、修改、更新和修订来自 O'Reilly 或者其它来源的素材的社区提供资料。这个网站包含关于 Ubuntu、PHP、Spamassassin、Linux 等的免费书籍。

  1. Oreilly commons 支持 Wiki 格式
  2. 是否支持论坛:否

22:Ubuntu 袖珍指南

 title=

这本书的作者是 Keir Thomas。这本指南(或者说是书籍)对于所有 ubuntu 用户来说都值得一读。这本书旨在向用户介绍 Ubuntu 操作系统和其所依赖的理念。你可以从官网下载这本书的 PDF 版本,也可以在亚马逊买印刷版。

  1. Ubuntu pocket guide 支持 PDF 和印刷版本.
  2. 是否支持论坛:否

23: Linux: Rute User’s Tutorial and Exposition

 title=

这本书涵盖了 GNU/LINUX 系统管理,主要是对主流的发布版本比如红帽和 Debian 的说明,可以作为新用户的教程和高级管理员的参考。这本书旨在给出 Unix 系统的每个面的简明彻底的解释和实践性的例子。想要全面了解 Linux 的人都不需要再看了 —— 这里没有涉及的内容。

  1. Linux: Rute User’s Tutorial and Exposition 支持印刷版和 html 格式
  2. 是否支持论坛:否

24:高级 Linux 编程

 title=

这本书是写给那些已经熟悉了 C 语言编程的程序员的。这本书采取一种教程式的方式来讲述大多数在 GNU/Linux 系统应用编程中重要的概念和功能特性。如果你是一个已经对 GNU/Linux 系统编程有一定经验的开发者,或者是对其它类 Unix 系统编程有一定经验的开发者,或者对 GNU/Linux 软件开发有兴趣,或者想要从非 Unix 系统环境转换到 Unix 平台并且已经熟悉了优秀软件的开发原则,那你很适合读这本书。另外,你会发现这本书同样适合于 C 和 C++ 编程。

  1. 高级 Linux 编程 支持印刷版和 PDF 格式
  2. 是否支持论坛:否

25: LPI 101 Course Notes

 title=

LPIC 1、2、3 级是用于 Linux 系统管理员认证的。这个网站提供了 LPI 101 和 LPI 102 的测试训练。这些是根据 GNU 自由文档协议 GNU Free Documentation Licence (FDL)发布的。这些课程材料基于 Linux 国际专业协会的 LPI 101 和 102 考试的目标。这个课程是为了提供给你一些必备的 Linux 系统的操作和管理的技能。

  1. LPI 训练手册 支持 PDF 格式
  2. 是否支持论坛:否

26: FLOSS 手册

 title=

FLOSS 手册是一系列关于自由和开源软件以及用于创建它们的工具和使用这些工具的社区的手册。社区的成员包含作者、编辑、设计师、软件开发者、积极分子等。这些手册中说明了怎样安装使用一些自由和开源软件,如何操作(比如设计和维持在线安全)开源软件,这其中也包含如何使用或支持自由软件和格式的自由文化服务手册。你也会发现关于一些像 VLC、 Linux 视频编辑、 Linux、 OLPC / SUGAR、 GRAPHICS 等软件的手册。

  1. 你可以浏览 FOSS 手册 支持 Wiki 格式
  2. 是否支持论坛:否

27:Linux 入门包

 title=

刚接触 Linux 这个美好世界?想找一个简单的入门方式?你可以下载一个 130 页的指南来入门。这个指南会向你展示如何在你的个人电脑上安装 Linux,如何浏览桌面,掌握最主流行的 Linux 程序和修复可能出现的问题的方法。

  1. Linux 入门包支持 PDF 格式
  2. 是否支持论坛:否

28:Linux.com - Linux 信息来源

Linux.com 是 Linux 基金会的一个产品。这个网站上提供一些新闻、指南、教程和一些关于 Linux 的其它信息。利用全球 Linux 用户的力量来通知、写作、连接 Linux 的事务。

  1. 在线访问 Linux.com
  2. 是否支持论坛:是

29: LWN

LWN 是一个注重自由软件及用于 Linux 和其它类 Unix 操作系统的软件的网站。这个网站有周刊、基本上每天发布的单独文章和文章的讨论对话。该网站提供有关 Linux 和 FOSS 相关的开发、法律、商业和安全问题的全面报道。

  1. 在线访问 lwn.net
  2. 是否支持论坛:否

30:Mac OS X 相关网站

与 Mac OS X 相关网站的快速链接:

  • Mac OS X 提示 —— 这个网站专用于苹果的 Mac OS X Unix 操作系统。网站有很多有关 Bash 和 Mac OS X 的使用建议、技巧和教程
  • Mac OS 开发库 —— 苹果拥有大量和 OS X 开发相关的优秀系列内容。不要忘了看一看 bash shell 脚本入门
  • Apple 知识库 - 这个有点像 RHN 的知识库。这个网站提供了所有苹果产品包括 OS X 相关的指南和故障报修建议。

30: NetBSD

(LCTT 译注:没错,又一个 30)

NetBSD 是另一个基于 BSD Unix 操作系统的自由开源操作系统。NetBSD 项目专注于系统的高质量设计、稳定性和性能。由于 NetBSD 的可移植性和伯克利式的许可证,NetBSD 常用于嵌入式系统。这个网站提供了一些 NetBSD 官方文档和各种第三方文档的链接。

  1. 在线访问 netbsd 文档,支持 html、PDF 格式
  2. 是否支持论坛:否

你要做的事

这是我的个人列表,这可能并不完全是权威的,因此如果你有你自己喜欢的独特 Unix/Linux 网站,可以在下方参与评论分享。

// 图片来源: Flickr photo PanelSwitchman。一些连接是用户在我们的 Facebook 粉丝页面上建议添加的。

关于作者

作者是 nixCraft 的创建者和经验丰富的系统管理员以及 Linux 操作系统 / Unix shell 脚本的培训师。它曾与全球客户及各行各业合作,包括 IT、教育,国防和空间研究以及一些非营利部门。可以关注作者的 TwitterFacebookGoogle+


via: https://www.cyberciti.biz/tips/linux-unix-bsd-documentations.html

作者:Vivek Gite 译者:ScarboroughCoral 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

here 文档 here document (LCTT 译注:here 文档又称作 heredoc )不是什么特殊的东西,只是一种 I/O 重定向方式,它告诉 bash shell 从当前源读取输入,直到读取到只有分隔符的行。

redirect output of here document to a text file

这对于向 ftp、cat、echo、ssh 和许多其他有用的 Linux/Unix 命令提供指令很有用。 此功能适用于 bash 也适用于 Bourne、Korn、POSIX 这三种 shell。

here 文档语法

语法是:

command <<EOF
cmd1
cmd2 arg1
EOF

或者允许 shell 脚本中的 here 文档使用 EOF<<- 以自然的方式缩进:

command <<-EOF
  msg1
  msg2 
  $var on line 
EOF

或者

command <<'EOF'
 cmd1
 cmd2 arg1
 $var won't expand as parameter substitution turned off
 by single quoting
EOF

或者 重定向并将其覆盖 到名为 my_output_file.txt 的文件中:

command <<EOF > my_output_file.txt
 mesg1
 msg2
 msg3
 $var on $foo
EOF

重定向并将其追加到名为 my_output_file.txt 的文件中:

command <<EOF >> my_output_file.txt
 mesg1
 msg2
 msg3
 $var on $foo
EOF

示例

以下脚本将所需内容写入名为 /tmp/output.txt 的文件中:

#!/bin/bash
OUT=/tmp/output.txt

echo "Starting my script..."
echo "Doing something..."

cat <<EOF >$OUT
  Status of backup as on $(date)
  Backing up files $HOME and /etc/
EOF

echo "Starting backup using rsync..."

你可以使用cat命令查看/tmp/output.txt文件:

$ cat /tmp/output.txt

示例输出:

 Status of backup as on Thu Nov 16 17:00:21 IST 2017
 Backing up files /home/vivek and /etc/

禁用路径名/参数/变量扩展、命令替换、算术扩展

$HOME 这类变量和像 $(date) 这类命令在脚本中会被解释为替换。 要禁用它,请使用带有 'EOF' 这样带有单引号的形式,如下所示:

#!/bin/bash
OUT=/tmp/output.txt

echo "Starting my script..."
echo "Doing something..."
# No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word.  
# If any part of word is quoted, the delimiter  is  the  result  of  quote removal  on word, and the lines in the here-document 
# are not expanded. So EOF is quoted as follows
cat <<'EOF' >$OUT
  Status of backup as on $(date)
  Backing up files $HOME and /etc/
EOF

echo "Starting backup using rsync..."

你可以使用 cat 命令查看 /tmp/output.txt 文件:

$ cat /tmp/output.txt

示例输出:

 Status of backup as on $(date)
 Backing up files $HOME and /etc/

关于 tee 命令的使用

语法是:

tee /tmp/filename <<EOF >/dev/null
line 1
line 2
line 3
$(cmd)
$var on $foo
EOF

或者通过在单引号中引用 EOF 来禁用变量替换和命令替换:

tee /tmp/filename <<'EOF' >/dev/null
line 1
line 2
line 3
$(cmd)
$var on $foo
EOF

这是我更新的脚本:

#!/bin/bash
OUT=/tmp/output.txt

echo "Starting my script..."
echo "Doing something..."

tee $OUT <<EOF >/dev/null
  Status of backup as on $(date)
  Backing up files $HOME and /etc/
EOF

echo "Starting backup using rsync..."

关于内存 here 文档的使用

这是我更新的脚本:

#!/bin/bash
OUT=/tmp/output.txt

## in memory here docs 
## thanks https://twitter.com/freebsdfrau
exec 9<<EOF
  Status of backup as on $(date)
  Backing up files $HOME and /etc/
EOF

## continue
echo "Starting my script..."
echo "Doing something..."

## do it
cat <&9 >$OUT

echo "Starting backup using rsync..."

via: https://www.cyberciti.biz/faq/using-heredoc-rediection-in-bash-shell-script-to-write-to-file/

作者:Vivek Gite 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我是从 Linux 迁移过来的 FreeBSD 新用户,Linux 中使用的是 netfilter 防火墙框架(LCTT 译注:netfilter 是由 Rusty Russell 提出的 Linux 2.4 内核防火墙框架)。那么在 FreeBSD 上,我该如何设置 PF 防火墙,来保护只有一个公共 IP 地址和端口的 web 服务器呢?

PF 是 包过滤器 packet filter 的简称。它是为 OpenBSD 开发的,但是已经被移植到了 FreeBSD 以及其它操作系统上。PF 是一个包状态过滤引擎。在这篇教程中,我将向你展示如何在 FreeBSD 10.x 以及 11.x 中设置 PF 防火墙,从而来保护 web 服务器。

第一步:开启 PF 防火墙

你需要把下面这几行内容添加到文件 /etc/rc.conf 文件中:

# echo 'pf_enable="YES"' >> /etc/rc.conf
# echo 'pf_rules="/usr/local/etc/pf.conf"' >> /etc/rc.conf
# echo 'pflog_enable="YES"' >> /etc/rc.conf
# echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf

在这里:

  1. pf_enable="YES" - 开启 PF 服务
  2. pf_rules="/usr/local/etc/pf.conf" - 从文件 /usr/local/etc/pf.conf 中读取 PF 规则
  3. pflog_enable="YES" - 为 PF 服务打开日志支持
  4. pflog_logfile="/var/log/pflog" - 存储日志的文件,即日志存于文件 /var/log/pflog

第二步:在 /usr/local/etc/pf.conf 文件中创建防火墙规则

输入下面这个命令打开文件(超级用户模式下):

# vi /usr/local/etc/pf.conf

在文件中添加下面这些 PF 规则集:

# vim: set ft=pf
# /usr/local/etc/pf.conf
 
## 设置公共端口 ##
ext_if="vtnet0"
 
## 设置服务器公共 IP 地址 ##
ext_if_ip="172.xxx.yyy.zzz"
 
## 设置并删除下面这些公共端口上的 IP 范围 ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
          10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
          0.0.0.0/8, 240.0.0.0/4 }"
 
## 设置 http(80)/https (443) 端口 ##
webports = "{http, https}"
 
## 启用下面这些服务 ##
int_tcp_services = "{domain, ntp, smtp, www, https, ftp, ssh}"
int_udp_services = "{domain, ntp}"
 
## 跳过回环端口 - 跳过端口上的所有 PF 处理 ##
set skip on lo
 
## 设置 PF 应该统计的端口信息,如发送/接收字节数,通过/禁止的包的数目 ##
set loginterface $ext_if
 
## 设置默认策略 ##
block return in log all
block out all
 
# 基于 IP 分片的错误处理来防御攻击 
scrub in all
 
# 删除所有不可达路由地址
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians
 
## 禁止欺骗包
antispoof quick for $ext_if
 
# 打开 SSH 端口,SSH 服务仅从 VPN IP 139.xx.yy.zz 监听 22 号端口
# 出于安全原因,我不允许/接收 SSH 流量
pass in quick on $ext_if inet proto tcp from 139.xxx.yyy.zzz to $ext_if_ip port = ssh flags S/SA keep state label "USER_RULE: Allow SSH from 139.xxx.yyy.zzz"
## 使用下面这些规则来为所有来自任何 IP 地址的用户开启 SSH 服务 #
## pass in inet proto tcp to $ext_if port ssh
### [ OR ] ###
## pass in inet proto tcp to $ext_if port 22 
 
# Allow Ping-Pong stuff. Be a good sysadmin 
pass inet proto icmp icmp-type echoreq
 
# All access to our Nginx/Apache/Lighttpd Webserver ports 
pass proto tcp from any to $ext_if port $webports
 
# 允许重要的发送流量
pass out quick on $ext_if proto tcp to any port $int_tcp_services
pass out quick on $ext_if proto udp to any port $int_udp_services
 
# 在下面添加自定义规则

保存并关闭文件。欢迎来参考我的规则集。如果要检查语法错误,可以运行:

# service pf check

/etc/rc.d/pf check

# pfctl -n -f /usr/local/etc/pf.conf

第三步:开始运行 PF 防火墙

命令如下。请小心,如果是基于 SSH 的会话,你可能会和服务器断开连接。

开启 PF 防火墙:

# service pf start

停用 PF 防火墙:

# service pf stop

检查语法错误:

# service pf check

重启服务:

# service pf restart

查看 PF 状态:

# service pf status

示例输出:

Status: Enabled for 0 days 00:02:18           Debug: Urgent
 
Interface Stats for vtnet0            IPv4             IPv6
  Bytes In                           19463                0
  Bytes Out                          18541                0
  Packets In
    Passed                             244                0
    Blocked                              3                0
  Packets Out
    Passed                             136                0
    Blocked                             12                0
 
State Table                          Total             Rate
  current entries                        1               
  searches                             395            2.9/s
  inserts                                4            0.0/s
  removals                               3            0.0/s
Counters
  match                                 19            0.1/s
  bad-offset                             0            0.0/s
  fragment                               0            0.0/s
  short                                  0            0.0/s
  normalize                              0            0.0/s
  memory                                 0            0.0/s
  bad-timestamp                          0            0.0/s
  congestion                             0            0.0/s
  ip-option                              0            0.0/s
  proto-cksum                            0            0.0/s
  state-mismatch                         0            0.0/s
  state-insert                           0            0.0/s
  state-limit                            0            0.0/s
  src-limit                              0            0.0/s
  synproxy                               0            0.0/s
  map-failed                             0            0.0/s

开启/关闭/重启 pflog 服务的命令

输入下面这些命令:

# service pflog start
# service pflog stop
# service pflog restart

第四步:pfctl 命令的简单介绍

你需要使用 pfctl 命令来查看 PF 规则集和参数配置,包括来自 包过滤器 packet filter 的状态信息。让我们来看一下所有常见命令:

显示 PF 规则信息

# pfctl -s rules

示例输出:

block return in log all
block drop out all
block drop in quick on ! vtnet0 inet from 172.xxx.yyy.zzz/24 to any
block drop in quick inet from 172.xxx.yyy.zzz/24 to any
pass in quick on vtnet0 inet proto tcp from 139.aaa.ccc.ddd to 172.xxx.yyy.zzz/24 port = ssh flags S/SA keep state label "USER_RULE: Allow SSH from 139.aaa.ccc.ddd"
pass inet proto icmp all icmp-type echoreq keep state
pass out quick on vtnet0 proto tcp from any to any port = domain flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = ntp flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = smtp flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = http flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = https flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = ftp flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = ssh flags S/SA keep state
pass out quick on vtnet0 proto udp from any to any port = domain keep state
pass out quick on vtnet0 proto udp from any to any port = ntp keep state

显示每条规则的详细内容

# pfctl -v -s rules

在每条规则的详细输出中添加规则编号:

# pfctl -vvsr show

显示状态信息

# pfctl -s state
# pfctl -s state | more
# pfctl -s state | grep 'something'

如何在命令行中禁止 PF 服务

# pfctl -d

如何在命令行中启用 PF 服务

# pfctl -e

如何在命令行中刷新 PF 规则/NAT/路由表

# pfctl -F all

示例输出:

rules cleared
nat cleared
0 tables deleted.
2 states cleared
source tracking entries cleared
pf: statistics cleared
pf: interface flags reset

如何在命令行中仅刷新 PF 规则

# pfctl -F rules

如何在命令行中仅刷新队列

# pfctl -F queue

如何在命令行中刷新统计信息(它不是任何规则的一部分)

# pfctl -F info

如何在命令行中清除所有计数器

# pfctl -z clear

第五步:查看 PF 日志

PF 日志是二进制格式的。使用下面这一命令来查看:

# tcpdump -n -e -ttt -r /var/log/pflog

示例输出:

Aug 29 15:41:11.757829 rule 0/(match) block in on vio0: 86.47.225.151.55806 > 45.FOO.BAR.IP.23: S 757158343:757158343(0) win 52206 [tos 0x28]
Aug 29 15:41:44.193309 rule 0/(match) block in on vio0: 5.196.83.88.25461 > 45.FOO.BAR.IP.26941: S 2224505792:2224505792(0) ack 4252565505 win 17520 (DF) [tos 0x24]
Aug 29 15:41:54.628027 rule 0/(match) block in on vio0: 45.55.13.94.50217 > 45.FOO.BAR.IP.465: S 3941123632:3941123632(0) win 65535
Aug 29 15:42:11.126427 rule 0/(match) block in on vio0: 87.250.224.127.59862 > 45.FOO.BAR.IP.80: S 248176545:248176545(0) win 28200 <mss 1410,sackOK,timestamp 1044055305 0,nop,wscale 8> (DF)
Aug 29 15:43:04.953537 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7475: S 1164335542:1164335542(0) win 1024
Aug 29 15:43:05.122156 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7475: R 1164335543:1164335543(0) win 1200
Aug 29 15:43:37.302410 rule 0/(match) block in on vio0: 94.130.12.27.18080 > 45.FOO.BAR.IP.64857: S 683904905:683904905(0) ack 4000841729 win 16384 <mss 1460>
Aug 29 15:44:46.574863 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7677: S 3451987887:3451987887(0) win 1024
Aug 29 15:44:46.819754 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7677: R 3451987888:3451987888(0) win 1200
Aug 29 15:45:21.194752 rule 0/(match) block in on vio0: 185.40.4.130.55910 > 45.FOO.BAR.IP.80: S 3106068642:3106068642(0) win 1024
Aug 29 15:45:32.999219 rule 0/(match) block in on vio0: 185.40.4.130.55910 > 45.FOO.BAR.IP.808: S 322591763:322591763(0) win 1024
Aug 29 15:46:30.157884 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6511: S 2412580953:2412580953(0) win 1024 [tos 0x28]
Aug 29 15:46:30.252023 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6511: R 2412580954:2412580954(0) win 1200 [tos 0x28]
Aug 29 15:49:44.337015 rule 0/(match) block in on vio0: 189.219.226.213.22640 > 45.FOO.BAR.IP.23: S 14807:14807(0) win 14600 [tos 0x28]
Aug 29 15:49:55.161572 rule 0/(match) block in on vio0: 5.196.83.88.25461 > 45.FOO.BAR.IP.40321: S 1297217585:1297217585(0) ack 1051525121 win 17520 (DF) [tos 0x24]
Aug 29 15:49:59.735391 rule 0/(match) block in on vio0: 36.7.147.209.2545 > 45.FOO.BAR.IP.3389: SWE 3577047469:3577047469(0) win 8192 <mss 1460,nop,wscale 8,nop,nop,sackOK> (DF) [tos 0x2 (E)]
Aug 29 15:50:00.703229 rule 0/(match) block in on vio0: 36.7.147.209.2546 > 45.FOO.BAR.IP.3389: SWE 1539382950:1539382950(0) win 8192 <mss 1460,nop,wscale 8,nop,nop,sackOK> (DF) [tos 0x2 (E)]
Aug 29 15:51:33.880334 rule 0/(match) block in on vio0: 45.55.22.21.53510 > 45.FOO.BAR.IP.2362: udp 14
Aug 29 15:51:34.006656 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6491: S 151489102:151489102(0) win 1024 [tos 0x28]
Aug 29 15:51:34.274654 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6491: R 151489103:151489103(0) win 1200 [tos 0x28]
Aug 29 15:51:36.393019 rule 0/(match) block in on vio0: 60.191.38.78.4249 > 45.FOO.BAR.IP.8000: S 3746478095:3746478095(0) win 29200 (DF)
Aug 29 15:51:57.213051 rule 0/(match) block in on vio0: 24.137.245.138.7343 > 45.FOO.BAR.IP.5358: S 14134:14134(0) win 14600
Aug 29 15:52:37.852219 rule 0/(match) block in on vio0: 122.226.185.125.51128 > 45.FOO.BAR.IP.23: S 1715745381:1715745381(0) win 5840 <mss 1420,sackOK,timestamp 13511417 0,nop,wscale 2> (DF)
Aug 29 15:53:31.309325 rule 0/(match) block in on vio0: 189.218.148.69.377 > 45.FOO.BAR.IP5358: S 65340:65340(0) win 14600 [tos 0x28]
Aug 29 15:53:31.809570 rule 0/(match) block in on vio0: 13.93.104.140.53184 > 45.FOO.BAR.IP.1433: S 39854048:39854048(0) win 1024
Aug 29 15:53:32.138231 rule 0/(match) block in on vio0: 13.93.104.140.53184 > 45.FOO.BAR.IP.1433: R 39854049:39854049(0) win 1200
Aug 29 15:53:41.459088 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6028: S 168338703:168338703(0) win 1024
Aug 29 15:53:41.789732 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6028: R 168338704:168338704(0) win 1200
Aug 29 15:54:34.993594 rule 0/(match) block in on vio0: 212.47.234.50.5102 > 45.FOO.BAR.IP.5060: udp 408 (DF) [tos 0x28]
Aug 29 15:54:57.987449 rule 0/(match) block in on vio0: 51.15.69.145.5100 > 45.FOO.BAR.IP.5060: udp 406 (DF) [tos 0x28]
Aug 29 15:55:07.001743 rule 0/(match) block in on vio0: 190.83.174.214.58863 > 45.FOO.BAR.IP.23: S 757158343:757158343(0) win 27420
Aug 29 15:55:51.269549 rule 0/(match) block in on vio0: 142.217.201.69.26112 > 45.FOO.BAR.IP.22: S 757158343:757158343(0) win 22840 <mss 1460>
Aug 29 15:58:41.346028 rule 0/(match) block in on vio0: 169.1.29.111.29765 > 45.FOO.BAR.IP.23: S 757158343:757158343(0) win 28509
Aug 29 15:59:11.575927 rule 0/(match) block in on vio0: 187.160.235.162.32427 > 45.FOO.BAR.IP.5358: S 22445:22445(0) win 14600 [tos 0x28]
Aug 29 15:59:37.826598 rule 0/(match) block in on vio0: 94.74.81.97.54656 > 45.FOO.BAR.IP.3128: S 2720157526:2720157526(0) win 1024 [tos 0x28]stateful
Aug 29 15:59:37.991171 rule 0/(match) block in on vio0: 94.74.81.97.54656 > 45.FOO.BAR.IP.3128: R 2720157527:2720157527(0) win 1200 [tos 0x28]
Aug 29 16:01:36.990050 rule 0/(match) block in on vio0: 182.18.8.28.23299 > 45.FOO.BAR.IP.445: S 1510146048:1510146048(0) win 16384

如果要查看实时日志,可以运行:

# tcpdump -n -e -ttt -i pflog0

如果你想了解更多信息,可以访问 PF FAQFreeBSD HANDBOOK 以及下面这些 man 页面:

# man tcpdump
# man pfctl
# man pf

关于作者

我是 nixCraft 的创立者,一个经验丰富的系统管理员,同时也是一位 Linux 操作系统/Unix shell 脚本培训师。我在不同的行业与全球客户工作过,包括 IT、教育、国防和空间研究、以及非营利组织。你可以在 TwitterFacebookGoogle+ 上面关注我。


via: https://www.cyberciti.biz/faq/how-to-set-up-a-firewall-with-pf-on-freebsd-to-protect-a-web-server/

作者:Vivek Gite 译者:ucasFL 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如何下载并使用运行在 Ubuntu Linux 服务器上的 KVM 云镜像?如何在 Ubuntu Linux 16.04 LTS 服务器上无需完整安装即可创建虚拟机?如何在 Ubuntu Linux 上使用 KVM 云镜像?

基于内核的虚拟机(KVM)是 Linux 内核的虚拟化模块,可将其转变为虚拟机管理程序。你可以在命令行使用 Ubuntu 为 libvirt 和 KVM 提供的虚拟化前端通过 KVM 创建 Ubuntu 云镜像。

这个快速教程展示了如何安装和使用 uvtool,它为 Ubuntu 云镜像下载,libvirt 和 clout\_int 提供了统一的集成虚拟机前端。

步骤 1 - 安装 KVM

你必须安装并配置 KVM。使用 apt 命令/apt-get 命令,如下所示:

$ sudo apt install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker
$ kvm-ok
## [configure bridged networking as described here][3]
$ sudo vi /etc/network/interfaces
$ sudo systemctl restart networking
$ sudo brctl show

参阅如何在 Ubuntu 16.04 LTS Headless 服务器上安装 KVM 以获得更多信息。(LCTT 译注:Headless 服务器是指没有本地接口的计算设备,专用于向其他计算机及其用户提供服务。)

步骤 2 - 安装 uvtool

键入以下 apt 命令/apt-get 命令

$ sudo apt install uvtool

示例输出:

[sudo] password for vivek: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gksu libgksu2-0 libqt5designer5 libqt5help5 libqt5printsupport5 libqt5sql5 libqt5sql5-sqlite libqt5xml5 python3-dbus.mainloop.pyqt5 python3-notify2 python3-pyqt5 python3-sip
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  cloud-image-utils distro-info python-boto python-pyinotify python-simplestreams socat ubuntu-cloudimage-keyring uvtool-libvirt
Suggested packages:
  cloud-utils-euca shunit2 python-pyinotify-doc
The following NEW packages will be installed:
  cloud-image-utils distro-info python-boto python-pyinotify python-simplestreams socat ubuntu-cloudimage-keyring uvtool uvtool-libvirt
0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,211 kB of archives.
After this operation, 6,876 kB of additional disk space will be used.
Get:1 http://in.archive.ubuntu.com/ubuntu artful/main amd64 distro-info amd64 0.17 [20.3 kB]
Get:2 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 python-boto all 2.44.0-1ubuntu2 [740 kB]
Get:3 http://in.archive.ubuntu.com/ubuntu artful/main amd64 python-pyinotify all 0.9.6-1 [24.6 kB]
Get:4 http://in.archive.ubuntu.com/ubuntu artful/main amd64 ubuntu-cloudimage-keyring all 2013.11.11 [4,504 B]
Get:5 http://in.archive.ubuntu.com/ubuntu artful/main amd64 cloud-image-utils all 0.30-0ubuntu2 [17.2 kB]
Get:6 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 python-simplestreams all 0.1.0~bzr450-0ubuntu1 [29.7 kB]
Get:7 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 socat amd64 1.7.3.2-1 [342 kB]
Get:8 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 uvtool all 0~git122-0ubuntu1 [6,498 B]
Get:9 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 uvtool-libvirt all 0~git122-0ubuntu1 [26.9 kB]
Fetched 1,211 kB in 3s (393 kB/s)        
Selecting previously unselected package distro-info.
(Reading database ... 199933 files and directories currently installed.)
Preparing to unpack .../0-distro-info_0.17_amd64.deb ...
Unpacking distro-info (0.17) ...
Selecting previously unselected package python-boto.
Preparing to unpack .../1-python-boto_2.44.0-1ubuntu2_all.deb ...
Unpacking python-boto (2.44.0-1ubuntu2) ...
Selecting previously unselected package python-pyinotify.
Preparing to unpack .../2-python-pyinotify_0.9.6-1_all.deb ...
Unpacking python-pyinotify (0.9.6-1) ...
Selecting previously unselected package ubuntu-cloudimage-keyring.
Preparing to unpack .../3-ubuntu-cloudimage-keyring_2013.11.11_all.deb ...
Unpacking ubuntu-cloudimage-keyring (2013.11.11) ...
Selecting previously unselected package cloud-image-utils.
Preparing to unpack .../4-cloud-image-utils_0.30-0ubuntu2_all.deb ...
Unpacking cloud-image-utils (0.30-0ubuntu2) ...
Selecting previously unselected package python-simplestreams.
Preparing to unpack .../5-python-simplestreams_0.1.0~bzr450-0ubuntu1_all.deb ...
Unpacking python-simplestreams (0.1.0~bzr450-0ubuntu1) ...
Selecting previously unselected package socat.
Preparing to unpack .../6-socat_1.7.3.2-1_amd64.deb ...
Unpacking socat (1.7.3.2-1) ...
Selecting previously unselected package uvtool.
Preparing to unpack .../7-uvtool_0~git122-0ubuntu1_all.deb ...
Unpacking uvtool (0~git122-0ubuntu1) ...
Selecting previously unselected package uvtool-libvirt.
Preparing to unpack .../8-uvtool-libvirt_0~git122-0ubuntu1_all.deb ...
Unpacking uvtool-libvirt (0~git122-0ubuntu1) ...
Setting up distro-info (0.17) ...
Setting up ubuntu-cloudimage-keyring (2013.11.11) ...
Setting up cloud-image-utils (0.30-0ubuntu2) ...
Setting up socat (1.7.3.2-1) ...
Setting up python-pyinotify (0.9.6-1) ...
Setting up python-boto (2.44.0-1ubuntu2) ...
Setting up python-simplestreams (0.1.0~bzr450-0ubuntu1) ...
Processing triggers for doc-base (0.10.7) ...
Processing 1 added doc-base file...
Setting up uvtool (0~git122-0ubuntu1) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up uvtool-libvirt (0~git122-0ubuntu1) ...

步骤 3 - 下载 Ubuntu 云镜像

你需要使用 uvt-simplestreams-libvirt 命令。它维护一个 libvirt 容量存储池,作为一个 简单流 simplestreams 源的镜像子集的本地镜像,比如 Ubuntu 云镜像。要使用当前所有 amd64 镜像更新 uvtool 的 libvirt 容量存储池,运行:

$ uvt-simplestreams-libvirt sync arch=amd64

要更新/获取 Ubuntu 16.04 LTS (xenial/amd64) 镜像,运行:

$ uvt-simplestreams-libvirt --verbose sync release=xenial arch=amd64

示例输出:

Adding: com.ubuntu.cloud:server:16.04:amd64 20171121.1

通过 query 选项查询本地镜像:

$ uvt-simplestreams-libvirt query

示例输出:

release=xenial arch=amd64 label=release (20171121.1)

现在,我为 Ubuntu xenial 创建了一个镜像,接下来我会创建虚拟机。

步骤 4 - 创建 SSH 密钥

你需要使用 SSH 密钥才能登录到 KVM 虚拟机。如果你根本没有任何密钥,请使用 ssh-keygen 命令创建一个新的密钥。

$ ssh-keygen

参阅“如何在 Linux / Unix 系统上设置 SSH 密钥” 和 “Linux / UNIX: 生成 SSH 密钥” 以获取更多信息。

步骤 5 - 创建 VM

是时候创建虚拟机了,它叫 vm1,即创建一个 Ubuntu Linux 16.04 LTS 虚拟机:

$ uvt-kvm create vm1

默认情况下 vm1 使用以下配置创建:

  1. 内存:512M
  2. 磁盘大小:8GiB
  3. CPU:1 vCPU core

要控制内存、磁盘、CPU 和其他配置,使用以下语法:

$ uvt-kvm create vm1 \
--memory MEMORY \
--cpu CPU \
--disk DISK \
--bridge BRIDGE \
--ssh-public-key-file /path/to/your/SSH_PUBLIC_KEY_FILE \
--packages PACKAGES1, PACKAGES2, .. \
--run-script-once RUN_SCRIPT_ONCE \
--password PASSWORD

其中

  1. --password PASSWORD:设置 ubuntu 用户的密码和允许使用 ubuntu 的用户登录(不推荐,使用 ssh 密钥)。
  2. --run-script-once RUN_SCRIPT_ONCE : 第一次启动时,在虚拟机上以 root 身份运行 RUN_SCRIPT_ONCE 脚本,但再也不会运行。这里给出完整的路径。这对于在虚拟机上运行自定义任务时非常有用,例如设置安全性或其他内容。
  3. --packages PACKAGES1, PACKAGES2, .. : 在第一次启动时安装以逗号分隔的软件包。

要获取帮助,运行:

$ uvt-kvm -h
$ uvt-kvm create -h

如何删除虚拟机?

要销毁/删除名为 vm1 的虚拟机,运行(请小心使用以下命令,因为没有确认框):

$ uvt-kvm destroy vm1

获取 vm1 的 IP 地址,运行:

$ uvt-kvm ip vm1
192.168.122.52

列出所有运行的虚拟机

$ uvt-kvm list

示例输出:

vm1
freebsd11.1

步骤 6 - 如何登录 vm1

语法是:

$ uvt-kvm ssh vm1

示例输出:

Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-101-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Thu Dec  7 09:55:06 2017 from 192.168.122.1

另一个选择是从 macOS/Linux/Unix/Windows 客户端使用常规的 ssh 命令:

$ ssh [email protected]
$ ssh -i ~/.ssh/id_rsa [email protected]

示例输出:

Connect to the running VM using ssh

一旦创建了 vim,你可以照常使用 virsh 命令:

$ virsh list

via: https://www.cyberciti.biz/faq/how-to-use-kvm-cloud-images-on-ubuntu-linux/

作者:Vivek Gite 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux/Unix 系统管理员对服务器的系统运行时间有一种奇怪的痴迷。这里有一个关于这个主题的 xkcd 漫画,一个好的系统管理员是一股不可阻挡的力量,他伫立在你家猫咪博客的服务器之前,对抗黑暗势力。

Fig.01: Devotion to Duty https://xkcd.com/705/

我们可以使用 uptime 命令或 w 命令top 命令来判断 Linux 系统运行了多久。我可以使用 tuptime 工具保留每次重新启动的运行时间,以获得系统运行时间的历史和统计报告

这就像 uptime 命令一样,但输出结果更令人印象深刻。最近我发现了另一种称为 uptimed 的工具,用于记录关于机器的系统运行时间和统计信息。让我们看看如何使用 Linux 操作系统上的 uptimeduprecords 来获得运行时间的记录统计信息。

查找系统运行时间非常简单,只需在基于 Linux 的系统上键入以下命令即可:

$ uptime -p
up 2 weeks, 4 days, 7 hours, 28 minutes

要保留有关 uptime 的历史统计信息,请使用 tuptimeuptimed 工具。

安装 uptimed

安装 uptimed 的最简单的方式是通过你的软件包管理器,比如 apt/apt-get/yum 这些你的 Linux 发行版的朋友。

在 Debian/Ubuntu Linux 上安装 uptimed

键入以下 apt 命令/apt-get 命令

$ sudo apt-get install uptimed

示例输出:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libuptimed0
The following NEW packages will be installed:
  libuptimed0 uptimed
0 upgraded, 2 newly installed, 0 to remove and 3 not upgraded.
Need to get 40.7 kB of archives.
After this operation, 228 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirrors.linode.com/ubuntu xenial/universe amd64 libuptimed0 amd64 1:0.3.17-4 [9,050 B]
Get:2 http://mirrors.linode.com/ubuntu xenial/universe amd64 uptimed amd64 1:0.3.17-4 [31.6 kB]
Fetched 40.7 kB in 0s (2,738 kB/s)  
Preconfiguring packages ...
Selecting previously unselected package libuptimed0.
(Reading database ... 39163 files and directories currently installed.)
Preparing to unpack .../libuptimed0_1%3a0.3.17-4_amd64.deb ...
Unpacking libuptimed0 (1:0.3.17-4) ...
Selecting previously unselected package uptimed.
Preparing to unpack .../uptimed_1%3a0.3.17-4_amd64.deb ...
Unpacking uptimed (1:0.3.17-4) ...
Processing triggers for systemd (229-4ubuntu21) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up libuptimed0 (1:0.3.17-4) ...
Setting up uptimed (1:0.3.17-4) ...
Processing triggers for libc-bin (2.23-0ubuntu9) ...
Processing triggers for systemd (229-4ubuntu21) ...
Processing triggers for ureadahead (0.100.0-19) ...

在 CentOS/RHEL/Fedora/Oracle/Scientific Linux 上安装 uptimed

首先 在 CentOS/RHEL 使用 EPEL 仓库

$ sudo yum -y install epel-release

然后,键入以下 yum 命令

$ sudo yum install uptimed

示例输出:

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.excellmedia.net
 * epel: ftp.cuhk.edu.hk
 * extras: centos.excellmedia.net
 * updates: centos.excellmedia.net
Resolving Dependencies
--> Running transaction check
---> Package uptimed.x86_64 0:0.4.0-6.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================
 Package           Arch             Version               Repository      Size
===============================================================================
Installing:
 uptimed           x86_64           0.4.0-6.el7           epel            47 k

Transaction Summary
===============================================================================
Install  1 Package

Total download size: 47 k
Installed size: 98 k
Is this ok [y/d/N]: y
Downloading packages:
uptimed-0.4.0-6.el7.x86_64.rpm                            |  47 kB   00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : uptimed-0.4.0-6.el7.x86_64                                  1/1 
  Verifying  : uptimed-0.4.0-6.el7.x86_64                                  1/1 

Installed:
  uptimed.x86_64 0:0.4.0-6.el7                                                 

Complete!

如果你正在使用 Fedora Linux,运行以下 dnf 命令:

$ sudo dnf install uptimed

在 Arch Linux 上安装 uptimed

键入以下 pacman 命令:

$ sudo pacman -S uptimed

在 Gentoo Linux 上安装 uptimed

键入以下 emerge 命令:

$ sudo emerge --ask uptimed

如何配置 uptimed

使用文本编辑器编辑 /etc/uptimed.conf 文件,例如 vim 命令:

$ sudo vim /etc/uptimed.conf

最少设置一个 email 地址来发送记录。假定有个兼容 sendmail 的 MTA 安装在 /usr/lib/sendmail

[email protected]

保存并关闭文件。

如何在系统启动时启动 uptimed 服务?

使用 systemctl 命令启动 uptimed 服务:

$ sudo systemctl enable uptimed

我该如何 启动/停止/重启 或者查看 uptimed 服务的状态?

$ sudo systemctl start uptimed ## start it ##
$ sudo systemctl stop uptimed ## stop it ##
$ sudo systemctl restart uptimed ## restart it ##
$ sudo systemctl status uptimed ## view status ##

示例输出:

● uptimed.service - uptime record daemon
   Loaded: loaded (/lib/systemd/system/uptimed.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-11-09 17:49:14 UTC; 18min ago
 Main PID: 11137 (uptimed)
   CGroup: /system.slice/uptimed.service
           └─11137 /usr/sbin/uptimed -f

Nov 09 17:49:14 gfs04 systemd[1]: Started uptime record daemon.

如何查看 uptime 记录

只需键入以下命令即可查看 uptimed(8) 程序的统计信息:

$ uprecords

示例输出:

Fig.02: uprecords in action

uprecords 有一些选项:

$ uprecords -?

示例输出:

usage: uprecords [OPTION]...

  -?             this help
  -a             do not print ansi codes
  -b             sort by boottime
  -B             reverse sort by boottime
  -k             sort by sysinfo
  -K             reverse sort by sysinfo
  -d             print downtime seen before every uptimes instead of system
  -c             do not show current entry if not in top entries
  -f             run continously in a loop
  -s             do not print extra statistics
  -w             wide output (more than 80 cols per line)
  -i INTERVAL    use INTERVAL seconds for loop instead of 5, implies -f
  -m COUNT       show a maximum of top COUNT entries instead of 10
  -M             show next milestone
  -v             version information

结论

这是一个极好的小工具,可以显示服务器正常运行时间的记录,以证明机器正常运行时间和你的业务连续性。在相关说明中,你可以看到官方的 XKCD 系统管理员 T恤 因为漫画被制作成衬衫,其中包括背面的新插图。

Fig.03: Sysadmin XKCD shirt features the original comic on the front and a new illustration on the back.


via: https://www.cyberciti.biz/hardware/see-records-statistics-about-a-linux-servers-uptime/

作者:Vivek Gite 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出