﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-业精于勤荒于嬉，行成于思毁于随-文章分类-Linux</title><link>http://www.blogjava.net/produ/category/55029.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 13 Apr 2017 01:29:35 GMT</lastBuildDate><pubDate>Thu, 13 Apr 2017 01:29:35 GMT</pubDate><ttl>60</ttl><item><title>十四：安装软件，玩转系统！软件包的管理</title><link>http://www.blogjava.net/produ/articles/430481.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Thu, 23 Jul 2015 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430481.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430481.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430481.html</trackback:ping><description><![CDATA[<div>说起安装软件，我们应该很熟悉。在Windows系统下，我们可能需要购买一张软件安装光盘，然后执行&#8220;安装软件&#8221;，然后不断的下一步就好。在Linux的图形界面中，也有类似的操作，但是这里并不讨论图形界面的安装，我们需要知道在命令行下进行软件的安装。</div><div></div><div>Linux的软件安装和Windows有诸多不同，比如Windows有注册表的概念，但是Linux没有；Windows的软件，相关的文件一般都位于自己的目录下，但是Linux不是；Windows的软件有安装版和绿色版，或者说，正版和盗版，但是Linux没有。</div><div></div><div>Linux通过软件包来安装软件，包是一个文件压缩的集合，可以理解为一个压缩包，里面包含了软件的程序，数据，配置，帮助文档，脚本等等，那么我们如何来获得软件包呢？</div><div></div><div>想获得软件包，就需要先知道软件包管理工具。众多的发行版Linux分别隶属两大包管理技术阵营，Debian和Red Hat，这两种风格的Linux使用了不同的包管理技术，Debian风格的Linux使用dpkg底层工具，Red Hat风格的Linux则使用rpm底层工具，但是不同的发行版可能使用了不同的上层工具。</div><div></div><div><strong><br />*你可以简单理解为：底层包管理工具就是拥有基本包管理功能的工具，上层工具就是对底层工具的优化和拓展，更方便使用。</strong></div><div></div><div><br />这里以Rad Hat风格的Linux为例，使用rpm及其上层工具yum作为演示</div><div></div><div><strong><br />安装一个软件包</strong></div><div>示例：rpm -i 软件包，这是最基本的使用，选项-i表示install安装，一般我们会使用rpm -ivh来安装一个软件包，-v表示安装的内容信息，-h来开启进度提示，选项vh一般联合使用，但是在安装的过程中，可能会碰到依赖的问题。比如你要安装一个mysql的控制台程序，那么首先你需要安装mysql，否则你安装了mysql的控制也没法使用，虽然你可以强制安装。安装中，出现依赖的问题，那么你需要手动的先安装依赖的软件包，才能继续安装你所需要的软件包。</div><div></div><div><strong><br />卸载一个软件包</strong></div><div>示例：rpm -e 软件包，如果这个软件包依赖了其他的应用，那么删除的过程中会有错误信息，如果你想强制删除他的话（并不建议这么做），你可以添加&#8211;nodeps选项强制删除。</div><div>示例：rpm -e &#8211;nodeps 软件包</div><div>好了，如果排除其他的细节，那么安装软件就到此为止了呗？在Windows下，你或许可以这么说，但是Linux下的软件管理可不止安装和卸载这么简单。</div><div></div><div><strong><br />查询一个软件是否安装</strong></div><div>示例：rpm -q 需要查询的软件名，-q是查询的选项。如果已经安装，那么就显示相关信息</div><div>但是这有时并不准确，因为软件名可能很长，你给定的名字可能不完全对，所以通过过滤来查找，结果会更理想。</div><div>示例：rpm -qa|grep 软件名，-a表示查询所有软件包</div><div></div><div><strong><br />常见查询命令<br /><br /></strong></div><div><strong>查看一个文件所属的软件包</strong></div><div>示例：rpm -qf（file） 文件名</div><div><strong>查看一个软件包的信息，软件包必须要安装才行</strong></div><div>示例：rpm -qi（information）文件</div><div></div><div><strong>查看一个软件包的信息，安装与否皆可</strong></div><div>示例：rpm -qip（package）软件包名</div><div></div><div><strong>查看一个软件包安装了哪些文件</strong>（我们会看到，一个软件安装的文件会分布在系统中各个不同的目录中，这和Windows就很不同，Windows软件通常会把各种作用的文件都放在自己的目录下，而linux的软件则会根据系统目录的一般作用而放入不同的目录）</div><div>示例：rpm -ql 软件包名</div><div></div><div><strong>查看一个软件包将要安装哪些文件</strong></div><div>示例： rpm -qlp 软件包名</div><div></div><div><strong><br />一些其他常见选项</strong></div><div></div><div><strong><br />排除软件包的文档：&#8211;excludedocs</strong></div><div>指定安装的路径：&#8211;prefix，使用时添加&#8211;prefix=/XXX/XXX，但是要注意，使用rpm安装或者yum安装软件包，该选项的意义不大，因为安装的都是二进制软件包，在安装的时候就已经规定好了软件包要安装的文件的位置，除了使用rpm和yum安装二进制软件包，还有通过源码包和脚本安装的方式进行软件安装。</div><div></div><div><strong>测试一个软件的安装：&#8211;test<br /></strong>安装之前我们需要知道安装这个软件可能出现的问题，所以在安装之前我们可以先测试安装，把问题暴露出来。</div><div></div><div><strong>校验一个软件包</strong></div><div>示例：rpm -V 软件名，如题，对一个软件包含的所有文件进行校验，如果没有问题，那么没有输出。</div><div>如果有问题，那么会产生一个可疑文件列表，列表中会用不同标识来标识可疑文件的疑点。</div><div><br />这些标识如下：</div><div>5：使用MD5校验，校验值发生变化，说明文件的内容被修改了</div><div></div><div><ul><li>S：文件大小产生了变化</li><li>L：文件的链接特征发生变化</li><li>D：文件的设备特征发生变化</li><li>U：文件的用户发生变化</li><li>G：文件的用户组发生变化</li><li>M：文件的权限发生变化</li></ul></div><div></div><div></div><div></div><div></div><div></div><div></div><div>由于底层工具rpm在对依赖的管理上存在不足，所以yum工具的出现，很好的解决的这个问题，在安装的过程中，yum可以自动解决软件包的依赖问题，不必再手动去一个一个安装依赖了。</div><div></div><div><strong><br />一些常见使用方式：</strong></div><div><ul><li>yum install 软件包名，安装一个软件包</li><li>yum chech-update 软件包名，检查一个软件包是否有升级</li><li>yum update 软件包名，升级一个软件包</li><li>yum list，列出yum源中所有的软件包，同时会罗列一些状态信息</li><li>yum info 软件包名，查看软件包的描述</li><li>yum remove 软件包名，删除一个软件包</li></ul></div><div>Debian风格linux的软件包底层管理工具是dpkg，上层管理工具是apt-get，在使用方式上是类似的，这里不再赘述帮助文档的内容，因为这些实现性质的操作，看十遍不如动手做一遍来得印象深刻</div><img src ="http://www.blogjava.net/produ/aggbug/430481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-07-23 10:42 <a href="http://www.blogjava.net/produ/articles/430481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十三：现在到底有谁在干什么？进程</title><link>http://www.blogjava.net/produ/articles/430420.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Thu, 16 Jul 2015 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430420.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430420.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430420.html</trackback:ping><description><![CDATA[<div>首先，什么是进程，我们要把它和程序明确区分开来。</div><div></div><div>先说一下程序吧，程序是一个静态概念，它是&#8220;实际存在&#8221;于操作系统中的一段指令，或者代码，总之，它是一段可以被成功解释的脚本，或者被编译的代码，在操作系统中我们可以直观的看到。</div><div></div><div>而进程是一个动态概念，它是指程序运行的过程。<br /><br /><div><strong>*进程和程序没有直接的关系，一个程序可以启动多个进程，一个进程可以被多个程序调用。</strong></div><br /><div><strong>一个常用的查看进程的命令是ps，他能生成一个当前的进程快照</strong></div>示例：ps<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-15_0-28-25.png" border="0" alt="" width="640" height="93" /><br /><div>直接使用&#8221;ps&#8221;我们可以看到有两行数据，一个bash，也就是当前的shell，另一个就是ps本身。我们看到有一列叫PID，它意为进程的ID；TTY，是teletype的缩写，表示终端的类型。TIME表示占用CPU的时间。</div><div></div><div>不过直接使用ps信息量来得太少，而且他只显示当前终端相关的进程。</div><div></div><div>有一组常用的命令组合是aux，这能给我们提供足够的信息</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-16_0-21-11.png" border="0" alt="" width="640" height="384" /><br /><br /><div>aux选项显示了所有用户的进程。值得一提的是，ps能够接受多个不同版本Unix的参数，比如刚才说的aux这组参数，就是BSD的参数，而列表也是BSD风格的。标准一组常用参数是-ef，和aux类似。</div><div></div><div>以aux这组参数展示的列表为例，说明一下每一列的含义</div><div><ul><li>USER：表示进程的所有者</li><li>PID：进程ID号</li><li>%CPU：CPU的使用率</li><li>%MEM：内存的使用率</li><li>VSZ：虚拟内存大小</li><li>RSS：占用的内容的大小</li><li>START：进程运行的起始时间，超过24个小时则按天显示</li><li>TTY：已经提过，是终端的类型，但是图上我们看到很多终端显示&#8220;？&#8221;，这表示他们没有控制终端</li></ul></div><div>这其中多说一下STATE列，这一列表示进程的状态，进程的状态有很多种</div><div><ul><li>R：运行状态，running</li><li>S：休眠状态，sleeping</li><li>D：不可中断的休眠状态</li><li>T：进程终止</li><li>Z：zombie！这是一个死进程，或者说僵尸进程</li><li>&lt;：高优先级别的进程，&#8220;不友好的进程&#8221;</li><li>N：低优先级别的进程，&#8220;友好的进程&#8221;</li></ul></div><div>上面有几个名词需要额外说一下</div><div><strong>*僵尸进程：一个进程可以产生另外一个进程，产生的新进程则为子进程，如果子进程已经终止，并且父进程没有从进程列表里清空他，那么子进程就变僵尸了&#8230;</strong></div><div></div><div><strong>*进程优先级别：虽然我们在使用电脑的时候，感觉他同时在做许多事情，但其实他是在飞快的轮换着做很多事，飞快的程度让我们感觉不出他是在轮换着执行，更像是同时执行，既然是轮换执行，那么就有先后之分，进程优先级别越高，那么该进程就会占用更多的CPU时间，级别低的自然就占用的少了。</strong></div><br /><div>和ps相似的一个命令叫pstree，输出一个树型结构的进程列表，会展示进程间父/子关系。</div><br /><div><strong>程序启动时，调整进程的优先级别：nice</strong></div><div>nice只能在程序启动时调整他的优先级别</div><div>用法：nice -n 程序，n代表优先级别，取值范围是-20~19，取值范围只能在这里，如果你输入其他的值，比如-30，那么系统会自动调整为-20。</div><div>示例：nice &#8211;20 我的程序，修改&#8220;我的程序&#8221;的优先级别为-20,。注意，参数是&#8220;&#8211;20&#8221;，有两个横杠，第二个横杠代表负，第一个横杠代表参数。</div><br /><div><strong>修改一个正在运行的程序的优先级别：renice</strong></div><div>修改的程序可以正在运行</div><div>用法：renice -n 程序，-n是一个参数</div><div>示例：renice -5 我的程序，&#8220;我的程序&#8221;正在运行，修改他的优先级别为-5。这里的-n是一个参数，-5表示负五，并不是五。</div><br /><div><strong>动态的去查看进程：top</strong></div><div>刚才说过，ps命令是生成一个当前进程的快照，意为只是那一个时刻进程的状态，top命令同样会产生一组进程列表，但是他会定时刷新这组列表，尽量反映最新的进程状态，并且会报告一些进程概要。你可以想象一下Windows下的Ctrl+Alt+Delete</div><br /><div>top命令执行后，上方会显示一个进程的概要</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-16_22-35-30.png" border="0" alt="" width="640" height="384" /><br /><div>概要中比较明显的数值就不一一说明了，但是要看一下那个叫load average的值，他直译过来可以叫做平均负载，他有三个值，这反映了系统最后60s，最后5分钟和最后15分钟内等待运行进程的个数，他可以反映系统忙碌的程度，如果这个值小于1.0，那么说明系统不忙碌。</div><div></div><div>CPU相关的百分比，man给出了一个说明，注意其中是否友好的进程，其实是代表了优先级高与低的进程。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-16_22-46-24.png" border="0" alt="" /><br /><br /><div><strong>查看被暂停的或者后台任务的状态：jobs</strong></div><div>要说明这个命令，我们需要先知道让一个命令后台执行的方法。除了系统的进程以服务的形式在运行之外，我们可以使用&amp;符号来指明一个命令后台运行，通常他可能是一个耗时的操作，比如备份，大范围搜索等。</div><div></div><div>示例：find / -name [a*]&gt;~/res.txt <strong>&amp;</strong></div><div>我们把&#8220;&amp;&#8221;符号连接在一个命令的后面，使得他变为后台运行，同时，我们使用jobs命令来查看他们，他可能会是这样</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-16_23-15-41.png" border="0" alt="" width="640" height="96" /><br /><div>我们可以使用fg和bg命令来控制进程在前后台的切换，比如我们将一个搜索放在后台执行，在他没有完成之前，通过jobs查看，它会显示running状态，此时，我们通过&#8220;fg jobs编号&#8221;命令可以把后台正在运行的进程切换到前台来执行。</div><br /><div><strong>进程的控制：kill</strong></div><div>是的，就是这么直白！干掉他！当然，这也是kill命令最常用的作用，终止一个进程。</div><div></div><div>示例：kill 进程id，当我们通过ps或者top发现我们需要操作的进程之后，我们可以使用kill命令来终止相应pid的进程，注意，我这里说的是终止，并不是像命令所说的那样杀死，因为kill能做的远不止终止一个进程。我们通过kill -l可以查看我们可以发送哪些信号给当前进程。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-16_23-35-38.png" border="0" alt="" width="640" height="187" /><br /><div>我们看到，这里有很多&#8220;信号&#8221;，在我们使用&#8220;kill PID&#8221;的时候，实际上市使用的&#8220;kill -15 PID&#8221;，-15是kill对一个进程发出的默认信号，它代表终止，但是有时候，这种手段并不管用，那么我们需要使用kill -9来终止一个进程，从图中我们可以看出，-9代表kill，它意味着真正的杀死一个进程。</div><div></div><div>因为进程的不同，从而导致了进程接收到终止信号后产生的行为也不同，有些能够乖乖的终止，但有些不能。听话的进程在接收到-15（终止信号）后会做一些善后处理之后终止，而那些不听好的或许不予理睬，那么此时我们需要-9（杀死信号）来终止进程，但是这个信号发出之后就相当于一棍打死，没有给进程余地来善后，所以这也是终止进程的杀手锏。</div><br /><div><strong>根据名字终止进程：killall</strong></div><div>和kill类似，都能够终止进程，但是killall能够根据进程的名称来终止一个或者一组进程</div><div>示例：killall httpd，终止所有httpd进程，当然，你需要root权限才能终止其他用户的进程</div><div></div><div><strong>一些其他的操作</strong></div><div><strong>*终止一个正在运行的程序：Ctrl+c，注意，c是cancel，不是copy</strong></div><div><strong>*挂起（暂停）一个正在运行的程序：Ctrl+z</strong></div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-07-16 11:54 <a href="http://www.blogjava.net/produ/articles/430420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十二：群策群力但又各管东西，多用户和权限</title><link>http://www.blogjava.net/produ/articles/430419.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sun, 12 Jul 2015 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430419.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430419.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430419.html</trackback:ping><description><![CDATA[<div>电脑，通常只有本人一个用户，就算是在多用户的环境下，比如你的爸爸妈妈需要使用电脑，一般也是使用你的账户来使用，而且也是你来教他们使用（开玩笑:0）。个人电脑在多用户的情景下使用，并不多见，Windows中的Guest账户到底有什么用处真的是个谜，但是Linux通常作为服务器的操作系统，一般来说会有多个管理员合作管理，那么账户和账户关系，账户的权限就显得非常的重要了。</div><div></div><div>对于权限，在之前我们已经有过接触，查看目录的时候，我们使用长格式查看目录信息，会打印出文件的权限信息<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-31_20-46-13.png" border="0" alt="" width="640" height="165" /><br /><div>一个用户可以拥有多个文件，一个用户可以属于多个用户组，用户和用户组的信息可以分别查看/etc/passwd和/etc/group文件。/etc/shadow文件保存着用户的密码信息，当然了，是加过密的。</div><div></div><div>图上的蓝色框里代表的是文件模式，也就是权限信息，只有文件的所有者和超级用户才能更改文件模式。<br /><br /><div><strong>chmod：更改文件模式</strong></div><div></div><div>chmod支持两种修改文件模式的方式</div><div><strong><br />第一种：数字权限表示</strong></div><div>文件模式分成了三组，每组都有读权限，写权限，执行权限，每一组的权限如果用二进制的数字表示，可以写为111,1代表有该权限，0代表没有，权限设置为111-110-110则意味着文件拥有者拥有读，写和执行三个权限，而用户组成员和其他人只拥有对文件读和写的权限。但是用二进制来设定很麻烦，所以，实际使用数字设置权限的时候，使用八进制，比如设置一个文件的权限为只有拥有者可以读写，那么二进制写作110 000 000，在使用chmod命令的时候写作chmod 600。</div><div></div><div>示例，修改一个文件的权限</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-10_0-01-56.png" border="0" alt="" width="640" height="107" /><br /><div><strong>*使用数字修改权限的时候注意不要缺少位数，如果缺少，那么执行&#8220;chmod 60 文件名&#8221;会发生什么？他会认为文件拥有者对该文件没有任何权限，所在用户组有读和写的权限，其他人没有权限，这太可笑了；要是执行&#8220;chmod 6 文件名&#8221;会发生什么？他会认为文件拥有者和所属用户组对该文件没有任何权限，其他人反而有读和写的权限，笑哭&#8230;<br /><br /></strong><div><strong>第二种：字符权限表示</strong></div><div></div><div>相比数字权限表示，字符权限表示更直观一些，控制的更细腻一些。</div><div>示例：</div><div></div><div>chmod [u|g|o|a][+|-|=][r|w|x] 文件</div><div></div><div>u:所有者</div><div></div><div>g:所属用户组</div><div></div><div>o:其他人</div><div></div><div>a:以上全部</div><div></div><div>+/-/=:代表添加，撤销和重设</div><div></div><div>r/w/x：分别代表读权限，写权限和执行权限</div><strong><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-10_0-21-13.png" border="0" alt="" width="640" height="228" /><br /><br /></strong><div><strong>umask:默认文件模式</strong></div><div></div><div>umask命令用来设置文件的掩码，刚听起来可能比较生涩，说白一点就是设置或者查看默认的文件模式。</div><strong><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-10_23-10-03.png" border="0" alt="" width="640" height="81" /><br /></strong><div>显示为0002，什么意思呢？好，我们先新建一个文件test<br /></div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-10_23-14-31.png" border="0" alt="" width="640" height="85" /><br /><div>我们看到，新建文件test的文件模式为rw- rw- r&#8211;<br /><br /><div>我们修改一下umask的值，再新建一个文件试试</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-10_23-17-38.png" border="0" alt="" width="640" height="94" /><br /><div>umask显示的值是文件模式的掩码，是一个八进制的数字。先撇开掩码的第一位，初始后三位是002，变成二进制数就是000 000 010，这个掩码对应的权限就是rw- rw- r&#8211;，之后我们修改掩码，变为000 000 000，这时候掩码对应的权限就是rw- rw- rw-，是不是已经能看出倪端了？对，当我们将二进制格式的掩码某一位设置为0，实际上是打开了该位置的权限（但是执行权限无法开启，这也是处于安全考虑，新建的文件没有执行权限）</div><br /><div><strong>那么第一个八进制的0是什么含义？</strong></div><div></div><div>除了常用的读权限，写权限和执行权限，还有一些特别的权限。</div><div></div><div><br />1：setuid位，他在掩码的第一位，如果开启，那么文件权限的掩码应该是4000。setuid有什么作用呢？如果某个文件开启了setuid位，那么该文件执行的时候，该文件具有文件所有者的权限，比如你是一个一般用户，你执行了一个root用户的文件，并且该文件设置了setuid位，那么文件执行的时候是拥有root权限的，所以对于setuid位的设置要慎重。</div><div></div><div>如何开启setuid位呢</div><div>chmod u+s 文件，表示开启setuid</div><div></div><div><br />2：和setuid位类似，他在掩码的第二位，开启的话，掩码的设置是2000。setgid表示操作一个文件的时候，操作文件的用户组会由当前组变为文件所在组的权限。对于文件所属组不是文件创造者所在组的情况，可能会带来权限的变化。</div><div></div><div>开启setgid</div><div>chmod g+s 文件，开启setgid位</div><div></div><div><br />3：sticky位，掩码中的第三位，开启时，掩码设置是1000，这个权限位通常用来限制访问，如果它开启，那么它能阻止用户删除或重命名文件，除非用户是这个文件所有者，或是超级用户。</div><div></div><div>开启sticky位</div><div>chmod +t 文件</div><div></div><div><br />如何确定某个文件是否开启了setuid位，segid位呢？当某个文件开启了某个特殊权限位，那么在对应的权限分组中，该组的执行权限会显示s。</div><div></div><div>比如某个文件开启了setuid位，那么他的权限是rws r&#8211; r&#8211;；开启了setgid位，则是rw- rws r&#8211;；sticky位则在其他人组中体现，rw- rw- rwt</div><br /><div><strong>su/sudo 身份的切换</strong></div><div></div><div>除非是root用户，否则一般用户在很多情况下都会有对系统进行操作的限制。如果一个一般用户进行某个操作，比如执行某个文件，但是他没有这个文件的执行权限，那么该怎么办呢？最简单粗暴的方式就是注销，使用root用户登录进行操作。虽然可行，但是不可取，毕竟太不方便了。</div><div></div><div><br />su：使用替代用户执行命令</div><div></div><div>这个命令不太好记，全称是run a command with substitute user and group ID，看起来是substitute user的缩写。作用就是使用替代用户来执行操作。</div><div></div><div>示例：切换一个用户，如果不指定用户，那么默认切换到root</div><div></div><div>su [用户]</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-11_15-34-281.png" border="0" alt="" width="640" height="96" /><br /><div>直接使用su之后，系统提示我们输入密码，注意，这里输入的是root用户的密码，而不是当前用户的密码。之后，我们会发现shell提示符酉&#8220;$&#8221;变成了&#8220;#&#8221;</div><br /><div>有一个常用选项是&#8221;-l&#8221;（他有一个别名是&#8220;-&#8221;），添加&#8220;-l&#8221;会出现一个需要登录的shell，加载替代用户的shell环境。我们看到，添加&#8220;-l&#8221;之后登录，初始目录定位到了root用户的家目录</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-11_15-38-54.png" border="0" alt="" width="640" height="93" /><br /><div>其实有时候我们并不需要切换用户，只是需要使用个别用户的权限来做一些操作罢了，还有一个常用选项是&#8220;-c&#8221;，执行一个命令。比如一个一般用户希望查看一下root用户的家目录</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-11_15-56-321.png" border="0" alt="" width="640" height="109" /><br /><div>只执行单个命令，而不是启动一个新的可交互的 shell，使用&#8220;-c&#8221;选项，命令将传递到一个新的shell中执行，所以命令参数需要单引号引起作为一个参数。</div><br /><div><strong>sudo：使用替代用户去执行操作，但是提供灵活的配置</strong></div><div>sudo和su类似，都是以另一个身份去执行某些操作，但是sudo允许管理员进行灵活的配置，比如某些操作只允许特定用户来执行，在经过配置之后，特定用户不需要管理员的密码，只需要输入自己的密码就可以使用管理员权限来执行特定操作。通常情况下，sudo并不会启动一个新的shell，也不会加载其他用户的shell环境。</div><div></div><div>除了切换当前的用户，获取root权限等，我们还需要更改文件的所有者，所属组</div><br /><div><strong>chown：更改文件的所有者和所属组</strong></div><div>这个命令可以同时修改两个所属关系，也可以单独修改。</div><div>命令格式：chown [OPTION]&#8230; [OWNER][:[GROUP]] FILE&#8230;，这是文档的原话，我们添点料</div><div>最简单的使用：chown alvindu327 a.txt，把a.txt文件的所有者从原所有者变为alvindu327</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-11_19-55-56.png" border="0" alt="" width="640" height="110" /><br /><br /><div>然后，说一下比较全面的用法</div><div>1，同时变更所属用户和所属组。chown alvindu327: a.txt，刚才的命令我们可以看到，a.txt的所属组依然属于root，在所属用户之后添加&#8220;:&#8221;，意为着将文件原所属组变更为新用户登陆时的所属组</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-11_19-59-32.png" border="0" alt="" width="640" height="104" /><br /><br /><div>2，单独变更所属用户和所属组。</div><div>chown alvindu327:demonuser a.txt，将a.txt的所属用户变为alvindu327，所属组变更为demonuser</div><div></div><div><br />3，只变更所属组</div><div>chown :onlygrp a.txt，将a.txt的所属组变更为onlygrp，所属者不变</div><div></div><div>接下来还剩下不少命令需要了解，比如新建用户，新建组，修改密码等等，但是一一列举出来没什么意思，为什么不用apropos去模糊查询一下呢，新建用户，或许会是adduser吧，要不createuser？猜测和搜索也是很好的学习方式。</div><br /><div><strong>喔，最后几乎忘了一个重要的内容，虽然常用权限有读，写，和执行，看起来很简单，但是你真正明白他们的含义吗？</strong></div><br /><div><strong>对于文件而言</strong></div><div><ul><li>读权限：表示可以查看这个文件的内容（可以使用cat，less，more等命令进行查看）</li><li>写权限：表示可以修改这个文件的内容（可以使用编辑器修改这个文件）</li><li>执行权限：表示该文件（可能是命令，或者脚本）可以执行</li></ul></div><div><strong>对于目录而言（虽然目录也是文件，但是这里做一个区分）</strong></div><div><ul><li>读权限：表示可以列出目录内的内容（使用ls可以查看文件的内容）</li><li>写权限：表示可以在目录中创建，删除文件（touch文件，mkdir目录，或者rm文件）</li><li>执行权限：表示可以进入到这个目录中</li></ul></div><div>对于常用读写执行权限，我本来也和很多人一样，认为很简单，但是其中真的有几个误区需要扫盲：</div><div><br /><strong>*我对一个文件有写权限，我就可以删除这个文件吗？答案是否定的，写权限仅仅是修改文件的内容而已，如果你需要删除这个文件，你需要拥有对这个文件所在目录的写权限才行。</strong></div><div><strong><br /></strong></div><div><strong>*我对一个目录有读权限，我就可以查看这个目录的内容吗（虽然听起来没什么不对）？答案是否定的，对一个目录有读权限，仅仅是让你能看到这个目录的存在，而查看目录的内容，你需要目录的执行权限，所以，目录的读权限和执行权限一般都是同时存在的，倘若一个目录只有读权限，那就是耍流氓，知道有，看不了；倘若只有执行权限，那就是特供情报，虽然&#8220;没有&#8221;，但是能查看&#8230;</strong></div></div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-07-12 10:49 <a href="http://www.blogjava.net/produ/articles/430419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十一：稍微认识一些厉害的家伙：特殊字符</title><link>http://www.blogjava.net/produ/articles/430413.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Tue, 07 Jul 2015 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430413.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430413.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430413.html</trackback:ping><description><![CDATA[<div>这里要介绍的是一堆特别的家伙，当然，这里是先打个照面，混脸熟，他们会在很多地方出现，有着特殊的含义，执行着特定的功能，这里就先叫他们&#8221;特殊字符&#8220;吧（注意在使用他们的时候不要使用中文输入法，要不会出现问题）</div><div></div><div><strong><br />执行命令的顺序</strong></div><div></div><div><strong><br />1：分号，&#8220;;&#8221;</strong></div><div>第一次接触他的场景或许是在多命令顺序执行的时候。比如说你现在刚登陆系统，你在家目录下，你想查看一下/etc某个目录下的内容，那么你需要cd，回车，如果层次深，那么你或许需要执行多次，最后ls一下。有了分号的帮助，那么就可以这么写</div><div><br />cd /;cd etc;cd XXX;ls&nbsp;</div><div></div><div>命令之间使用分号隔开，你设置好的命令便会依次执行。设想一下，你需要在你的Linux中搭建一个LAMP的web环境，在搭建环境的过程中你会有很多命令要执行，你如果一次的去执行他们，那么会花费你不少时间，因为完成当前命令执行完毕你需要键入下一个命令，有人值守的安装可是很痛苦的，如果这其中有了分号来帮助你实现命令的顺序执行，那么绝对会事半功倍。</div><div><br />但是，使用分号来顺序执行命令有一个缺点，那就是一旦其中某个命令出错，执行的过程不会停止，依旧向后继续执行。这一点并不好，如果命令不涉及改变环境变量，搭建某某运行环境还好，一旦出错，那么定位起来费时费力，所以分号最好使用在影响小的命令组合中。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-05_23-28-47.png" border="0" alt="" width="640" height="175" /><br /><br /><div><strong>2：逻辑与，&#8221;&amp;&amp;&#8220;</strong></div><div>和一般编程语言中的逻辑与类似，他有着这样的格式&#8221;命令1&amp;&amp;命令2&#8220;，如果命令1执行没有出错，那么命令2才会执行，后续命令依次类推，但是只要有一个命令报错，便不会继续向后执行，执行过程停留在报错的命令上。这一个特性就比分号来得好，可以考虑使用它做一个通用的环境安装脚本。<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-05_23-39-18.png" border="0" alt="" width="640" height="103" /></div><br /><div><strong>3：逻辑或，&#8221;||&#8220;</strong></div><div>这里需要注意一下，和常见编程语言中的逻辑或不太一样，编程语言中的逻辑或是&#8221;条件A或者条件B或者条件C等等条件N，这些条件中有一个满足，则整个表达式成立&#8220;，这里的逻辑或的含义是&#8221;命令A||命令B，命令A执行正确则不执行命令B，反之亦然&#8220;</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-05_23-49-28.png" border="0" alt="" width="640" height="82" /><br /><br /><div><strong>*对于一个命令而言，如果能快速的得知是否执行正确？你可以试试<br /></strong></div><div><span style="color: red;">命令 &amp;&amp; echo suc || echo fail</span></div><div>对于一个你指定的命令，如果他执行正确，那么逻辑与的echo suc便会执行，逻辑或便不会执行；倘若命令执行失败，那么逻辑与的echo suc便不会执行，这样一来，逻辑或的前半部分只有命令执行失败的结果，所以逻辑或的echo fail便会执行。</div><br /><div><strong>一些特殊字符会展开一些特殊内容</strong></div><div></div><div><strong>1：匹配任意内容，&#8220;*&#8221;</strong></div><div>&#8220;*&#8221;在文件搜索的时候已经有所接触，是匹配任意字符的意思，但是那是限于文件搜索，如果我们使用echo命令来显示&#8220;*&#8221;呢？我们会发现，echo打印了当前目录下的所有内容，而没有打印&#8220;*&#8221;</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-06_12-46-19.png" border="0" alt="" width="640" height="82" /><br /><div>再试试ls *<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-06_12-48-45.png" border="0" alt="" width="640" height="238" /><br /><div>在含有&#8220;*&#8221;的命令中，shell会在执行前将&#8220;*&#8221;解析为匹配的内容，所以echo不认识&#8220;*&#8221;，没有打印他，ls 没有因为没有&#8220;*&#8221;这个目录而报错，进而正常显示了当前目录及其子目录下的所有内容。</div><div></div><div>其他相关的特殊符号可以在文件搜索的部分找到，<a href="http://www.blogjava.net/produ/articles/430379.html" title="戳我">戳我</a></div><br /><div><strong>2：家目录，&#8220;~&#8221;</strong></div><div>之前提过，使用&#8220;cd&#8221;和&#8220;cd ~&#8221;作用相同，都是定位到当前用户的家目录，如果你在波浪线前面指定一个用户，那么会直接定位到该用户的家目录去，就像&#8220;cd ~duyt&#8221;。</div><div></div><div><strong><br />3：算术表达式，$((表达式))</strong></div><div>在表达式中可以填入整数运算的表达式，俨然一副计算器的样子，算术表达式支持加减乘除，取余（%），求幂（**）等操作，其中，加减乘除取余，不再赘述，运算符和一般编程语言的相同，都是&#8220;+-*/&#8221;，求幂则写为$((2**10))，这样便会输出2的10次方的结果。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-06_13-06-29.png" border="0" alt="" width="640" height="116" /><br /><br /><div><strong>4:花括号匹配，{}</strong></div><div>这家伙和方括号&#8220;[]&#8221;有类似的地方，都能匹配括号里的内容，但是花括号更常见于这个场景：你需要新建一些文件，这些文件可能是你马上使用的日志文件，或者学习笔记，甚至是日记，他们的文件名有类似有不同，不同可能是顺序的日期或其他数字，那么花括号可以帮你完成这个工作。</div><div></div><div>touch 2015-01-{01..31}，这样以来，会马上新建以顺序日期命名的文件，可以省去很多重复的工作。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_0-18-59.png" border="0" alt="" width="640" height="161" /><br /><div>删除的时候也可以使用花括号。</div><br /><div><strong>花括号包含以下几种形式</strong></div><div>1：{X,X,X}，匹配多个字符，使用逗号隔开。</div><div>2：{1..9}，或者{A..Z}等其他类似的写法，这样写会匹配一个范围内的字符。</div><div>3：{{X,X},{X,X}}，嵌套匹配，这样写法，是会产生四种匹配的</div><div>但是，花括号和方括号又有着不同，方括号重点在匹配上，而花括号重点在返回匹配的字符。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_0-35-08.png" border="0" alt="" width="640" height="153" /><br /><br /><div><strong>这是，编程的感觉吗？看看变量和引用</strong></div><div></div><div><strong><br />1：变量定义</strong></div><div>好简单的，&#8220;变量名=变量值&#8221;，在shell中直接键入var=helloworld，那么你就有了一个var变量！</div><div></div><div><strong><br />2：那么引用呢？</strong></div><div>也好简单的，使用&#8221;$变量名&#8221;<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_0-46-36.png" border="0" alt="" width="640" height="117" /><br /><div><strong>3：引用一个命令的结果，&#8220;或者$()</strong></div><div>比如：echo `ls`或者 echo $(ls)，那么打印的将是当前目录的内容</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_1-00-15.png" border="0" alt="" width="640" height="112" /><br /><div>当然了，演示的部分很简单，只是使用了ls命令，引用可以用在更多复杂的命令组合和场景中。</div><br /><div><strong>控制特殊字符的匹配</strong></div><div></div><div>1：双引号</div><div>双引号可以用来控制参数个数，排除部分特殊字符的作用。就参数个数而言，当你使用echo打印一些字符</div><div><span style="color: red;">echo a b c &nbsp; &nbsp;d</span>，那么echo会接受4个参数，打印之后，空格，制表符，换行符等把单词分割为不同参数的多余字符会被过滤掉。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_23-04-40.png" border="0" alt="" width="640" height="78" /><br /><br /><div>当我们把含有分隔符号的参数使用双引号引起来，单词，或者说参数的分割就失效了，命令会把双引号内的内容作为一个参数来看待。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_23-08-20.png" border="0" alt="" width="640" height="81" /><br /><br /><div>echo是如此，使用ls的时候，尤其是ls那些含有分隔符号的文件名的时候，双引号就能帮你大忙了。</div><div></div><div>但是在双引号中，shell的特殊字符，除了 $，\ (反斜杠），和 `（倒引号）之外， 将会失去它们的特殊含义，被当作普通字符来看待。这就意味着，刚才提到的参数分割，星号（*）匹配， 波浪线（家目录），和花括号匹配都将失效。参数引用，命令结果引用还有算术表达式仍然生效。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_23-17-10.png" border="0" alt="" width="640" height="281" /><br /><br /><div><strong>2：单引号，完全失效！</strong></div><div>是的，单引号引起来的所有内容都会原样输出，所有特殊字符都会失效功能！</div><div></div><div><strong><br />3：转义字符，反斜杠</strong></div><div>有些时候，显示出个别特殊字符正式我们所需要的，这时候，反斜杠就可以帮到我们。就比如，过去我们常常听到&#8220;衬衫的价格是九磅十五便士&#8221;，那么货币单位就有可能需要转义，原样显示。当然了，美元符号才需要转义，英镑不需要。</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-07_23-28-37.png" border="0" alt="" width="640" height="94" /><br /><br /><div>不过要注意，某些组合是有特殊含义的</div><div>\t：按下tab键，这可是制表符</div><div>\r：回车符号</div><div>\n：新起一行</div><div>\b：退格键</div><div></div><div>目前，shell中一些任性的家伙我们已经有了一个初步的认识。</div></div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-07-07 17:19 <a href="http://www.blogjava.net/produ/articles/430413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十：又来捉迷藏？内容处理</title><link>http://www.blogjava.net/produ/articles/430382.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Mon, 29 Jun 2015 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430382.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430382.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430382.html</trackback:ping><description><![CDATA[<div>通过之前所说的搜索命令，我们可以轻松的定位到所需文件的位置，结合重定向，我们可以查看文件的内容，那么接下来，就该定位文件内容中我们需要的部分了（其实有了重定向，我们能够查找、过滤的内容就不限于文件的内容了，应该是针对某个流内容的查看），起码，操作之前我们可以先查看一下要处理的内容</div><div></div><div><strong><br />查看文件内容，或者说，查看标准输入的内容：cat</strong></div><div></div><div>之前提到过，cat是连接到一个文件，并把文件的内容输出输出屏幕，如果不指定文件，那么cat会等待键盘的输入。</div><div>cat [文件名 &#8230;]，cat可以同时打开多个文件并将内容拼接在一起展示</div><div>示例：有两个文本文件，内容分别如下<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-28_23-52-09.png" border="0" alt="" width="640" height="100" /><br /><br /><div>现在使用cat同时打开他们</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-28_23-54-26.png" border="0" alt="" width="640" height="84" /><br /><br /><div><strong>*注意命令里的通配符，他总会以顺序的方式去匹配</strong></div><div></div><div>cat有一个缺点就是，他会一次加载所有的内容，而且不能分页查看，所以cat就适合查看那些比较简短的内容，查看大量内容用cat并不方便。</div><div></div><div><strong><br />less和more</strong></div><div>没错，这是两个命令，都是用来查看内容的命令，他们用起来更像是电子书查看器，用法和cat类似。可以简单的理解为less是more的增强版，more会一次加载所有内容，支持向后分页查看；less不会一次加载所有内容，只会加载当前查看页面的内容，并且支持前后分页查看。</div><div></div><div><strong><br />head和tail</strong></div><div>虽然less和more提供的分页查看已经能够足够方便了，但是为了方便，还有其他的途径</div><div></div><div><strong><br />查看文件开始的部分：head</strong></div><div>就如同命令本身含义一样，&#8220;头&#8221;，查看开始的一部分，默认会打印前世行的内容，如果指定了多个文件，那么会依次打印每个文件的头内容。</div><div></div><div>示例：head someText*</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-29_22-45-54.png" border="0" alt="" width="640" height="116" /><br /><br /><div><strong>查看文件结尾的部分：tail</strong></div><div></div><div>与head相对，tail会默认打印最后十行的内容，但是tail有一个选项可以让我们持续的观察某个文件的变化，这在我们观察日志文件的时候非常有用</div><div></div><div>示例：tail -f logfile</div><div>键入该命令，logfile文件的内容会保持在屏幕上，最新的内容也会不断出现在屏幕上，这个过程会一直持续到你按下Ctrl+C为止。</div><div></div><div>好了，常用的内容查看命令交代好了，下面就需要对内容进行简单的处理</div><div></div><div>通过管道线，我们可以将一个命令的标准输出可以输送到另一个命令的标准输入，接下来，我们通过管道线，将多个命令组合在一起，变成一个过滤器，来获取我们所需的内容。</div><div></div><div><strong><br />查看内容的概要：wc</strong></div><div>这个命令比较好记，嗯&#8230;wc可以帮助我们查看一个内容的行数，字数，和字节数</div><div>示例：wc someText*</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-29_23-21-32.png" border="0" alt="" width="640" height="96" /><br /><div>多个文件的情况下会添加一个统计信息</div><br /><div><strong>查看内容的概要：sort</strong></div><div>sort命令会排序指定标准输入的内容，默认会按照字母升序的顺序来排列内容，我们查看一下/bin目录下的命令，然后把他们排序输出</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-29_23-25-52.png" border="0" alt="" width="640" height="241" /><br /><br /><div><strong>查看/过滤重复的内容：uniq</strong></div><div>他是unique的缩写，通常，我们组合起来使用</div><div>示例：ls /bin /usr/bin|sort|uniq -d|less，我们可以查看一下那些命令是两个目录下共有的</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-29_23-37-19.png" border="0" alt="" width="640" height="362" /><br /><div>看起来共有的命令还不少</div><div></div><div><strong><br />打印匹配的文本：最酷grep</strong></div><div>默认情况下，grep会打印包含给定信息的行</div><div>示例：ls /bin|grep app<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-29_23-41-04.png" border="0" alt="" width="640" height="149" /><br /><div>常用选项，&#8220;-i&#8221;：忽略大小写，&#8220;-v&#8221;：查询不匹配的行，&#8220;-x&#8221;：只查询完全匹配的行</div><div><br />上面的这些命令单独使用的机会很少，组合在一起成为一个内容过滤器更有意义，就像这样</div><div>ls /bin|sort|uniq|grep zip</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-29_23-50-53.png" border="0" alt="" width="640" height="242" /></div><div>至此，我相信你对内容的处理已经有了一个大概的认识，尤其是这些常用命令</div></div><img src ="http://www.blogjava.net/produ/aggbug/430382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-06-29 15:49 <a href="http://www.blogjava.net/produ/articles/430382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>九：输入与输出，重定向</title><link>http://www.blogjava.net/produ/articles/430380.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sat, 27 Jun 2015 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430380.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430380.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430380.html</trackback:ping><description><![CDATA[<div>目前我们用到的大多数命令都是有输入和输出的，这不难理解，一个命令可能需要得到一个用户指定的参数去执行，然后把执行的结果反馈给用户。当然，这个命令可能不需要人为的指定要输入的参数，会自带默认的参数，比如：pwd；也许，命令给出的信息不是理想的结果，比如ls一个不存在的目录或者文件，命令给出了错误提示。</div><div></div><div>以上种种，都是程序所涉及的输入与输出常见途径。就输入而言，很多程序都从一个叫标准输入的设备得到输入信息，不难想到，这个设备就是我们的键盘，命令行下大多数操作都是通过键盘完成。而输出分为两种，标准输出和标准错误，通常，这两个输出都会直接连接到屏幕，而不是保存到磁盘文件<br /><br />标准输出：<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-26_0-10-18.png" border="0" alt="" width="640" height="182" /><br /><br />标准错误：<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-26_0-11-14.png" border="0" alt="" width="640" height="76" /><br /><br /><div><strong>重定向，就是允许我们自己重新确定输入和输出信息的流向。</strong></div><div></div><div>要实现重定向，我们需要用到重定向符&#8220;&gt;&#8221;,这个符号很形象，像沙漏一样，可以理解为从什么到什么。</div><div>以往，我们使用&#8220;ls -l /&#8221;,会将程序的结果输出到屏幕上，现在，我们使用重定向，将这个结果保存到一个文件中。&#8220;ls -l / &gt; /testls.txt&#8221;，使用&#8220;&gt;&#8221;，把程序的输出结果，从标准输出（屏幕）重定向到指定的文件。</div><div></div><div><strong><br />*之前提到过，&#8220;touch&#8221;命令是新建文件的一种手段，现在，我们知道了帮助命令，我们可以得知，&#8220;touch&#8221;命令的本来作用是更新目标文件的访问和修改时间为当前时间，当目标文件不存在时才会新建一个以目标文件命名的文件，在重定向中，我们指定的重定向目标文件不存在时，也会新建一个文件。这也是新增文件的一种手段。可以说，当有输出发生的时候，目标文件不存在，那么会新增一个文件。</strong></div><div></div><div><strong><br />文件查看命令：cat</strong></div><div>cat命令的作用是连接到一个文件，并把文件内容输出到标准输出</div><div>好了，我们查看一下刚才重定向的文件</div><div></div><div>示例：cat /testls.txt<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-26_0-14-10.png" border="0" alt="" width="640" height="275" /></div><div>呃，并没有高亮显示来区别文件内容，毕竟不是&#8220;ls&#8221;命令有高亮显示，保存的只是纯文本信息。</div><br /><div>我们再尝试一下重定向错误信息到testls.txt文件<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-26_0-22-30.png" border="0" alt="" width="640" height="79" /><br /><div>文件之前保存的内容也不见了！之所以会这样，是因为我们只指定了标准输出的重定向，但是标准输出因为错误而中断了（目标文件不存在，所以压根没有输出），所以标准输出没有任何内容。<br /><br /><div><strong>*所以直接使用重定向符号&#8220;&gt; something.txt&#8221;会直接创建一个空文件，或者清空同名文件的内容</strong></div><div></div><div><strong><br />重定向追加操作符&#8220;&gt;&gt;&#8221;</strong></div><div>当我们把&#8220;ls -l / <strong>&gt;</strong> /testls.txt&#8221;改为&#8220;ls -l / <strong>&gt;&gt;</strong> /testls.txt&#8221;，那么意味着，如果目标文件不存在，会新建一个目标文件，并将标准输出输出到该文件，如果存在，那么会将标准输出追加到该文件的尾部。</div><div></div><div><strong><br />重定向标准错误</strong></div><div>为了能使用重定向错误，我们需要先知道，Linux在执行一个程序的时候会打开多个流，我们把前三个看做标准输入，标准输出，标准错误，他们在shell中有各自的文件描述符（可以理解为流编号），分别是0,1,2，当我们使用&#8220;&gt;&#8221;重定向标准输出时，我们实际上是重定向了文件描述符为1的流，也就是说</div><div>&#8220;ls . &gt; a.txt&#8221;等同于&#8221;ls . 1&gt; a.txt&#8221;</div><div></div><div><br />那么重定向标准错误也就是</div><div>&#8220;ls null 2&gt; a.txt&#8221;</div><div>假定null是一个不存在的文件，命令执行之后，产生的错误信息会重定向到你指定的文件。</div><div></div><div><br />还可以使用&#8220;&gt;&amp;&#8221;（或者&#8220;&amp;&gt;&#8221;）来把标准输出和标准错误都重定向到一个位置</div><div>&#8220;ls null &gt;&amp; a.txt&#8221;</div><div><br />这样，两种输出信息都会写到a.txt中。这是一种联合的写法，可以更具体去写</div><div></div><div>&#8220;ls null &gt; a.txt 2&gt;&amp;1&#8220;重定向标准输出到a.txt文件，然后重定向标准错误到标准输出。这里要注意顺序，需要先重定向标准输出，再重定向标准错误，如果顺序反过来，那么标准错误会重定向到屏幕。</div><div></div><div><br />为了能更好的了解这些数字所对应输入输出的关系，我们进一步来说明一下。在Linux中，一切皆文件，设备也是如此，我们查看一下设备挂载点</div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-04_10-19-27.png" border="0" alt="" width="640" height="384" /><br /><div>其中我们看到，有stderr，stdin，stdout三个软连接，他们分别指向了proc挂载点下的三个文件，在这里，我们其实已经能找到文件描述符和输入输出的对应关系，文件描述符0，1，2都指向了同一个设备/dev/pts/0，这个设备中前三个流我们使用文件描述符0，1，2来规定为标准输入，输出和错误。这里额外说一句，为什么文件描述符会指向/dev/pts/0这个设备呢，因为演示的时候是使用的装有Xwindow图形界面的Linux，我们是在使用一个叫终端控制台的东西在和shell进行交互，在这种情况下，/dev/pts/n（n代表序号，0代表当前终端，1代表第一个，2代表第二个，以此类推）是在Xwindow模式下的伪终端。如果在纯Shell环境下，我们使用的设备将不是/dev/pts/n，而是/dev/tty1。关于终端的更多信息，可以自行查阅。</div><br /><div>Xwindow：<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-04_10-22-37.png" border="0" alt="" width="640" height="117" /><br /><br />Shell:<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-07-04_10-48-04.png" border="0" alt="" width="640" height="67" /><br /><br /><div><strong>重定向标准输入</strong></div><div>刚才我们使用了cat命令，cat命令的标准输入是什么呢？之前我们指定了一个文件作为cat命令的标准输入，倘若不指定文件呢？</div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-27_23-39-19.png" border="0" alt="" width="640" height="85" /><br /><div>我们发现命令行正在等待我们的输入，是的，我们没有指定文件作为cat的标准输入，所以cat就查找默认的标准输入：键盘，我们输入一段字符，按下&#8220;ctrl+d&#8221;来通知cat已经完成写入，按下回车，我们刚才键入的文字出现在了屏幕上。</div><div></div><div>好了，重定向的功能已经实现了，不是么，但是这里我们并没有使用重定向符号&#8221;&gt;&#8221;，对于cat命令，我们可以</div><div>cat &lt; someText.txt 来重定向cat的标准输入</div><div><strong>*&#8221;&lt;&#8220;和&#8220;&gt;&#8221;，还有&#8221;&gt;&gt;&#8221;都可以重定向</strong></div><div></div><div><strong><br />Linux里的黑洞，神话中的貔貅，/dev/null文件</strong></div><div>我想已经能够很清楚的描述/dev/null的作用了，首先/dev/null是一个文件,通过文献，也可以得知他叫&#8220;位存储桶&#8221;，他能处理掉任何写入他的信息，换言之，写入后不作任何处理。如果我们重定向输出到位存储桶，那么他既不会存储，也不会输出，但是会提示写入成功。用来处理异常信息是个不错的选择。</div><div></div><div><strong><br />连接命令间的输入与输出，管道线</strong></div><div>管道线，写作&#8220;|&#8221;，对，很形象，作用也很形象，就是连接命令之间的输入和输出。</div><div>示例：</div><div>&#8220;ls -l / | cat&#8221;，加不加管道线联合cat都会在屏幕上输出，虽然在这里，管道线看上去没什么作用，但是再看下面这个例子</div><div>&#8220;ps -ef|grep XXX&#8221;，简而言之就是，找到我们所需的进程，ps命令执行之后会在屏幕上展示当前所有进程，通过管道线，将这个输出作为grep命令的输入，找到匹配我们给定字符的行并在屏幕上展示</div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-06-27 15:24 <a href="http://www.blogjava.net/produ/articles/430380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>八：别玩捉迷藏了！搜索命令</title><link>http://www.blogjava.net/produ/articles/430379.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sun, 21 Jun 2015 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430379.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430379.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430379.html</trackback:ping><description><![CDATA[<div>对于任何一个系统而言，文件的搜索是必不可少的，赶紧看一看Linux下&#8220;Ctrl+F&#8221;功能怎么使用！</div><div></div><div><br />简单的快速通过文件名查找：locate</div><div></div><div>示例：locate 文件名，默认模糊匹配在数据文件中包含指定文件名的记录。locate命令一个最大的特点在于搜索的速度非常快。因为locate命令不是对本地磁盘上的文件直接进行搜索，而是搜索一个数据文件的内容（当然了，这个数据文件需要包含本地磁盘的文件信息）。这个文件通常位于/var/lib/mlocate（Linux版本之间可能会有细微的不同），看到这里你可能会想，新增的文件是不是会同步的被写入到这个数据文件中呢，答案是不一定，这要看系统刷新数据文件的频度，一般来说是一天，但是你也可以手动强制通过updatedb命令来刷新数据文件的内容（该命令略占系统资源，不要频繁使用）。</div><div></div><div><br />不过呢，有些时候，我们搜索一些明明存在的文件时却搜索不到，使用了updatedb命令之后也没有效果。</div><div>做一个演示，在系统&#8220;/tmp&#8221;目录下新建一个文件，名为12345678910.test，这个文件名我认为已经够特殊了。<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-21_11-22-01.png" border="0" alt="" width="640" height="125" /><br />现在使用locate命令来查找这个文件当然找不到，使用了updatedb之后呢？答案是依然找不到。。这就让人纳闷了，这命令好不好用，为什么找不到，我本人新建的文件，明明摆在那里。<br /><div></div><div>通过不断的man，你会定位到一个叫&#8220;/etc/updatedb.conf&#8221;的文件，打开看一下</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-21_11-29-17.png" border="0" alt="" width="640" height="136" /><br /><div>其中我们看到了&#8220;/tmp&#8221;目录，这有什么联系呢？</div><div></div><div><br />当你阅读完帮助文档之后你就会明白，数据文件的加载是有一定的规则的，这些个规则就在&#8220;/etc/updatedb.conf&#8221;文件中配置，我们会看到，这个配置文件中定义了哪些文件系统需要排除扫描，哪些文件名需要排除扫描，以及哪些目录需要排除扫描。而上图中，&#8220;/tmp&#8221;目录被列入排除扫描的路径，所以，我们在&#8220;/tmp&#8221;目录下做演示，出现搜索不到的问题，就没有任何问题。</div><div></div><div>locate命令能够快速的定位到文件，开销小，效率高，但是遗憾的是，他只能根据文件名来定位文件，而且使用上还有一些不方便（效率带来的代价），或许要刷新数据文件，修改配置文件。</div><br /><div><strong>强大的文件搜索命令：find</strong></div><div>find命令非常强大，选项非常多，以至于你能想象到的搜索功能他几乎都能实现。下面列举几个常用的示例。</div><div></div><div><strong><br />示例1：通过文件名匹配</strong></div><div></div><div>find [目录] -name 文件名，目录是可选项，如果不设置，则从根目录开始匹配，但是强烈建议缩小查找的范围，节约系统开销，如果有需要，还可以添加&#8220;-i&#8221;选项忽略大小写</div><div></div><div>find ~ -name demoFile，查找家目录下名为demoFile的文件</div><div></div><div>说到通过文件名来匹配，那么通配符是一定要知道的，find命令结合通配符能够完成日常很多查询工作。</div><div></div><div><strong><br />常用通配符：</strong></div><div><strong>*注意，使用通配符的时候需要给匹配表达式添加引号引起</strong></div><div></div><div><strong>*：匹配任意多个字符（包括零个或一个）</strong></div><div>示例：find ~ -name &#8220;a*&#8221;，查找家目录下所有以a开头的文件</div><div><strong>?：匹配任意一个字符（不包括零个）</strong></div><div>示例：find ~ -name &#8220;a???&#8221;，查找家目录下所有以a开头，文件名长度为四个字符的文件</div><div><strong>[characters]：匹配任意一个属于字符集中的字符</strong></div><div>示例：find ~ -name &#8220;[abc]*&#8221;.txt，查找只能包含a或b或c任意一个或多个任意组合，并且以&#8221;.txt&#8220;结尾的文件</div><div><strong>[!characters]：匹配任意一个不是字符集中的字符</strong></div><div>同上，取反</div><div><br /><strong>常用字符类：</strong></div><div><strong>匹配一个字符类，[[:class:]]：匹配任意一个属于指定字符类中的字符</strong></div><div></div><div><strong>[:alnum:]：匹配任意一个字母或数字</strong></div><div>示例：find ~ -name &#8220;[[:alnum:]]*.cfg&#8221;，查找家目录下含有字母或者数字，并且以&#8221;.cfg&#8221;结尾的文件</div><div>下列字符类使用方式相同</div><div>[:alpha:]：匹配任意一个字母</div><div>[:digit:]：匹配任意一个数字</div><div>[:lower:]：匹配任意一个小写字母</div><div>[:upper]：匹配任意一个大写字母</div><div></div><div><strong><br />示例2：通过所属用户来匹配</strong></div><div>有些时候，在一些公共目录，有很多其他用户创建的文件，我们需要把他们过滤掉</div><div>指定所属用户：-user 用户名</div><div>示例：find /tmp -user root -name &#8220;a*&#8221;，查找tmp目录下所有以a开头并且属于root用户的文件</div><div></div><div>顺便一提，有些文件没有所属用户，可以添加-nouser进行筛选。（没有所有者的文件，一般认为是垃圾文件，但是内核产生的文件不会有所有者，比如内存文件，或者是外来文件，一般是外接设备带来的数据，除了这两种情况，其他情况都视为垃圾文件）</div><div><br /><strong>示例3：通多特定时间来匹配</strong></div><div>-atime 文件访问时间 +-10（默认单位&#8221;天&#8220;）</div><div>-ctime 改变文件属性 +-10</div><div>-mtime 修改文件内容 +-10</div><div>示例：</div><div>find ~-mtime +10 搜索十天之前，修改过内容的文件</div><div>find ~ -ctime -10 搜索十天之内，修改过文件属性</div><div>find ~ -atime 10 过去的第十天，被访问过的文件</div><div><strong><br />示例4：通过文件大小来匹配</strong></div><div></div><div>-size 25k</div><div>find /root -size 25k 搜索刚好是25k的文件（但是文件大小一般不会这么巧是25k，尝试搜索&#8221;+大于&#8220;或者&#8221;-小于&#8220;k）</div><div></div><div><strong><br />示例5：组合匹配</strong></div><div>也就是多条件查询</div><div>-a：and</div><div>find ~ -size +25k -a -size -75k，查找大小介于25~75k的文件</div><div>-o：or</div><div>find /root -size +25k -o -size -10k，只需要大于25k或者小于10k的文件</div><div></div><div><strong>之前提到过的种种选项，都可以组合使用，比如就写一个长一点的</strong></div><div>find ~ -name &#8220;a*&#8221; -user root -a -size -5k -a -atime 1，查找以a开头，属于root用户，并且要小于5k，还需要在一天之内被访问过的文件。</div><div></div><div><strong><br />命令交接</strong></div><div>-exec XXX {} \; 固定格式 ，XXX代表需要的命令，但是要注意，不是所有命令都适用</div><div></div><div>find ~ -size +25k -o -size -10k -exec ls -l {} \;</div><div>将查询的结果通过一个指定的命令进行处理</div><div></div><div>上面记录的仅仅是选项中很小的一部分，更多需求还需要查阅帮助手册或者搜索引擎。</div></div><img src ="http://www.blogjava.net/produ/aggbug/430379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-06-21 14:47 <a href="http://www.blogjava.net/produ/articles/430379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>七：更好的认识命令，帮助命令</title><link>http://www.blogjava.net/produ/articles/430378.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sun, 14 Jun 2015 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430378.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430378.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430378.html</trackback:ping><description><![CDATA[<div>我们已经用过几个命令了，但是我们会发现，命令有选项，并且将来会有越来越多其他的命令。当我们通过各种渠道了解到某个命令的时候，我们第一反应就是这个命令能做什么，怎么做，当然，求助搜索引擎的确是一个不错的选择，不过某些时候我们需要更快的在第一时间对某个命令有一个大概的认识，那么我们就需要知道&#8220;命令的帮助命令&#8221;。</div><div></div><div>首先，命令可以有多种存在形式，它可以是bin/sbin目录下的二进制文件，可以是一个shell内置的命令，可以是一段shell脚本，甚至一个命令的别名。不管是什么形式，命令就是一段计算机能够理解的指令。</div><div></div><div>既然命令有诸多类别，那么我们或许需要先知道我们想要了解的命令属于哪个类别。<br /><br /><div><strong>命令类别查看命令：type</strong></div><div>示例：type 命令</div><div>不妨先查看一下type命令本身<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-12_0-46-45.png" border="0" alt="" width="640" height="83" /><br /><div>可以看到，type是一个shell内置的命令<br /><br /><div>再看看常用的&#8220;ls&#8221;<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-12_0-48-06.png" border="0" alt="" width="640" height="80" /><br /><div>呃，看起来&#8220;ls&#8221;是一个别名，可以添加颜色区分文件类型。<br /><br /><div>再看看&#8220;passwd&#8221;</div></div></div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-12_0-52-47.png" border="0" alt="" width="640" height="83" /><br /><div>喔，看来&#8220;passwd&#8221;是一个位于bin下的命令</div><br /><div>好了，已经知道了命令的类型，还需要进一步知道命令的作用</div><br /><div><strong>命令帮助命令：man</strong></div><div>man是manual的缩写，要是记忆&#8221;男人&#8220;方便点的话，那就当man记吧</div><div>示例：man 目标命令，先看一下man本身<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_10-46-03.png" border="0" alt="" width="640" height="384" /></div><div>man可以称作是一个系统帮助手册的分页程序，图上的红框内，注明了不同页面包含的章节。可以这么理解，图上的1~9分别对应了同一个命令在不同情境下的使用方法，比如某些命令需要关联文件，那么在查看帮助的时候就可以使用"man [编号] 命令"，查看对应的帮助，passwd就是这样的一个命令。当我们不指定编号的时候，man默认查找编号1的命令帮助，也就是&#8220;可执行程序或者shell命令&#8221;的帮助。但是，并不是每个命令都有1~9九种级别的帮助，添加&#8220;-f&#8221;选项可以看到命令有哪些级别的帮助，同时，man -f还有一个自带的别名whatis。<br /><br /><div><strong>查看命令所有级别的帮助man -f（whatis）</strong></div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_11-15-12.png" border="0" alt="" width="640" height="97" /><br /><div>可以看到passwd命令含有1和5两种级别的帮助信息，除了包含passwd命令的使用帮助，还包含了passwd文件的帮助信息。<br /><br /><div>好了，最常用的cd命令总要查看一下吧</div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_11-19-59.png" border="0" alt="" width="640" height="384" /><br /><br /><div>啊，这么一大堆，而且看起来很乱，看上去直接和&#8220;cd&#8220;命令相关的信息还不多，往下翻一翻，喔，找到了！<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_11-19-59.png" border="0" alt="" width="640" height="384" /></div><div>但是，查看&#8221;cd&#8220;命令的帮助，好像查看的不仅是&#8221;cd&#8220;命令的帮助，man cd键入之后，帮助的&#8221;NAME&#8220;项对应了很多命令名，他们之中有cd，还有其他很多。他们都是shell内置的命令。<br /><br /><div><strong>查看内部命令的帮助：help</strong></div><div>示例： help 命令名，以cd为例<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_11-32-08.png" border="0" alt="" width="640" height="322" /><br /><div>这样看起来就清晰多了，就好像从刚才的内置命令手册中直接抓取需要的部分一样。</div><div>好了，我们知道了查看命令类型，查看命令使用详细，命令的级别，那么，这个命令到底放在哪里呢？<br /><br /><div><strong>命令查找命令：which</strong></div></div><div>示例：which 命令名，但是which只能查看可执行程序所在的位置，不包括内置命令，如果命令包括别名，那么同时会把别名展示出来<br /><br /><div>当查看内部命令的时候，会提示没有查找到。</div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_11-43-30.png" border="0" alt="" width="640" height="81" /><br /><br /><div>查看&#8221;ls&#8220;，同时显示命令的别名。</div></div></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_11-47-13.png" border="0" alt="" width="640" height="88" /><br /><br /><div><strong>另一个命令查找命令：whereis</strong></div><div>示例：whereis 命令名，和which命令的功能类似，但是使用whereis不限于可执行程序，而且还会把命令相关的文档的位置打印出来。</div><div>好了，目前来说，我相信帮助命令已经能帮到你了，但是，帮助命令虽然强大，总是抵不过我们的遗忘。</div><div></div><div><strong>*如果某些个命令我记不大清楚了，这样就算我知道帮助命令也查不了了&#8230;</strong></div><div></div><div>针对这一点，man -k 可以帮到我们，他们帮我们搜索帮助手册，找到我们记忆中零星的线索，同时，他还有一个别名apropos。所以至少要记住man这个帮助命令啊<br /><br /><div><strong>命令模糊查找命令：man -k（apropos）</strong><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_12-00-59.png" border="0" alt="" width="640" height="212" /><br /><div>如果我只记得pass，模糊查找之后会把和pass相关的命令以及对应的级别显示出来，很方便。</div><div><br /><strong>*我记得某个命令怎么拼写，但是我不需要查看那么一大堆帮助说明，搜索引擎搜索也太慢，问别人显得太low，如何逃出困境，显得高大上？</strong></div><div></div><div><strong>显示选项用法信息就好</strong></div><div>示例：命令名 &#8211;help，如此一来，会简约的显示该命令的选项用法，不会长篇大论的轰炸你！但是前提是你已经很清楚这个命令是怎么使用的了</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-14_12-06-49.png" border="0" alt="" width="640" height="155" /></div></div><div>其实帮助命令和帮助信息远不止上述这一些，GUN项目提供了info程序来提供帮助，info程序通过info文件来加载帮助信息，在其中可以通过超链接来定位到你需要的信息，直接键入info就可以进入info程序。除了info，你未来安装的各种软件也会提供帮助信息，他们通常会放在/usr/share/doc下。</div><div></div><div>命令已经如此之多，帮助命令也不是一个两个，但是帮助命令的存在是为了让你更好的使用系统，如何使用见仁见智。</div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-06-14 14:34 <a href="http://www.blogjava.net/produ/articles/430378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>六：shell下生存进阶，文件命令</title><link>http://www.blogjava.net/produ/articles/430374.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Tue, 09 Jun 2015 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430374.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430374.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430374.html</trackback:ping><description><![CDATA[<div>继我们能在shell下愉快的&#8220;点击鼠标&#8221;，恣意地在系统的目录间溜达后，我们肯定需要在系统中增增减减，删删改改，充分的使用和个性化自己的系统。现在，在自己的家目录下新增一个以自己名字命名的文件。</div><div></div><div><strong><br />一个新增文件的手段：touch</strong><br />示例：touch 文件名&#8230; 多个文件名用空格隔开，可以新增多个文件<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-06-02_22-25-57.png" border="0" alt="" width="640" height="190" /><br /><div>新增一个文件的方式有很多种，但是有些方式，或者有些命令的作用本不是新增一个文件，新增文件可能只是一个附带的功能，随着不断地学习，会了解更多的新增文件的方式，这里先知道touch可以新增文件。</div><div></div><div><strong><br />新增目录命令：mkdir</strong></div><div>mkdir是make directories的缩写</div><div><br />示例：mkdir 文件夹名&#8230; 多个文件夹名用空格隔开，可以新增多个文件夹</div><div>好了，文件和文件夹都能创建了，常用的复制粘贴大法可是必修技能</div><div></div><div><strong><br />复制文件或目录命令：cp</strong></div><div>cp是copy的缩写</div><div><br />示例：</div><div>cp file&#8230; 目标目录，复制一个或者多个文件到目标目录，多个文件之间用空格隔</div><div>cp file1 file2 ，创建一个名为file2的file1副本到当前目录（如果已存在file2文件，那么会覆盖旧文件，添加选项&#8220;-i&#8221;可以给出覆盖确认的提示）</div><div>cp -r dir1 dir2，复制目录dir1中的内容到目录 dir2。如果目录dir2不存在，创建目录dir2，复制后，目录dir2中的内容和dir1中的一样。 如果目录dir2存在，则目录dir1(和目录中的内容)将会被复制到dir2中。（&#8220;-r&#8221;递归复制，复制文件夹及其内容必须添加该选项）</div><div>移动/重命名文件或目录命令：mv</div><div></div><div><strong><br />mv是move的缩写</strong></div><div>和cp命令的用法基本一致，只不过要注意的是，mv命令包含的两种功能</div><div><br />示例：</div><div>mv file&#8230; 目标目录，移动一个或者多个文件到目标目录，多个文件之间用空格隔开</div><div>mv file1 file2，将file1文件重命名为file2（如果已存在file2文件，那么会覆盖旧文件，添加选项&#8220;-i&#8221;可以给出覆盖确认的提示）</div><div>mv dir1 dir2，dir2目录存在，则dir1目录及其内容会被移动到dir2中，如果dir2目录不存在，那么重命名dir1为dir2</div><div>删除文件或目录命令：rm</div><div></div><div><strong><br />rm是remove的缩写</strong></div><div>*在这里值得注意的是，shell下是没有回收站这一说的，在使用rm命令的时候要格外的小心，所以，删除之前不妨再次列表展示一下要删除的文件，确保万无一失。</div><div></div><div>示例：</div><div>rm file1 file2 &#8230;，删除一个或多个文件，多个文件名之间用空格隔开</div><div>rm -r dir1 dir2 &#8230;，删除一个或多个文件夹及其所包含的内容，多个文件夹名字之间用空格隔开（&#8220;-r&#8221;递归删除，删除文件夹必须添加的选项）</div><div>rm -rf file dir &#8230;，强制删除file文件和dir文件夹，无论他们是否存在，不会给出相关提示（&#8220;-f&#8221;强制执行，忽略不存在的目标，没有相关提示）</div><div><br /><strong>链接命令：ln</strong></div><div></div><div>在Windows中，我们经常使用右键为一个文件创建快捷方式，在Linux下，同样也可以做到。但是，在Linux中，使用&#8220;ln&#8221;创建的链接有软硬之分。</div><div></div><div><strong><br />创建软链接</strong></div><div>在硬盘的每个分区上，都有一个分区表，这其中记录着这个文件系统的文件信息。比如某一条记录会有文件的文件名，大小等，创建一个软链接之后，软链接在分区表中并不会记录目标文件的这些信息，而是记录了目标文件和分区表相关的信息，比如目标文件的分区表信息在哪个盘符等等，并不记录分区表信息的内容。因为软链接记录的是目标文件的分区表信息，所以软链接可以创建跨盘符的链接，可以对目录创建链接，而且删除这个软链接不会对源文件造成任何影响，但是一旦删除了源文件，那么这个软链接就失效了，变成了一个垃圾链接，垃圾链接在&#8220;ls&#8221;查看详细信息的时候会有特别的标注，留意观察一下。当你打开一个软链接的时候，实际上你打开的是软链接指向的那个文件或者文件夹，打开之后的做的任何变动都会反映到目标文件上，但是你如果删除一个软链接，软链接指向的目标文件并不会被删除，这是一个需要特别记住的地方。</div><div></div><div><br />示例：</div><div>ln -s target targetLink，为target文件创建一个名为targetLink的软链接，target可以写成相对或者绝对路径的形式（&#8220;-s&#8221;声明创建的链接是软链接）</div><div></div><div><strong><br />创建硬链接</strong></div><div>记得之前在说到&#8220;ls&#8221;命令的时候接触到一个&#8220;-l&#8221;选项，使用长格式来显示文件列表信息。显示的内容有一列叫做硬链接数量，这里就是说的某个文件已经创建的硬链接数量。硬链接就是文件在某个文件系统中的引用数量。每创建一个硬链接，分区表上就会多一条和源文件相同的分区表记录来记录硬链接名和对应内容的记录，创建好的硬链接和源文件的所有信息都相同，也包括分区表记录，为了能更好的说明这一点，需要为&#8220;ls&#8221;命令添加一个&#8220;-i&#8221;选项，该选项意味着列表显示文件的索引节点，索引节点相同，意味着他们是同一个文件。因此，当你创建一个硬链接，使用&#8220;ls -i&#8221;查看，你会发现目标文件和硬链接的信息完全一致，当然名字可能会不一样。 硬链接的创建不能跨越盘符，因为他们必须在同一个分区内，也不能使用在目录上，当一个文件的所有硬链接都被删除，那么这个文件便没有链接引用他，他本身所占用的磁盘空间也会被删除。或许，你应该猜得到，每个文件的文件名，就是他自身的第一个硬链接。</div><div></div><div>和软链接一样，打开硬链接就是打开目标文件，所做的任何变动都可以保留。当你删除一个硬链接，除非这个硬链接是最后一个硬链接（文件本身），否则不会删除源文件。</div><div></div><div><br />示例：</div><div>ln &nbsp;target targetLink，为target文件创建一个硬链接targetLink，源文件名和硬链接名要在同一个分区下。</div></div><img src ="http://www.blogjava.net/produ/aggbug/430374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-06-09 12:26 <a href="http://www.blogjava.net/produ/articles/430374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>五：shell下生存基础，目录命令</title><link>http://www.blogjava.net/produ/articles/430372.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sun, 31 May 2015 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430372.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430372.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430372.html</trackback:ping><description><![CDATA[<div>对shell有了一个大概的认识之后，就需要知道常用的命令了。shell中，有成百上千的命令，有文献称3000个左右，虽然数量如此庞大，但是常用的命令远没有这么多，有些命令会像在Windows下点击鼠标左右键一样的频繁使用，所以必须有足够深刻的认识和理解。在这里我不会详尽的去阐述每个命令具体细节，重复造轮子，摘抄文档并没有什么卵用，只是以思路和导向的手段完成从Windows使用者到Linux使用者的一个转变，帮助命令man会比我说明的更详尽。</div><div></div><div>命令的一般格式是：命令 -[选项] 参数 ，红色是可选项，根据需求可有可无</div><div></div><div>文件列表命令：ls</div><div>之前我们已经有使用过ls命令，ls是list directory contents的缩写，它的作用是列表指定文件夹下的内容</div><div></div><div>基本示例：<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-31_17-44-51.png" border="0" alt="" width="640" height="91" /><br /><br /><div>上图在使用ls命令的时候没有任何参数和选项，那么ls会直接列表出当前你所在目录的内容信息，并按照默认的格式输出。但是需要详尽的查看文件信息，这样还不够，需要添加一个选项&#8221;-l&#8221;<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-31_17-56-11.png" border="0" alt="" width="640" height="254" /><br /><div><strong>*&#8220;l&#8221;意为long，使用长格式展示内容，&#8220;ls -l&#8221;这个命令加选项还有一个别名叫&#8221;ll&#8221;，输入&#8221;ll&#8221;会有相同的效果。<br /><br /></strong><div>这个列表的大意如下<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-31_20-46-13.png" border="0" alt="" width="640" height="165" /><br /><br /><div>有一个常用选项是&#8220;-a&#8221;，代表列出所有文件，也包含隐藏文件，在Linux中，隐藏文件以&#8220;.&#8221;开头，使用&#8221;ls -la&#8221;查看某个目录，你可以看到某些隐藏文件</div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-31_21-05-53.png" border="0" alt="" width="640" height="285" /><br /><br /><div><strong>目录切换命令cd</strong></div><div>cd是Change the shell working directory的缩写，它用于切换当前所在的目录</div><div>直接使用&#8220;cd&#8221;命令和使用&#8220;cd ~&#8221;的作用相同，都是定位到当前用户的家目录</div><div>使用&#8220;cd /&#8221;定位到根目录</div><div>linux中，&#8220;.&#8221;代表当前目录，&#8220;..&#8221;代表上级目录，&#8220;cd .&#8221;执行过后目录不变，&#8220;cd ..&#8221;返回上级目录</div><div>cd [目录]，添加目录参数，目录存在则会跳转到指定的目录</div><div></div><div><strong>显示当前目录pwd</strong></div><div>pwd是Print the name of the current working directory的缩写，用于展示当前所在目录<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-31_21-20-22.png" border="0" alt="" width="640" height="76" /><br /><br /><div>至此，你知道了如何在shell下愉快的&#8220;点击鼠标&#8221;了</div></div></div></div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-05-31 11:58 <a href="http://www.blogjava.net/produ/articles/430372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四：命令行，不，是shell</title><link>http://www.blogjava.net/produ/articles/430370.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Tue, 26 May 2015 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430370.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430370.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430370.html</trackback:ping><description><![CDATA[<div>之前，我们做了最基本的操作，就是查看了Linux的目录结构，我们通过在终端中，也就是在&#8220;[用户名@主机名 ~ ]#&#8221;后添加&#8221;ls /&#8220;，按下回车实现查看，其实在这里，操作的是一个名为shell的应用程序，对，就是壳程序，shell将键盘上获得的指令，发送给操作系统去执行，当然，前提是存在这个指令，你乱输一气他肯定不会认识的。此前我们认识的&#8221;[用户名@主机名 ~ ]#&#8220;描述信息，在这里有了一个名字，叫shell提示符。shell程序可以看做是我们和操作系统进行交互的一个桥梁。以后多数的操作都会在shell下进行。</div><div></div><div>那么说起shell，就需要知道一个词，叫做终端仿真器。因为在安装Linux的时候，选择安装了&#8221;基础设施服务器&#8220;这一个选项，所以系统启动之后就是直接操作shell和系统进行交互。倘若我们安装了桌面程序，那么登陆之后看到的将会是像Windows那样的桌面，在桌面环境下，我们需要打开一个叫终端仿真器的程序，来和shell进行交互。就像这样<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-26_22-53-28.png" border="0" alt="" width="640" height="384" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-26_22-54-54.png" border="0" alt="" width="640" height="384" /><br /><div><strong>*你现在看到的这个窗口，就是终端仿真器了，如果没有安装桌面程序启动系统，就不存在终端仿真了，因为本来就是真的。</strong></div><div></div><div><strong>复制粘贴大法</strong></div><div>虽然shell是和键盘打交道的，但是有了光标之后，我们有了更多的选择。我们会经常的选中信息，复制粘贴，但是在终端仿真器中，Crtl+C和Ctrl+V已经不再适用了，他们被赋予了其他的含义，可以使用鼠标复制粘贴，也可以使用Ctrl+insert和Ctrl+delete进行赋值粘贴。</div><div></div><div><strong>命令历史</strong></div><div>虽然目前输入的命令不多，但是在shell中，按下上下箭头会出现之前输入过的命令，方便你进行命令的选择，许多 Linux 发行版默认保存最后输入的500个命令。</div><div></div><div><strong>幕后控制台</strong></div><div>即使终端仿真器没有运行，在后台仍然有几个终端会话运行着。它们叫做虚拟终端 或者是虚拟控制台。在大多数 Linux 发行版中，这些终端会话都可以通过按下 Ctrl-Alt-F1 到 Ctrl-Alt-F6 访问。当一个会话被访问的时候， 它会显示登录提示框，我们需要输入用户名和密码。要从一个虚拟控制台转换到另一个， 按下 Alt 和 F1-F6(中的一个)。返回图形桌面，按下 Alt-F1（根据发行版不同，按键可能会有不同）</div><div></div><div><br />在Linux的使用过程中（除非你想用ubuntu的炫酷界面），对于桌面程序的需求几乎是没有，我们不会考虑在一台web服务器上安装Linux的桌面程序，都是使用shell来进行操作，所以，我们未来很多情况下都会使用远程连接的终端仿真器，像Xshell，putty，secureCRT等等进行操作，要渐渐的适应使用命令去进行操作的方式。下面就尝试几个简单的命令吧</div><div></div><div><strong>cal 显示日历</strong><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-26_23-29-55.png" border="0" alt="" width="640" height="384" /></div><div><strong>date 查看时间和日期&nbsp;</strong></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-26_23-33-531.png" border="0" alt="" width="640" height="384" /><br /><br />后续我们展开常用的命令</div><img src ="http://www.blogjava.net/produ/aggbug/430370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-05-26 11:46 <a href="http://www.blogjava.net/produ/articles/430370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三：第一次使用Linux</title><link>http://www.blogjava.net/produ/articles/430369.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Mon, 25 May 2015 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430369.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430369.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430369.html</trackback:ping><description><![CDATA[<div>安装好Linux之后，马上开始第一次的使用吧！想想都有点小激动~</div><div></div><div>打开虚拟机，少许等待之后，终于，打开成功了？！<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-24_23-09-24.png" border="0" alt="" width="640" height="384" /><br /><div><br />深受Windows毒害的朋友第一眼看上去还有可能认为没有开启成功，因为&#8220;我熟悉的桌面在哪里？&#8221;，但是，事实上Linux已经开启成功了。还记得当时安装的选项吗，我们选择的是&#8220;基础设施服务器&#8221;，并没有选择&#8220;GNOME桌面&#8221;，所以，你现在看到的就是一个没有桌面程序的Linux系统，就好比Windows里的DOS给你的感觉一样，需要手动输入一些指令来完成任务。 图上显示的是等待登陆的状态。因为是测试环境，我们直接使用管理员root用户来登录。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-24_23-19-2811.png" border="0" alt="" width="640" height="384" /><br /><div><strong>*1：输入密码的时候没有&#8220;&#9679;&#8221;作为占位符，所以输入的时候无感知，注意不要输错 。 2：能看到他就说明你已经登陆成功了。<br /><br /></strong><div>那么2对应的内容是什么含义呢？</div><div></div><div>首先，这段描述有这样一个格式&#8221; <span style="color: red;">[用户名@主机名 ~ ]#</span> &#8220;，上图中&#8220;root&#8221;当然是你的用户名，然后localhost意味着你登录的是本地主机，将来你可能远程登录其他主机，那么此处显示的就是你登陆的那个主机的名字；然后看到那个&#8220;~&#8221;，这个位置显示的信息是你当前所在的目录，但是&#8220;~&#8221;是代表当前用户的&#8220;家目录&#8221;，好了，问题来了，什么是家目录？在Linux中，用户一登陆上来，当前你所处的目录位置就是在你的家目录，root用户的家目录就在&#8220;/root&#8221;，&#8220;~&#8221;指代的就是&#8220;/root&#8221;，也就是说，你当在所在的目录是&#8220;/root&#8221;，就好比在Windows中，每个用户都有一个自己名字命名的文件夹一样，通常在C:\Users下；目录的事情先放一放，往后看，还有个&#8220;#&#8221;，这意味着当前的登陆用户是管理员。这一段描述信息在Linux的学习和使用过程中如影随形，所以一定要明白这段信息的含义。</div><div></div><div><strong>*值得一提的是，这段信息在不同的Linux发行版中有细微的差别，比如在ubuntu12中是这种格式&#8220; </strong><strong style="color: red;">用户名@主机名:~#</strong><strong> &#8221;，但是我相信这并不妨碍你去理解它。</strong></div><div></div><div>好了，我们现在登录成功了，我能做什么呢，或者说，我希望浏览一下我的电脑，我想打开C盘看看有哪些文件，该怎么做呢？</div><div></div><div>这么想很正常，但是还记得在安装Linux时候的分区吗？我们把磁盘分成了&#8220;/boot&#8221;，&#8220;/&#8221;和&#8220;swap&#8221;分区，所以在Linux中，没有印象里的C盘了，不但如此，Linux的目录结构也和Windows有着很大的区别，为了更好的展示这些区别，必须先知道两个命令，&#8221;cd&#8221;和&#8220;ls&#8221;，在刚才的窗口中先输入&#8221;cd /&#8221;，之后按下回车，再输入&#8220;ls&#8221;，按下回车，不出意外，你会看到如下画面（顺便你可以回忆一下输入位置行首信息的变化）</div><strong><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-25_21-41-27.png" border="0" alt="" width="640" height="384" /><br /><br /></strong>Linux的不同不仅限于此，还有黄线标注的内容，就是系统目录下所有的内容了。不同于Windows的目录结构，Linux的目录结构是一个以根目录为根的倒树叉结构，目录中&#8221;/&#8221;就是根目录，也是顶级目录，其他所有的文件都在这个目录下。<div><br /><div><strong>*Linux中是严格区分大小写的，Windows不区分</strong></div><div></div><div><strong>*在Linux中，一切都是文件，对的，一切，包括目录，甚至设备</strong></div><div></div><div><strong>*Linux中的文件没有拓展名的概念，不要根据文件的拓展名来断定文件的类型，即便是某个文件以&#8220;.txt&#8221;结尾，他也有可能是一个图像文件。但是，为了方便人们的记忆和管理，我们有一些约定俗成的后缀名，比如：脚本文件用&#8220;.sh&#8221;，网页文件&#8220;.html&#8221;等，如果有了这些拓展名，可能会有特定高亮显示，更便于管理。</strong></div><div></div><div><strong>*Linux的软件和Windows二者之间的软件不通用</strong></div><div></div><div><strong>*Windows中的目录在Linux中称为挂载点（在Linux中，我们需要为每个分区分配挂载点，就比如将&#8220;/boot&#8221;分区分配到&#8221;/boot&#8221;目录下，那么&#8220;/boot&#8221;目录就是&#8220;/boot&#8221;分区的挂载点）</strong></div><div></div><div><strong>*Linux主要使用命令行进行操作，也就是我们刚才使用的&#8220;cd&#8221;和&#8220;ls&#8221;来进行操作（其实这么说不恰当，但是不着急，会继续深入认识）而不是桌面程序，这也和Linux所擅长的领域有关。首先，使用命令行操作是专业人士的选择，这个不用说也能有体会，其次，不安装桌面程序等冗余的服务还能降低系统的开销和系统出错的概率，保证系统的多数资源用在必要的服务上，况且，服务开得越多，出错的可能就越大，更何况是安装一个桌面程序来操作呢</strong></div><div></div><div>上述差别你会慢慢体会到。在Windows中，我们通常会将系统安装在C盘，那么C盘就充当系统盘，我们在使用的过程中就会额外注意，尽量不要将个人的资料和程序放在C盘中。但是这并不绝对，没有规定说必须将系统安装在C盘，也没有说不能把个人资料放在系统盘，只是为了方便管理，我们不那么做，久而久之，约定俗成。在Linux中，也有这样约定俗成的常见挂载点。上图中</div><div></div><div><strong>*boot放置了系统启动需要的文件</strong></div><div></div><div><strong>*dev保存了设备文件</strong></div><div></div><div><strong>*etc保存系统默认的配置文件</strong></div><div></div><div><strong>*lib函数库保存的位置</strong></div><div></div><div><strong>*misc，media，mnt空挂载目录，是系统为了挂载外接设备文件而保留的挂载点</strong></div><div><strong>mnt目录在老式的Linux中也有，但是misc和media没有，所以就使用mnt</strong></div><div></div><div><strong>*proc,sys是内存的挂载点，不可操作</strong></div><div></div><div><strong>*tmp是临时挂载点</strong></div><div></div><div><strong>*usr系统资源挂载点</strong></div><div></div><div><strong>*var系统的可见文档挂载点</strong></div><div></div><div><strong>*bin，sbin，usr/bin，usr/sbin</strong></div><div><strong>都是用来保存系统指令的目录，区别就是bin目录下放置的命令所有用户都可以使用</strong></div><div><strong>但是sbin目录下放置的命令置于管理员可以使用</strong></div><div></div><div>至此，我希望你已经对Linux有了一个大概的认识</div></div></div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-05-25 11:34 <a href="http://www.blogjava.net/produ/articles/430369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二：安装Linux</title><link>http://www.blogjava.net/produ/articles/430368.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sat, 16 May 2015 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430368.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430368.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430368.html</trackback:ping><description><![CDATA[<div>对Linux有一个大概认识之后，那么现在就需要一个Linux环境来供我们试验了。</div><div></div><div>Linux的安装手段和Windows没什么差别，可以通过光盘镜像或者实体光盘进行安装。光盘镜像可以在各个发行商的官网上免费下载，这也是一个常见而快速获取Linux系统的方式。另外，你也可以通过申请的方式获取Linux光盘，然后发行商会将光盘邮寄给你。当然了，选择下载镜像比较快速简洁。</div><div></div><div>对于刚接触Linux的朋友来说，并不建议直接将Linux系统安装在本地磁盘上，原因很多，但是最直接的原因就是Linux和Windows是两个不同的系统，使用和操作方式上有很大的不同，很可能一时间难以适应，所以建议使用虚拟机在你当前习惯的操作系统上模拟一个Linux环境进行试验就好。哪怕你对Linux已经有一定的认识，用虚拟机来替代本地磁盘直接安装也是一种更灵活的方式。</div><div></div><div>记录中使用的虚拟机是Vmware11，Linux系统使用CentOS-7，资源准备好之后，那么就开始搭建Linux环境吧。<br /><br /><div>1：首先配置Vmware<br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_13-49-00.png" border="0" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_13-49-10.png" border="0" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_13-51-09.png" border="0" alt="" /><br /><div><strong>*注意，这里创建的用户名就是Linux里真实的用户名称，root是管理员用户名，一般用户不能使用root作为用户名<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_13-52-41.png" border="0" alt="" /><br /></strong><div><strong>*这里的虚拟机名称是给虚拟机Vmware用的，并不是Linux的系统名称<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_13-53-29.png" border="0" alt="" /><br /></strong><div><strong>*在完成之前，建议修改Linux的网络设置，单击自定义硬件<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_13-55-31.png" border="0" alt="" /></strong></div><div><strong>*网络适配器选择桥接模式，桥接模式会共享实体机的网络。CD/DVD光驱放入需要安装的镜像文件。其他的硬件设置视个人情况开启或关闭<br /><br /></strong><div>至此，虚拟机的配置就完成了，我们已经有了一台没有操作系统的电脑。接下来，就像打开一台新电脑那样，开启虚拟机，之后进入BIOS，调整系统启动顺序，优先加载光驱，重启后进入Linux的安装界面。安装过程中，一些简易的配置就不赘述了，关于系统的分区需要着重记录下来。</div><strong><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_16-17-19.png" border="0" alt="" /><br /></strong><div><strong>*在系统下，选择安装位置在系统下，选择安装位置</strong></div></div></div></div><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_16-19-50.png" border="0" alt="" /><br /><div><strong>*在分区选项下选择我要配置分区，之后点击完成。在新的界面中使用标准分区创建新分区<br /><br /></strong></div><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_16-26-04.png" border="0" alt="" /><br /><strong>*调整分区结构<br /><br /></strong><div>在Linux的分区中，根分区和交换分区是必须分出的，其中交换分区的大小设置为2048MB，在实验环境下足够使用，但是在生产环境中，建议设定为内存的两倍，但最大也不要超过4GB，而且文件系统也必须是swap，根分区的文件系统可以考虑最新的ext4。另外boot单独提出来作为一个分区是因为boot分区内存放了系统启动所必须的文件，要预留出一定的空间，如果boot没有单独分区，和根分区在同一个分区内，那么一旦根分区剩余空间不足，系统将无法启动，boot单独分区主要是为了系统的健康考虑。分区时主要的注意事项就是以上几点，其他的分区可以依个人需求而定。</div><div></div><div>分区结束之后，在安装之前还需要选择你要安装的功能，就比如最小化安装，基本功能安装，完整功能安装等诸如此类的选项<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_16-46-57.png" border="0" alt="" /></div><div><strong>*在软件选择中选择基础设施服务器，在实验环境下，这种模式的安装会附带一些基本的功能，但是对于生产环境来说，一般是选择最小化安装<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/produ/2015-05-16_16-42-41.png" border="0" alt="" /><br /></strong><div><strong>*配置完毕之后，就可以选择开始安装了，安装的过程中会要求你设定root用户的密码，照做即可，安装完成之后重启，CentOS就安装完毕了。</strong></div></div></div></div><img src ="http://www.blogjava.net/produ/aggbug/430368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-05-16 11:22 <a href="http://www.blogjava.net/produ/articles/430368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一：初识Linux</title><link>http://www.blogjava.net/produ/articles/430367.html</link><dc:creator>都较瘦</dc:creator><author>都较瘦</author><pubDate>Sun, 10 May 2015 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/produ/articles/430367.html</guid><wfw:comment>http://www.blogjava.net/produ/comments/430367.html</wfw:comment><comments>http://www.blogjava.net/produ/articles/430367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/produ/comments/commentRss/430367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/produ/services/trackbacks/430367.html</trackback:ping><description><![CDATA[<div><font color="#444444" face="Arimo, Arial, Verdana"><span style="font-size: 16px; line-height: 28.8px;"></span></font></div><div>写作背景介绍：作为一名web开发者，之前的学习工作中都是在Windows环境下进行的，但是随着学习和工作的不断深入，渐渐的发现仅仅是停留在Windows环境下已经不能满足自己的需求了，所以很有必要进行平台的迁移，尤其是在服务器领域。在此特别启动日志任务，记录下自己学习的心路历程，由于个人水平有限，有任何不足和错误请不吝批评指教，共勉。</div><div></div><div>*<strong>根据使用的Linux版本的不同，不能保证内容的完全正确。</strong></div><div></div><div></div><div>新人上路</div><div></div><div>1：什么是Linux？</div><div></div><div>linux是一个操作系统，和Windows属于一类软件，打个比方就是，汽车有很多种，小轿车，大卡车等等。Windows好比小轿车，时尚炫酷易上手，Linux好比SUV，安全稳定很可靠。</div><div></div><div><br />2：Linux是怎么来的？</div><div></div><div>简而言之，过程是这样的：一位教授为了方便教学，借鉴Unix，自己写了一个系统叫Minix，开放给自己的学生学习和研究，通过网络，Minix传播的很快，同时，因为是开源的，源代码可见不经过编译，所以很多学生和爱心人士发现了这个系统存在的一些不足，于是自己进行了修改，并反馈给该教授，但是教授的初衷是为了教学，对于优化和商业化等事宜不太感兴趣，所以反映并不积极。同时期，有一个学生，也就是Linus Benedict Torvalds，他自己写了一套操作系统，叫Linus&#8216;Unix也就是后来的Linux，他把自己写好的系统开放出来，供大家使用和改进，在群策群力之下，逐步就有了如今的Linux。</div><div></div><div><br />3：Linux属于谁？他是免费的吗？</div><div></div><div>严格来讲，Linux没有绝对的归属，如果要有的话，那么它属于所有为Linux贡献过力量的开发者和爱心人士。 Linux是自由软件，但是自由软件不等于免费。Linux是免费的，而且是开放源代码的，这就意味着任何人都可以查看和修改它。</div><div></div><div><br />4：Linux现在到什么版本了？那个版本最好？</div><div></div><div>内核版本信息可以到去www.kernel.org查看最新的信息。至于那个版本最好，这个问题没法回答，视现实情况而定。</div><div></div><div><br />5：Linux的内核版本和发行版本的区分？</div><div></div><div>Linux不像Windows那样，因为Windows属于微软，有着顺序的版本，从Windows95，到xp等一系列版本，但是Linux不属于具体哪一个组织或者个人，有很多公司都有自己的Linux版本。所谓内核版本就是核心版本，发行版本很多就是基于当前的核心版本拓展优化而来，核心版本可以通过www.kernel.org来查看，发行版本要根据发行厂商来决定。</div><div></div><div><br />6：有哪些主流的Linux版本呢？</div><div></div><div>Linux操作系统的优势是在服务器领域，而服务器领域的翘楚莫过于RedHat Linux，不过RedHat Linux有些部分是收费的，这里不要误会，他收费是在一些售后服务领域收取的一些服务费用，RedHat Linux本身是免费提供下载的。和RedHat Linux类似的还有CentOS，Fedora。Ubuntu是一个图形界面比较炫酷的Linux。就学习目的而言，CentOS和Ubuntu都可以考虑。</div><div></div><div><br />7：学了Linux有什么用呢？</div><div></div><div>首先，要清楚，在个人电脑领域，Linux的市场占有率远不及WIndows，以Linux为主要操作系统的个人电脑并不多见，Linux的擅长的领域并不在娱乐和办公上，而是在网站应用服务器和嵌入式领域上，因为，开发人员熟练掌握Linux的重要性毋庸置疑，无论你是Web开发者还是移动互联网开发者，更有力的数据可以查看www.netcraft.com。</div><div></div><div>小结：Linux和Windows同是操作系统，他们有着各自擅长的领域，就好比小轿车和大卡车随同是车，但是用途和擅长有不同。从Windows到Linux的过度要有一个空杯心态，抛弃原来的固有概念，不要硬性的类比学习，+U！</div><div></div><img src ="http://www.blogjava.net/produ/aggbug/430367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/produ/" target="_blank">都较瘦</a> 2015-05-10 11:04 <a href="http://www.blogjava.net/produ/articles/430367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>