﻿<?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>C++博客-Prayer-随笔分类-U基础管理</title><link>http://www.cppblog.com/prayer/category/11887.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Thu, 21 Mar 2019 13:20:01 GMT</lastBuildDate><pubDate>Thu, 21 Mar 2019 13:20:01 GMT</pubDate><ttl>60</ttl><item><title>Win下安装Cygwin中的SSH服务</title><link>http://www.cppblog.com/prayer/archive/2010/01/02/104641.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Sat, 02 Jan 2010 04:45:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/02/104641.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/104641.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/02/104641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/104641.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/104641.html</trackback:ping><description><![CDATA[windows和linux各有其优越性，可以安装在同一台电脑上，但切换要重启。同时拥有两台电脑，一台装win，一台装linux，自然非常好，但具备此条件的不多。本文介绍cygwin，它可以让你在win下拥有linux开发环境，并且不用切换。<br><br>简单的讲述一下cygwin的安装和配置，入门级教程，还请各位一二。<br><br>首先到http://www.cygwin.com 下载setup.exe?..exe放到此目录，<br><br>点击运行，Next-&gt;<br><br>选Install from Internet，Next-&gt;<br><br>填写Root Directory，如X:\cygwin，Next-&gt;<br><br>填写Local Package Directory，如X:\cygwin\ftp，Next-&gt;<br><br>选Direct Connection，Next-&gt;<br><br>选一个较快的ftp，Next-&gt;<br><br>到了关键步骤，如果仅想安装基本系统，直接Next；如果想完整安装，则点击All旁边的旋转状图标，将Default切换至Install；如果和我一样，仅想在命令行下写写程序，则只要将 gcc、make等开发工具选上，还有openssh等；选好后，Next-&gt;<br><br>开始下载，Take a coffee break。回来后，Next-&gt;<br><br>选择需不需要创建快捷方式。-&gt;END<br><br>点击快捷方式或X:\cygwin\cygwin.bat打开控制台，如果是域用户，按照提示makepasswd和makegroup即可。下面说一些简单的调整和配置。<br><br>一、ssh的安装<br><br>cygwin自带的控制台可调参数很少，舒适度较低。有没有办法用熟悉的putty或secureCRT来操控cygwin呢？办法有二:<br><br>1、用puttycyg。cygwin bash shell能做的，puttycyg基本上都能实现，本地操作的话，极力推荐这款好软件。<br><br>2、安装sshd，然后本机登陆。如果安装时已选择openssh，按照下面的操作继续。如果忘了安装，点击setup.exe，选上openssh，再装一次即可。<br><br>a、右键&#8220;我的电脑&#8221;-&gt;属性-&gt;高级-&gt;环境变量，在系统环境变量里添加变量CYGWIN，值为netsec tty，然后在Path里追加X:\cygwin\bin<br><br>b、打开cygwin控制台，输入ssh-host-config，一路yes，提示CYGWIN值时，输入netsec tty<br><br>c、启动sshd服务用: net start sshd 或 cygrunsrv --start sshd; 停止sshd服务用:net stop sshd 或 cygrunsrv --stop sshd<br><br>d、用ssh yourname@127.0.0.1 或 ssh localhost登陆<br><br>e、还可以继续安装配置sftp、scp等，就不细说了<br><br>f、每次输入密码登陆太麻烦，可以用key验证: 用puttygen.exe生存密钥对，然后在~/下，建立.ssh目录，创建authorized_keys2文件，将公钥复制到这个文件，然后在putty里指定私钥登陆，一劳永逸。<br><br>二、vim的简单配置<br><br>将\usr\share\vim\vim64目录下的vimrc_example.vim复制到~/，重命名为_vimrc， 按照自己的喜好修改里面的配置即可，如打开高亮，选择喜欢的colorscheme<br><br>三、cygwin的中文显示和输入<br><br>让bash命令行支持中文输入，vi ~/.inputrc，将下面几行的注释去掉:<br>set meta-flag on<br>set convert-meta off<br>set input-meta on<br>set output-meta on<br><br>让ls命令支持中文显示，vi ~\.bashrc中，修改:<br>alias ls='ls -hF --show-control-chars --color=tty'<br><br>vim64的话，已经支持中文输入。<br><br>四、sdcv的安装配置<br><br>坐在电脑前久了，屏幕太亮，辐射大，对身体不好。能不能在全黑的命名行模式下工作和学习呢？putty可以很好的全屏幕显示，sdcv则可以让你在命令行模式查找单词。<br><br>安装: 到stardict主页下载sdcv和想要的字典，编译安装后，将字典解压，放到/usr/share/startdict/dic目录<br><br>使用: sdcv word，就这么简单。小技巧: 可以在~/.bashrc里alias sdld='sdcv -u langdao'等等，这样可以避免词典太多，直接sdld word就可以用郎道字典查询。<br><br>我在远程W2k上装了一点问题也没有，就像是一台LINUX服务器，哈哈，通过命令行管理，爽啊
<div id=dictdiv style="DISPLAY: none; FONT-SIZE: 13px; MARGIN: 5px; FONT-FAMILY: arial">&nbsp;</div>
<img src ="http://www.cppblog.com/prayer/aggbug/104641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-02 12:45 <a href="http://www.cppblog.com/prayer/archive/2010/01/02/104641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cygwin</title><link>http://www.cppblog.com/prayer/archive/2010/01/02/104640.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Sat, 02 Jan 2010 04:33:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/02/104640.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/104640.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/02/104640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/104640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/104640.html</trackback:ping><description><![CDATA[　　
<div class=text_pic style="FLOAT: right; VISIBILITY: visible"><a href="http://baike.baidu.com/image/d57e99943025550dd31b705f" target=_blank><img class=editorImg title="" src="http://imgsrc.baidu.com/baike/abpic/item/d57e99943025550dd31b705f.jpg"></a></div>
cygwin是一个在windows平台上运行的<a href="http://baike.baidu.com/view/8095.htm" target=_blank><u><font color=#0000ff>unix</font></u></a>模拟环境，是cygnus solutions公司开发的自由软件（该公司开发了很多好东西，著名的还有eCos，不过现已被<a href="http://baike.baidu.com/view/82246.htm" target=_blank><u><font color=#0000ff>Redhat</font></u></a>收购）。它对于学习unix/linux操作环境，或者从unix到windows的应用程序移植，或者进行某些特殊的开发工作，尤其是使用gnu工具集在windows上进行嵌入式系统开发，非常有用。随着嵌入式系统开发在国内日渐流行，越来越多的开发者对cygwin产生了兴趣。<br>
<div class=spctrl></div>
　　cygnus当初首先把gcc，gdb，gas等开发工具进行了改进，使他们能够生成并解释win32的目标文件。然后，他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改，这样做显然需要大量工作。因此，他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll)，把win32 api中没有的unix风格的调用（如fork,spawn,signals,select,sockets等）封装在里面，也就是说，他们基于win32 api写了一个unix系统库的模拟层。这样，只要把这些工具的源代码和这个共享库连接到一起，就可以使用unix主机上的交叉编译器来生成可以在windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础，cygnus又逐步把其他的工具（几乎不需要对源代码进行修改，只需要修改他们的配置脚本）软件移植到windows上来。这样，在windows平台上运行bash和开发工具、用户工具，感觉好像在unix上工作。<br>
<div class=spctrl></div>
　　关于cygwin实现的更详细描述，请参考http://cygwin.com/cygwin-ug-net/highlights.html.
<img src ="http://www.cppblog.com/prayer/aggbug/104640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-02 12:33 <a href="http://www.cppblog.com/prayer/archive/2010/01/02/104640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改Linux主机名</title><link>http://www.cppblog.com/prayer/archive/2009/12/31/104506.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 30 Dec 2009 16:04:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/31/104506.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/104506.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/31/104506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/104506.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/104506.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">hostname命令只是临时改动主机名，重启后主机名还是恢复成原来的。 </p>
<p style="TEXT-INDENT: 2em">要想永久更改主机名，需要修改/etc/sysconfig/network 文件。 </p>
<p style="TEXT-INDENT: 2em">vi&nbsp; /etc/sysconfig/network，修改HOSTNAME一行为 "HOSTNAME=主机名" </p>
<p style="TEXT-INDENT: 2em">如： </p>
<p style="TEXT-INDENT: 2em">HOSTNAME=linuxserver </p>
<p style="TEXT-INDENT: 2em">GATEWAY=10.16.255.254 </p>
<p style="TEXT-INDENT: 2em">(没有这行？那就添加这一行吧)，然后运行命令 "hostname 主机名"。</p>
<p style="TEXT-INDENT: 2em">一般还要修改/etc/hosts文件中的主机名。 </p>
<p style="TEXT-INDENT: 2em">这样，无论你是否重启，主机名都修改成功。</p>
<img src ="http://www.cppblog.com/prayer/aggbug/104506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-31 00:04 <a href="http://www.cppblog.com/prayer/archive/2009/12/31/104506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux主机名Hostname详解 </title><link>http://www.cppblog.com/prayer/archive/2009/12/31/104505.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 30 Dec 2009 16:03:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/31/104505.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/104505.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/31/104505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/104505.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/104505.html</trackback:ping><description><![CDATA[<strong>、 什么是主机名：</strong>
<p>　　无论在局域网还是INTERNET上，每台主机都有一个IP地址，是为了区分此台主机和彼台主机，也就是说IP地址就是主机的门牌号。但IP地址不方便记忆，所以又有了域名。域名只是在公网（INtERNET)中存在(以实验为目的的局域网域网实验性除外），每个域名都对应一个IP地址，但一个 IP地址可有对应多个域名。域名类型 linuxsir.org 这样的；</p>
<p>　　主机名是用于什么的呢？在一个局域网中，每台机器都有一个主机名，用于主机与主机之间的便于区分，就可以为每台机器设置主机名，以便于以容易记忆的方法来相互访问。比如我们在局域网中可以为根据每台机器的功用来为其命名。</p>
<p>　　主机名相关的配置文件：/etc/hosts;</p>
<p>　　<strong>2. 主机名配置文件；</strong> </p>
<p>　　主机名的配置文件大多是/etc/hosts ；</p>
<p>　　hosts - The static table lookup for host name（主机名查询静态表）；</p>
<p>　　由于 Linux 发行版本众多，与主机名相关的配置文件有时也有所不同。现在我们说说常见版本的主机名配置文件；</p>
<p>　　2.1 主机名配置文件 /etc/hosts解说；</p>
<p>　　Fedora/Redhat 或以Fedora/Redhat为基础打包的发行版，主机名配置文件是 /etc/hosts</p>
<p>　　Debian或以Debian为基础打包的发行版，主机名配置文件是 /etc/hostname 和/etc/hosts</p>
<p>　　Slackware的主机名配置文件是 /etc/hosts</p>
<p>　　那我们来读读 /etc/hosts的内容，看这个文件是用来做什么的。hosts 配置文件是用来把主机名字映射到IP地址的方法，这种方法比较简单。但这种映射只是本地机的映射，也就是说每台机器都是独立的，所有的计算机都不能相互通过hostname来访问。</p>
<p>　　注：在debian 中还有一个/etc/hostname的文件，这个文件就是直接把本地主机名写进去就行了，但要和 /etc/hosts中的本地主机名保持一致。</p>
<p>　　/etc/hosts 的内容一般有如下类似内容：</p>
<p>　　127.0.0.1 localhost.localdomain localhost</p>
<p>　　192.168.1.195 debian.localdomain debian</p>
<p>　　注：</p>
<p>　　一般情况下hosts的内容关于主机名(hostname)的定义，每行为一个主机，每行由三部份组成，每个部份由空格隔开。其中#号开头的行做说明，不被系统解释。</p>
<p>　　第一部份：网络IP地址；</p>
<p>　　第二部份：主机名.域名，注意主机名和域名之间有个半角的点，比如 localhost.localdomain</p>
<p>　　第二部份：主机名(主机名别名） ，其实就是主机名；</p>
<p>　　当然每行也可以是两部份，就是主机IP地址和主机名；比如 192.168.1.195 debian</p>
<p>　　127.0.0.1 是回环地址，比如我们不想让局域网的其它机器看到我们测试的网络程序，就可以用回环地址来测试。</p>
<p>　　为什么需要定义域名呢？其实理解也简单，比如我们有三台主机，每台做不同的事，一台做MAIL服务器，一台做FTP服务器，一台做SMB服务器，所以我们就可以这样来设计hostname；</p>
<p>　　127.0.0.1 localhost.localdomain localhost</p>
<p>　　192.168.1.2 <a href="ftp://ftp.localdomain/"><u><font color=#108ac6>ftp.localdomain</font></u></a> ftp</p>
<p>　　192.168.1.3 mail.localdomain mail</p>
<p>　　192.168.1.4 smb.localdomin smb</p>
<p>　　把这上面这个配置文件的内容分别写入每台机器的/etc/hosts内容中，这样这三台局域网的机器就可以通过hostname来访问了。</p>
<p>　　2.2 主机名(hostname)和域名(Domain）的区别；</p>
<p>　　主机名就机器本身的名字，域名是用来解析到IP的。但值得一说的是在局域网中，主机名也是可以解析到IP上的；比如我们前面所说举的例子；</p>
<p>　　2.3 局域网的机器，不能通过主机名互访的原因；</p>
<p>　　有的弟兄可能会说，我的hostname彼此不能互访，其实这也问题也简单，我们前面已经提到了一个简单的解决办法。就是要让局域网中的所有主机都有一个通用的，并且包含所有主机的/etc/hosts文件；</p>
<p>　　另一个是做解决办法是做局域网DNS服务器，如果您的主机特别少，就用前面所说的简单方法就行；如何做DNS服务器，我将在以后的文档中专题介绍；不过我值得一提的是做任何服务器都是以效率优先的原则为基础。比如我们在局域网中两台机器，我们还有必要做DNS服务器吗？无论怎么解决，最终的都是用最有效率的办法解决问题；我们不能说明DNS多高级。如果DNS是为外网服务的，那就另说了，不做也得做。对不对？</p>
<p>　　<strong>3、主机名修改工具 hostname;</strong> </p>
<p>　　其实主机名的修改也有专用工具，就是hostname ；我认为如果用这个工具来修改主机名，不如直接修改 /etc/hosts 来的方便；您可以查看 hosname ——help或 man hostname的帮助 。在这里我们只说简单的用法；</p>
<p>　　hostname 工具是用来显示和设置系统主机名，看下面的洋文；</p>
<p>　　hostname - show or set the system&#8216;s host name</p>
<p>　　举例解说：</p>
<p>　　＊ 显示主机名：</p>
<p>　　[root@linuxsir01 ~]# hostname</p>
<p>　　linuxsir01</p>
<p>　　此主机的主机名是linuxsir01，不加参数是用来显示当前操作的主机的主机名；</p>
<p>　　＊ 临时设置主机名：</p>
<p>　　我们可以用 hostname 后接主机名，这样就可以设置当前操作的主机的主机名，比如我们想把主机名设置为linuxsir02；</p>
<p>　　[root@linuxsir01 ~]# hostname linuxsir02</p>
<p>　　[root@linuxsir01 ~]# hostname 注：显示主机名</p>
<p>　　linuxsir02</p>
<p>　　通过hostname 工具来设置主机名只是临时的，下次重启系统时，此主机名将不会存在；所以您想修改主机名，想一直有效的，还是用前面所说修改主机名配置文件 /etc/hosts；</p>
<p>　　＊ 显示主机IP：</p>
<p>　　显示当前主机名的IP，可以用-i参数；</p>
<p>　　[root@linuxsir01 ~]# hostname -i</p>
<p>　　192.168.1.3</p>
<p>　　<strong>4、本文未尽事宜；</strong> </p>
<p>　　有时我们在登入桌面时，会提示找不到hostname ，这时您要做的是修改/etc/hosts，为您的机器添加一个主机名；先用 ifconfig -a 来查看主机的IP地址，然后把你主机的IP地址，指定主机名。</p>
<p>&nbsp;</p>
<h2><a title="Permanent Link: 怎样修改Linux的hostname" href="http://blog.infernor.net/how-to-change-hostname/" rel=bookmark><u><font color=#108ac6>怎样修改Linux的hostname</font></u></a> </h2>
<p>Linux操作系统的hostname是一个kernel变量，可以通过hostname命令来查看本机的hostname。也可以直接cat /proc/sys/kernel/hostname查看。</p>
<div class=hl-surround>
<div class=hl-main>#hostname</div>
</div>
<div class=hl-surround>
<div class=hl-main>#cat /proc/sys/kernel/hostname</div>
</div>
<p>上面两种输出结果相同。</p>
<p><strong>修改运行时Linux系统的hostname，即不需要重启系统</strong> <br>hostname命令可以设置系统的hostname</p>
<div class=hl-surround>
<div class=hl-main>#hostname newname</div>
</div>
<p>newname即要设置的新的hostname，运行后立即生效，但是在系统重启后会丢失所做的修改，如果要永久更改系统的hostname，就要修改相关的设置文件。</p>
<p><strong>永久更改Linux的hostname </strong></p>
<p>man hostname里有这么一句话，&#8221;The host name is usually set once at system startup in /etc/rc.d/rc.inet1 or /etc/init.d/boot (normally by reading the contents of a file which contains the host name, e.g. /etc/hostname).&#8221; RedHat里没有这个文件，而是由/etc/rc.d/rc.sysinit这个脚本负责设置系统的hostname，它读取 /etc/sysconfig/network这个文本文件，RedHat的hostname就是在这个文件里设置。</p>
<p>所以，如果要永久修改RedHat的hostname，就修改/etc/sysconfig/network文件，将里面的HOSTNAME这一行修改成HOSTNAME=NEWNAME，其中NEWNAME就是你要设置的hostname。</p>
<p>Debian发行版的hostname的配置文件是/etc/hostname。</p>
<p>修该配置文件后，重启系统就会读取配置文件设置新的hostname。</p>
<p><strong>hostname与/etc/hosts的关系 </strong></p>
<p>很过人一提到更改hostname首先就想到修改/etc/hosts文件，认为hostname的配置文件就是/etc/hosts。其实不是的。</p>
<p>hosts文件的作用相当如DNS，提供IP地址到hostname的对应。早期的互联网计算机少，单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展，这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts。</p>
<p>Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件，如果里面有相应的记录，就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录</p>
<div class=hl-surround>
<div class=hl-main>127.0.0.1 localhost.localdomain localhost</div>
</div>
<p>hosts文件格式是一行一条记录，分别是IP地址 hostname aliases，三者用空白字符分隔，aliases可选。</p>
<p>127.0.0.1到localhost这一条建议不要修改，因为很多应用程序会用到这个，比如sendmail，修改之后这些程序可能就无法正常运行。</p>
<p>修改hostname后，如果想要在本机上用newhostname来访问，就必须在/etc/hosts文件里添加一条newhostname的记录。比如我的eth0的IP是192.168.1.61，我将hosts文件修改如下：</p>
<div class=hl-surround>
<div class=hl-main>#hostname blog.infernor.net<br># cat /etc/hosts<br>127.0.0.1 localhost.localdomain localhost<br>192.168.1.61 blog.infernor.net blog</div>
</div>
<p>这样，我就可以通过blog或者blog.infernor.net来访问本机。</p>
<p>从上面这些来看，/etc/hosts于设置hostname是没直接关系的，仅仅当你要在本机上用新的hostname来访问自己的时候才会用到/etc/hosts文件。两者没有必然的联系。</p>
<p>RHEL还有个问题。</p>
<p>我开始在测试的时候，只修改/etc/hosts，里面添加 192.168.1.61 blog.infernor.net blog，而/etc/sysconfig/network维持原状，也就是里面的HOSTNAME=localhost.localdomain。我重启系统后居然发现hostname给修改成了blog.infernor.net。这样看的话，倒真觉得/etc/hosts是hostname的配置文件。后来终于在/etc/rc.d/rc.sysinit这个启动脚本里发现了问题的所在。</p>
<p>rc.sysinit文件里一开始就设置了hostname</p>
<div class=hl-surround>
<div class=hl-main>if [ -f /etc/sysconfig/network ]; then<br>. /etc/sysconfig/network<br>fi<br>if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then<br>HOSTNAME=localhost<br>fi</div>
</div>
<p>确实使用了/etc/sysconfig/network里的hostname值。不过后面还有一段关于设置hostname的</p>
<div class=hl-surround>
<div class=hl-main>ipaddr=<br>if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]<br>; then<br>ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet<br>/ { print gensub("/.*","","g",$2) }')<br>if [ -n "$ipaddr" ]; then<br>eval $(ipcalc -h $ipaddr 2&gt;/dev/null)<br>hostname ${HOSTNAME}<br>fi<br>fi</div>
</div>
<p>脚本判断hostname是否为localhost或者localhost.localdomain，如果是的话，将会使用接口IP地址对应的 hostname来重新设置系统的hostname。问题就出在这里，我的/etc/sysconfig/network默认的hostname是 localhost.localdomain，eth0的IP是192.168.1.61，而/etc/hosts里有192.168.1.61的记录。于是就用192.168.1.61这条记录来替换了hostname。</p>
<p>估计这也是很多人将/etc/hosts误以为是hostname的配置文件的原因。</p>
<p><strong>hostname带选项查询</strong> </p>
<p>hostname的-s -f -i等等选项都用到了/etc/hosts或者DNS系统，跟我们讨论的hostname有点远了，也容易产生误会。具体可以man hostname查看。</p>
<img src ="http://www.cppblog.com/prayer/aggbug/104505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-31 00:03 <a href="http://www.cppblog.com/prayer/archive/2009/12/31/104505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>显示文件中的控制字符</title><link>http://www.cppblog.com/prayer/archive/2009/12/22/103737.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 22 Dec 2009 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/22/103737.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103737.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/22/103737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103737.html</trackback:ping><description><![CDATA[使用cat -v filename命令，屏幕会乱叫，且到处都是一些垃圾字符，这可以确知文件中包含有<br>控制字符<br><br>sed -n '1,$l' filename<br>$后面跟了一个字母l，用来显示所有的控制字符。
<img src ="http://www.cppblog.com/prayer/aggbug/103737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-22 23:24 <a href="http://www.cppblog.com/prayer/archive/2009/12/22/103737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单而有用的nohup命令介绍</title><link>http://www.cppblog.com/prayer/archive/2009/12/22/103733.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 22 Dec 2009 14:07:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/22/103733.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103733.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/22/103733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103733.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103733.html</trackback:ping><description><![CDATA[<p>简单而有用的nohup命令在UNIX/LINUX中，普通进程用&amp;符号放到后台运行，假如启动该程序的控制台logout，则该进程随即终止。 </p>
<p>&nbsp;</p>
<p>要实现守护进程，一种方法是按守护进程的规则去编程（本站有文章介绍过），比较麻烦；另一种方法是仍然用普通方法编程，然后用nohup命令启动程序： </p>
<p>&nbsp;</p>
<p>nohup＜程序名＞&amp; </p>
<p>&nbsp;</p>
<p>则控制台logout后，进程仍然继续运行，起到守护进程的作用（虽然它不是严格意义上的守护进程）。 </p>
<p>&nbsp;</p>
<p>使用nohup命令后，原程序的的标准输出被自动改向到当前目录下的nohup.out文件，起到了log的作用，实现了完整的守护进程功能。 </p>
<p>ygwu @ 2005年04月18日 上午10:03 </p>
<p>For example： </p>
<p>&nbsp;</p>
<p>如何远程启动WebLogic服务? </p>
<p>&nbsp;</p>
<p>用telnet远程控制服务器，远程启动WEBLOGIC服务，启动后关闭telnet，WebLogic服务也跟着停止，这是因为使用telnet启动的进程会随着telnet进程的关闭而关闭。所以我们可以使用一些UNIX下的命令来做到不关闭。 </p>
<p>&nbsp;</p>
<p>使用如下命令： </p>
<p>nohup startWeblogic.sh&amp; </p>
<p>假如想要监控标准输出可以使用： </p>
<p>tail -f nohup.out </p>
<p>&nbsp;</p>
<p>当在后台运行了程序的时候，可以用jobs命令来查看后台作业的状态。在有多个后台程序时，要使用来参数的fg命令将不同序号的后台作业切换到前台上运行。 </p>
<p>&nbsp;</p>
<p>当用户启动一个进程的时候，这个进程是运行在前台，使用与相应控制终端相联系的标准输入、输出进行输入和输出。即使将进程的输入输出重定向，并将进程放在后台执行，进程仍然和当前终端设备有关系。正因为如此，在当前的登录会话结束时，控制终端设备将和登录进程相脱离，那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号，通知进程线路已经挂起了，假如程序没有接管这个信号的处理，那么缺省的反应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程，为了使得在系统登录后还可以正常执行，只有使用命令nohup来启动相应程序。</p>
<p><br>使用命令nohup当然可以启动这样的程序，但nohup启动的程序在进程执行完毕就退出，而常见的一些服务进程通常永久的运行在后台，不向屏幕输出结果。在Unix中这些永久的后台进程称为守护进程（daemon）。守护进程通常从系统启动时自动开始执行，系统关闭时才停止。 </p>
<p>&nbsp;</p>
<p>在守护进程中，最重要的一个是超级守护进程inetd，这个进程接管了大部分网络服务，但并不是对每个服务都自己进行处理，而是依据连接请求，启动不同的服务程序与客户机打交道。inetd支持网络服务种类在它的设置文件/etc/inet.conf中定义。inet.conf文件中的每一行就对应一个端口地址，当inetd接受到连接这个端口的连接请求时，就启动相应的进程进行处理。使用inetd的好处是系统不必启动很多守护进程，从而节约了系统资源，然而使用inetd启动守护进程相应反应会迟缓一些，不适合用于被密集访问的服务进程。</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/prayer/aggbug/103733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-22 22:07 <a href="http://www.cppblog.com/prayer/archive/2009/12/22/103733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ps  不显示删除回复显示所有回复显示星级回复显示得分回复 请问ps命令查出来的rss/vsz/size分别是何含义</title><link>http://www.cppblog.com/prayer/archive/2009/12/17/103394.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 17 Dec 2009 05:40:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/17/103394.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103394.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/17/103394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103394.html</trackback:ping><description><![CDATA[SIZE: 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数. <br>RSS: "Resident Set Size", 实际驻留"在内存中"的内存数. 不包括已经交换出去的代码. 举一个例子: 如果你有一个程序使用了100K内存, 操作系统交换出40K内存, 那么RSS为60K. RSS还包括了与其它进程共享的内存区域. 这些区域通常用于libc库等. <br>SHARE: RSS中与其它进程共享的内存部分大小. <br>VMSIZE: 一个进程占用的总的地址空间大小. 它包括了没有映射到内存中的页面。 <br>sz（Private RSS）: 映射到内存中的页面, 这些页面仅由进程单独使用. 这也是我们最关心地方: 进程实际占用的内存数。 <br><br><br>rss&nbsp; &nbsp; &nbsp; &nbsp; RSS&nbsp; &nbsp; &nbsp; resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz). <br><br><br>vsz&nbsp; &nbsp; &nbsp; &nbsp; VSZ&nbsp; &nbsp; &nbsp; virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; to change. (alias vsize). <br><br><br>size&nbsp; &nbsp; &nbsp; SZ&nbsp; &nbsp; &nbsp; approximate amount of swap space that would be required if the process were to dirty all writable pages and then be <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; swapped out. This number is very rough! <br><br><br>sz&nbsp; &nbsp; &nbsp; &nbsp; SZ&nbsp; &nbsp; &nbsp; size in physical pages of the core image of the process. This includes text, data, and stack space. Device mappings <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; are currently excluded; this is subject to change. See vsz and rss.
<img src ="http://www.cppblog.com/prayer/aggbug/103394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-17 13:40 <a href="http://www.cppblog.com/prayer/archive/2009/12/17/103394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Aix命令：列出使用内存和Cpu前几位的进程</title><link>http://www.cppblog.com/prayer/archive/2009/12/17/103390.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 17 Dec 2009 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/17/103390.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103390.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/17/103390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103390.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103390.html</trackback:ping><description><![CDATA[（1）显示10个消耗cpu最多的进程<br />　　# ps aux |head -1 ;ps aux |sort -rn +2 |head -10<br /><br />　　（2）显示10个消耗内存最多的进程<br /><br />　　#ps vx |head -1 ;ps vx |grep -v PID |sort -rn +6 |head -10<br /><br />　　（3）显示10个换页最多的进程<br /><br />　　#ps vx |head -1 ;ps vx |grep -v PID |sort -rn +4 |head -10<br /><br />　　（4）显示10个消耗存储空间最多的进程<br /><br />　　#ps aux |head -1 ;ps aux |sort -rn +3 |head -10<br /><br /><br />如何监控进程的内存使用情况（AIX）<br />
<p>AIX监控进程内存使用的工具比较多，个人觉得比较方便的有nmon,svmon，其中svmon是AIX自带的工具，</p>
<p>需要root权限执行，可以监控进程详细内存使用信息，如：</p>
<p>svmon -P pid(要监控的进程PID) -i 1 (每秒刷新一次)&nbsp; |grep&nbsp; pid&nbsp;<br /><br /><br /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>AIX下进程内存分析<br />AIX下可以使用ps v工具或者svmon工具来分析进程内存。ps v命令是ps命令的一个工<br />具，要注意的是v之前不要加&#8221;-&#8220;。ps v工具在任何AIX操作系统下都可以使用。比<br />如：<br /><br /># ps -lfp 13288<br />&nbsp; F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S&nbsp;&nbsp;&nbsp; UID&nbsp;&nbsp; PID PPID C PRI NI ADDR&nbsp;&nbsp;&nbsp; SZ&nbsp; WCHAN STIME&nbsp; TTY TIME CMD<br />&nbsp; 240001 A oracle 13288&nbsp;&nbsp;&nbsp; 1 0&nbsp; 60 20 1ba2f 34032&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nov 03&nbsp;&nbsp; - 0:06<br />ora_pmon_DEV<br /><br />&nbsp; # ps v 13288<br />&nbsp;&nbsp;&nbsp; PID TTY STAT TIME PGIN SIZE&nbsp;&nbsp; RSS&nbsp;&nbsp; LIM&nbsp; TSIZ&nbsp;&nbsp; TRS %CPU %MEM&nbsp; COMMAND<br />&nbsp; 13288&nbsp;&nbsp; - A&nbsp;&nbsp;&nbsp; 0:08&nbsp; 225 5616 13904 32768 28420 13512&nbsp; 0.0&nbsp; 1.0<br />ora_pmon_DEV<br /><br /><br /><br />从ps命令看到sz是34M。而用ps v命令可以看到rss是13904，TRS是13512。进程使用的<br />内存是RSS-TRS=392K(ps v看到的内存单位是K)。<br /><br /><br />用svmon可以看到更多的信息，其结果和ps v是一致的。比如：<br /><br />#svmon -P 23288<br />----------------------------------------------------------------------------<br />---<br />&nbsp;&nbsp;&nbsp;&nbsp; Pid Command&nbsp;&nbsp;&nbsp;&nbsp; Inuse&nbsp;&nbsp; Pin&nbsp;&nbsp; Pgsp Virtual&nbsp;&nbsp; 64-bit&nbsp;&nbsp;&nbsp; Mthrd<br />&nbsp;&nbsp; 23288 ora_pmon_V8&nbsp;&nbsp;&nbsp; 29598&nbsp;&nbsp;&nbsp;&nbsp; 1451&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 182&nbsp;&nbsp;&nbsp;&nbsp; 16560&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N<br />&nbsp; Vsid Esid Type Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inuse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pin Pgsp Virtual&nbsp;&nbsp; Addr<br />Range<br />&nbsp; 1781&nbsp;&nbsp;&nbsp; 3 work shmat/mmap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11824&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0 11824<br />0..24700<br />&nbsp; 1761&nbsp;&nbsp;&nbsp; 1 pers code,large file /dev&nbsp;&nbsp; 9681&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp; -<br />0..9680<br />&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0 work kernel seg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3982&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1450&nbsp; 182&nbsp; 3390<br />0..21804 :<br />&nbsp;<br />65474..65535<br />&nbsp;18018&nbsp;&nbsp;&nbsp; d work shared library text&nbsp;&nbsp;&nbsp; 2852&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 158<br />0..65535<br />&nbsp; 4764&nbsp;&nbsp;&nbsp; 2 work process private&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp; 1127<br />0..1182 :<br />&nbsp;<br />65307..65535<br />&nbsp; f74f&nbsp;&nbsp;&nbsp; f work shared library data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 61<br />0..1291<br />&nbsp;1e59e&nbsp;&nbsp;&nbsp; - pers large file /dev/lv00&nbsp;&nbsp;&nbsp;&nbsp; 33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0..32<br />&nbsp; e58e&nbsp;&nbsp;&nbsp; - pers large file /dev/lv00&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0..82<br />&nbsp; b74b&nbsp;&nbsp;&nbsp; - pers large file /dev/lv00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0..0<br />&nbsp; 3703&nbsp;&nbsp;&nbsp; - pers large file /dev/lv00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0..0<br /><br /><br />#ps v 23288<br />&nbsp;&nbsp; PID&nbsp;&nbsp;&nbsp; TTY STAT&nbsp; TIME PGIN&nbsp; SIZE&nbsp;&nbsp; RSS&nbsp;&nbsp; LIM&nbsp; TSIZ&nbsp;&nbsp; TRS %CPU %MEM<br />COMMAND<br />&nbsp;23288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - A&nbsp;&nbsp;&nbsp;&nbsp; 0:00&nbsp;&nbsp;&nbsp; 0&nbsp; 4752 43556 32768 27289 38724&nbsp; 0.0&nbsp; 5.0<br />ora_pmon_V8<br /><br /><br /><br />要注意的是，svmon显示的内存都是以Page为单位的，AIX下，每个页为4K。<br />通过work process private的virtual大小和work shared library data的virtual大小<br />的和ps v的SIZE是完全一致的：<br />4752K=(1127＋61)&#215;4K<br />而RSS的内容相当于linux项目的private working-storage segments加上pers code和<br />shared library data。<br />43556K＝（1127 + 9681 + 81）*4K<br />TRS就是INUSE项目的pers code:<br />38724K=9681*4K<br />&nbsp;<br /></p><img src ="http://www.cppblog.com/prayer/aggbug/103390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-17 13:25 <a href="http://www.cppblog.com/prayer/archive/2009/12/17/103390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX中ps命令中到底用不用“-”？</title><link>http://www.cppblog.com/prayer/archive/2009/11/12/100777.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 12 Nov 2009 02:26:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/11/12/100777.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/100777.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/11/12/100777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/100777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/100777.html</trackback:ping><description><![CDATA[<div class=cnt id=blog_text>
<p>&nbsp;&nbsp;&nbsp; 我发现很多玩AIX好多年的人都搞不清ps命令中的那个&#8220;-&#8221;，到底是应该用ps -elf、ps aux呢？还是应该用ps elf、ps -aux呢？</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp; 先 man一下ps 看看吧，你会发现AIX下的ps命令有两种语法格式：一种叫X/Open标准，一种叫Berkeley标准。<br>ps Command</p>
<p>Purpose</p>
<p>Shows current status of processes.</p>
<p>Syntax</p>
<p>X/Open Standards</p>
<p>ps [ -A ] [ -N ] [ -a ] [ -d ] [ -e ] [ -f ] [ -k ] [ -l ] [ -F format] [ -o<br>Format ] [ -c Clist ] [ -G Glist ] [ -g Glist ] [ -m ] [ -n NameList ] [ -p<br>Plist ] [ -t Tlist ] [ -U Ulist ] [ -u Ulist ]</p>
<p>Berkeley Standards</p>
<p>ps [ a ] [ c ] [ e ] [ ew ] [ eww ] [ g ] [ n ] [ U ] [ w ] [ x ] [ l | s | u |<br>v ] [ t Tty ] [ ProcessNumber ]</p>
<p>&nbsp;&nbsp;&nbsp; 现在你会知道ps -elf、ps aux是正确的写法，而ps elf、ps -aux自然就是错误的了。这其实是个很容易被忽视的小问题，所以很多人玩AIX的人总是搞错。我接触AIX之前，恰好学过一端时间的SOLARIS，所以一开始就注意到了这个细节。SOLARIS也有两个版本的ps，一个是默认的System V 版本，如：/usr/bin/ps -elf；一个是非默认的BSD版本，如：/usr/ucb/ps -aux。</p>
<p>&nbsp;&nbsp;&nbsp; BSD的意思相信大家都知道，是Berkeley Software Distribution（巴克利软件发行版）的缩写。那ucb是什么意思呢？其实是<br>University of California, Berkeley （加州大学巴克利分校）的缩写。看，这两个都是缩写里 都有Berkeley。好了，说的这里，我看就没必要继续再罗嗦下去了。用GOOGLE搜一下&#8220;UNIX历史&#8221;、&#8220;University of California, Berkeley&#8221;、&#8220;System V&#8221;这些关键字，相信INTERNET上有很多详细说明它们之间关系的文章。知道点儿UNIX的历史，其实是件很有趣的事情。</p>
<p>&nbsp;&nbsp;&nbsp; 至于AIX的man中提到的&#8220;X/Open标准&#8221;和&#8220;System V 版本&#8221;是什么关系，我也不知道，也懒得搞清楚了，想必它们之间一定是有联系的。如果你想知道细情，那还是用GOOGLE搜吧，呵呵。</p>
<p>&nbsp;&nbsp;&nbsp; 最后总结一下AIX中ps命令，你只要记两个命令就好了——ps -elf和ps aux。ps -elf是System V风格，同SOLARIS的ps -elf；ps aux是BSD风格，同SOLARIS的/usr/ucb/ps -aux，估计LINUX和FREEBSD都用aux参数。另外，我的经验是：ps 的其它参数都不是很常用，只要死记住这两组参数，必要的时候会活用成ps -el、ps -e、ps ax之类的就够了。当然你还要熟悉一下这两组参数的命令输出中的每一列的含义，这个在man里都有写的，我也就不多说了。</p>
</div>
<br>
<img src ="http://www.cppblog.com/prayer/aggbug/100777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-11-12 10:26 <a href="http://www.cppblog.com/prayer/archive/2009/11/12/100777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux用户权限的管理</title><link>http://www.cppblog.com/prayer/archive/2009/09/24/97101.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Sep 2009 02:13:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/09/24/97101.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/97101.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/09/24/97101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/97101.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/97101.html</trackback:ping><description><![CDATA[在Linux操作系统中，root的权限是最高的，也被称为超级权限的拥有者。普通用户无法执行的操作，root用户都能完成，所以也被称之为超级管理用户。<br><br>在 系统中，每个文件、目录和进程，都归属于某一个用户，没有用户许可其它普通用户是无法操作的，但对root除外。root用户的特权性还表现在root可 以超越任何用户和用户组来对文件或目录进行读取、修改或删除（在系统正常的许可范围内）；对可执行程序的执行、终止；对硬件设备的添加、创建和移除等；也 可以对文件和目录进行属主和权限进行修改，以适合系统管理的需要（因为root是系统中权限最高的特权用户）；<br><br>一、对超级用户和普通用户的理解；<br><br>1、什么是超级用户；<br><br>在 所有Linux系统中，系统都是通过UID来区分用户权限级别的，而UID为0的用户被系统约定为是具有超级权限。超级用户具有在系统约定的最高权限满园 内操作，所以说超级用户可以完成系统管理的所有工具；我们可以通过/etc/passwd 来查得UID为0的用户是root，而且只有root对应的UID为0，从这一点来看，root用户在系统中是无可替代的至高地位和无限制权限。root 用户在系统中就是超级用户；<br><br>2、理解 UID 和用户的对应关系<br><br>当系统默认安装时，系统用户和UID 是一对一的对关系，也就是说一个UID 对应一个用户。我们知道用户身份是通过UID 来确认的，我们在 《用户（user）和用户组（group）配置文件详解》中的UID 的解说中有谈到?UID 是确认用户权限的标识，用户登录系统所处的角色是通过UID 来实现的，而非用户名；把几个用户共用一个UID 是危险的，比如我们把普通用户的UID 改为0，和root共用一个UID ，这事实上就造成了系统管理权限的混乱。如果我们想用root权限，可以通过su或sudo来实现；切不可随意让一个用户和root分享同一个UID ；?<br><br>在系统中，能不能让UID 和用户是一对多的关系？是可以的，比如我们可以把一个UID为0这个值分配给几个用户共同使用，这就是UID 和用户的一对多的关系。但这样做的确有点危险；相同UID的用户具有相同的身份和权限。比如我们在系统中把beinan这个普通用户的UID改为0后，事 实上这个普通用户就具有了超级权限，他的能力和权限和root用户一样；用户beinan所有的操作都将被标识为root的操作，因为beinan的 UID为0,而UID为0的用户是root ，是不是有点扰口？也可以理解为UID为0的用户就是root ，root用户的UID就是0；<br><br>UID和用户的一对一的对应关系 ，只是要求管理员进行系统管理时，所要坚守的准则，因为系统安全还是第一位的。所以我们还是把超级权限保留给root这唯一的用户是最好的选择；<br><br>如果我们不把UID的0值的分享给其它用户使用，只有root用户是唯一拥有UID=0的话，root用户就是唯一的超级权限用户；<br><br>3、普通用户和伪装用户<br><br>与 超级用户相对的就是普通用户和虚拟（也被称为伪装用户），普通和伪装用户都是受限用户；但为了完成特定的任务，普通用户和伪装用户也是必须的；Linux 是一个多用户、多任务的操作系统，多用户主要体现在用户的角色的多样性，不同的用户所分配的权限也不同；这也是Linux系统比Windows系统更为安 全的本质所在，即使是现在最新版本的Windows 2003 ，也无法抹去其单用户系统的烙印；<br><br>二. 超级用户（权限）在系统管理中的作用<br><br>超级权限用户（UID为0的用户）到底在系统管理中起什么作用呢？主要表现在以下两点；<br><br>1、对任何文件、目录或进程进行操作；<br><br>但值得注意的是这种操作是在系统最高许可范围内的操作；有些操作就是具有超级权限的root也无法完成；<br><br>比如/proc 目录，/proc 是用来反应系统运行的实时状态信息的，因此即便是root也无能为力；它的权限如下<br><br>[root@localhost ~]# pwd<br>/root<br>[root@localhost ~]# cd /<br>[root@localhost /]# ls -ld /proc/<br>dr-xr-xr-x 134 root root 0 2005-10-27 /proc/<br><br>就是这个目录，只能是读和执行权限，但绝对没有写权限的；就是我们把/proc 目录的写权限打开给root，root用户也是不能进行写操作；<br><br>[root@localhost ~]# chmod 755 /proc <br>[root@localhost /]# ls -ld /proc/<br>drwxr-xr-x 134 root root 0 2005-10-27 /proc/<br>[root@localhost /]# cd /proc/<br>[root@localhost proc]# mkdir testdir<br>mkdir: 无法创建目录?testdir?: 没有那个文件或目录<br><br>2、对于涉及系统全局的系统管理；<br><br>硬件管理、文件系统理解、用户管理以及涉及到的系统全局配置等等......如果您执行某个命令或工具时，提示您无权限，大多是需要超级权限来完成；<br><br>比如用adduser来添加用户，这个只能用通过超级权限的用户来完成；<br><br>3、超级权限的不可替代性；<br><br>由 于超级权限在系统管理中的不可缺少的重要作用，为了完成系统管理任务，我们必须用到超级权限；在一般情况下，为了系统安全，对于一般常规级别的应用，不需 要root用户来操作完成，root用户只是被用来管理和维护系统之用；比如系统日志的查看、清理，用户的添加和删除......<br><br>在不涉及系统管理的工作的环境下，普通用户足可以完成，比如编写一个文件，听听音乐；用gimp 处理一个<span>图片</span>等...... 基于普通应用程序的调用，大多普通用户就可以完成；<br><br>当我们以普通权限的用户登录系统时，有些系统配置及系统管理必须通过超级权限用户完成，比如对系统日志的管理，添加和删除用户。而如何才能不直接以root登录，却能从普通用户切换到root用户下才能进行操作系统管理需要的工作，这就涉及到超级权限管理的问题；<br><br>获取超级权限的过程，就是切换普通用户身份到超级用户身份的过程；这个过程主要是通过su和sudo 来解决；<br><br>三、使用 su 命令临时切换用户身份；<br><br>1、su 的适用条件和威力<br><br>su 命令就是切换用户的工具，怎么理解呢？比如我们以普通用户beinan登录的，但要添加用户任务，执行useradd ，beinan用户没有这个权限，而这个权限恰恰由root所拥有。解决办法无法有两个，一是退出beinan用户，重新以root用户登录，但这种办法 并不是最好的；二是我们没有必要退出beinan用户，可以用su来切换到root下进行添加用户的工作，等任务完成后再退出root。我们可以看到当然 通过su 切换是一种比较好的办法；<br><br>通过su可以在用户之间切换，如果超级权限用户root向普通或虚拟用户切换不需要密码，什么是权力？这就是！而普通用户切换到其它任何用户都需要密码验证；<br><br>2、su 的用法：<br><br>su [OPTION选项参数] [用户] <br><br>??-, -l, --login 登录并改变到所切换的用户环境；<br>??-c, --commmand=COMMAND 执行一个命令，然后退出所切换到的用户环境；<br><br>至于更详细的，请参看man su ；<br><br>3、su 的范例：<br><br>su 在不加任何参数，默认为切换到root用户，但没有转到root用户家目录下，也就是说这时虽然是切换为root用户了，但并没有改变root登录环境；用户默认的登录环境，可以在/etc/passwd 中查得到，包括家目录，SHELL定义等；<br><br>[beinan@localhost ~]$ su<br>Password:<br>[root@localhost beinan]# pwd<br>/<span>home</span>/beinan<br><br>su 加参数 - ，表示默认切换到root用户，并且改变到root用户的环境；<br><br>[beinan@localhost ~]$ pwd<br>/home/beinan<br>[beinan@localhost ~]$ su -<br>Password:<br>[root@localhost ~]# pwd<br>/root<br><br>su 参数 - 用户名 <br><br>[beinan@localhost ~]$ su - root 注：这个和su - 是一样的功能；<br>Password:<br>[root@localhost ~]# pwd<br>/root<br><br>[beinan@localhost ~]$ su - linuxsir 注：这是切换到 linuxsir用户<br>Password: 注：在这里输入密码；<br>[linuxsir@localhost ~]$ pwd 注：查看用户当前所处的位置；<br>/home/linuxsir<br>[linuxsir@localhost ~]$ id 注：查看用户的UID和GID信息，主要是看是否切换过来了； <br><br>uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir)<br>[linuxsir@localhost ~]$<br><br>[beinan@localhost ~]$ su - -c ls 注：这是su的参数组合，表示切换到root用户，并且改变到root环境，然后列出root家目录的文件，然后退出root用户；<br>Password: 注：在这里输入root的密码；<br>anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot <br><br>[beinan@localhost ~]$ pwd 注：查看当前用户所处的位置；<br>/home/beinan<br>[beinan@localhost ~]$ id 注：查看当前用户信息；<br>uid=500(beinan) gid=500(beinan) groups=500(beinan)<br><br>4、su的优缺点；<br><br>su 的确为管理带来方便，通过切换到root下，能完成所有系统管理工具，只要把root的密码交给任何一个普通用户，他都能切换到root来完成所有的系统管理工作；<br><br>但 通过su切换到root后，也有不安全因素；比如系统有10个用户，而且都参与管理。如果这10个用户都涉及到超级权限的运用，做为管理员如果想让其它用 户通过su来切换到超级权限的root，必须把root权限密码都告诉这10个用户；如果这10个用户都有root权限，通过root权限可以做任何事， 这在一定程度上就对系统的安全造成了威协；想想Windows吧，简直就是恶梦；<br><br>?没有不安全的系统，只有不安全的人?，我们绝对不能保证这10个用户都能按正常操作流程来管理系统，其中任何一人对系统操作的重大失误，都可能导致系统崩溃或数据损失；<br><br>所以su 工具在多人参与的系统管理中，并不是最好的选择，su只适用于一两个人参与管理的系统，毕竟su并不能让普通用户受限的使用；<br><br>超级用户root密码应该掌握在少数用户手中，这绝对是真理！所以集权而治的存在还是有一定道理的；<br><br>四、sudo 授权许可使用的su，也是受限制的su<br><br>1. sudo 的适用条件；<br><br>由 于su 对切换到超级权限用户root后，权限的无限制性，所以su并不能担任多个管理员所管理的系统。如果用su 来切换到超级用户来管理系统，也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时，最好是针对每个管理员的技术特长和 管理范围，并且有针对性的下放给权限，并且约定其使用哪些工具来完成与其相关的工作，这时我们就有必要用到 sudo。<br><br>通过sudo，我们能把某些超级权限有针对性的下放，并且不需要普通用户知道root密码，所以sudo 相对于权限无限制性的su来说，还是比较安全的，所以sudo 也能被称为受限制的su ；另外sudo 是需要授权许可的，所以也被称为授权许可的su；<br><br>sudo 执行命令的流程是当前用户切换到root（或其它指定切换到的用户），然后以root（或其它指定的切换到的用户）身份执行命令，执行完成后，直接退回到当前用户；而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权；<br><br>2、从编写 sudo 配置文件/etc/sudoers开始；<br><br>sudo的配置文件是/etc/sudoers ，我们可以用他的专用编辑工具visodu ，此工具的好处是在添加规则不太准确时，保存退出时会提示给我们错误信息；配置好后，可以用切换到您授权的用户下，通过sudo -l 来查看哪些命令是可以执行或禁止的；<br><br>/etc/sudoers 文件中每行算一个规则，前面带有#号可以当作是说明的内容，并不执行；如果规则很长，一行列不下时，可以用\号来续行，这样看来一个规则也可以拥有多个行；<br><br>/etc/sudoers 的规则可分为两类；一类是别名定义，另一类是授权规则；别名定义并不是必须的，但授权规则是必须的；<br><br>3、/etc/sudoers 配置文件中别名规则<br><br>别名规则定义格式如下：<br><br>Alias_Type NAME = item1, item2, ...<br><br>或<br><br>Alias_Type NAME = item1, item2, item3 : NAME = item4, item5<br><br>别名类型（Alias_Type）：别名类型包括如下四种<br><br>Host_Alias 定义主机别名；<br>User_Alias 用户别名，别名成员可以是用户，用户组（前面要加%号）<br>Runas_Alias 用来定义runas别名，这个别名指定的是?目的用户?，即sudo 允许切换至的用户；<br>Cmnd_Alias 定义命令别名；<br><br>NAME 就是别名了，NMAE的命名是包含大写字母、下划线以及数字，但必须以一个大写字母开头，比如SYNADM、SYN_ADM或SYNAD0是合法的，sYNAMDA或1SYNAD是不合法的；<br><br>item 按中文翻译是项目，在这里我们可以译成成员，如果一个别名下有多个成员，成员与成员之间，通过半角,号分隔；成员在必须是有效并事实存在的。什么是有效的 呢？比如主机名，可以通过w查看用户的主机名（或ip地址），如果您只是本地机操作，只通过hostname 命令就能查看；用户名当然是在系统中存在的，在/etc/paswd中必须存在；对于定义命令别名，成员也必须在系统中事实存在的文件名（需要绝对路 径）；<br><br>item成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约，定义什么类型的别名，就要有什么类型的成员相配。我们用Host_Alias定义主机别名时，成员必须是与主机相关相关联，比如是主机名（包括远程 登录的主机名）、ip地址（单个或整段）、掩码等；当用户登录时，可以通过w命令来查看登录用户主机信息；用User_Alias和 Runas_Alias定义时，必须要用系统用户做为成员；用Cmnd_Alias 定义执行命令的别名时，必须是系统存在的文件，文件名可以用通配符表示，配置Cmnd_Alias时命令需要绝对路径；<br><br>其中 Runas_Alias 和User_Alias 有点相似，但与User_Alias 绝对不是同一个概念，Runas_Alias 定义的是某个系统用户可以sudo 切换身份到Runas_Alias 下的成员；我们在授权规则中以实例进行解说；<br><br>别名规则是每行算一个规则，如果一个别名规则一行容不下时，可以通过\来续行；同一类型别名的定义，一次也可以定义几个别名，他们中间用:号分隔，<br><br>Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24 注：定义主机别名HT01，通过=号列出成员<br>Host_Alias HT02=st09,st10 注：主机别名HT02，有两个成员；<br>Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st10 注：上面的两条对主机的定义，可以通过一条来实现，别名之间用:号分割；<br><br>注： 我们通过Host_Alias 定义主机别名时，项目可以是主机名、可以是单个ip（整段ip地址也可以），也可以是网络掩码；如果是主机名，必须是多台机器的网络中，而且这些机器得能 通过主机名相互通信访问才有效。那什么才算是通过主机名相互通信或访问呢？比如 ping 主机名，或通过远程访问主机名来访问。在我们局域网中，如果让计算机通过主机名访问通信，必须设置/etc/hosts，/etc /resolv.conf ，还要有DNS做解析，否则相互之间无法通过主机名访问；在设置主机别名时，如果项目是中某个项目是主机名的话，可以通过hostname 命令来查看本地主机的主机名，通过w命令查来看登录主机是来源，通过来源来确认其它客户机的主机名或ip地址；对于主机别名的定义，看上去有点复杂，其实 是很简单。<br><br>如果您不明白Host_Alias 是怎么回事，也可以不用设置主机别名，在定义授权规则时通过ALL来匹配所有可能出现的主机情况。如果您把主机方面的知识弄的更明白，的确需要多多学习。<br><br>User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun 注：定义用户别名，下有四个成员；要在系统中确实在存在的；<br>User_Alias NETAD=beinan,bnnb 注：定义用户别名NETAD ，我想让这个别名下的用户来管理网络，所以取了NETAD的别名；<br>User_Alias WEBMASTER=linuxsir 注：定义用户别名WEBMASTER，我想用这个别名下的用户来管理网站；<br>User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir 注：上面三行的别名定义，可以通过这一行来实现，请看前面的说明，是不是符合？<br><br>Cmnd_Alias USERMAG=/<span>usr</span>/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod <br><br>注意：命令别名下的成员必须是文件或目录的绝对路径；<br><br>Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/parted<br>Cmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/net<span>work</span><br>Cmnd_Alias KILL = /usr/bin/kill<br>Cmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/halt <br>Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \ <br>? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???/usr/local/bin/tcsh, /usr/bin/rsh, \<br>? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???/usr/local/bin/zsh<br><br>注：这行定义命令别名有点长，可以通过 \ 号断行；<br><br>Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin <br><br>在上面的例子中，有KILL和PWMAG的命令别名定义，我们可以合并为一行来写，也就是等价行；<br><br>Cmnd_Alias KILL = /usr/bin/kill：PWMAG = /usr/sbin/reboot,/usr/sbin/halt 注：这一行就代表了KILL和PWMAG命令别名，把KILL和PWMAG的别名定义合并在一行写也是可以的；<br><br><br>Runas_Alias OP = root, operator <br>Runas_Alias DBADM=mysql:OP = root, operator 注：这行是上面两行的等价行；至于怎么理解Runas_Alias ，我们必须得通过授权规则的实例来理解；<br><br>4、/etc/sudoers中的授权规则：<br><br>授权规则是分配权限的执行规则，我们前面所讲到的定义别名主要是为了更方便的授权引用别名；如果系统中只有几个用户，其实下放权限比较有限的话，可以不用定义别名，而是针对系统用户直接直接授权，所以在授权规则中别名并不是必须的；<br><br>授权规则并不是无章可寻，我们只说基础一点的，比较简单的写法，如果您想详细了解授权规则写法的，请参看man sudoers<br><br><strong>授权用户 主机=命令动作</strong> <br><br>这三个要素缺一不可，但在动作之前也可以指定切换到特定用户下，在这里指定切换的用户要用( )号括起来，如果不需要密码直接运行命令的，应该加NOPASSWD:参数，但这些可以省略；举例说明；<br><br>实例一：<br><br>beinan ALL=/bin/chown,/bin/chmod <br><br>如 果我们在/etc/sudoers 中添加这一行，表示beinan 可以在任何可能出现的主机名的系统中，可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令，通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令；<br><br>值得注意的是，在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令；在省略的情况下默认为是切换到root用户下执行；同时也省略了是不是需要beinan用户输入验证密码，如果省略了，默认为是需要验证密码。<br><br>为了更详细的说明这些，我们可以构造一个更复杂一点的公式；<br><br>授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]...... <br><br>注解：<br><br>凡是[ ]中的内容，是可以省略；命令与命令之间用,号分隔；通过本文的例子，可以对照着看哪些是省略了，哪些地方需要有空格；<br>在[(切换到哪些用户或用户组)] ，如果省略，则默认为root用户；如果是ALL ，则代表能切换到所有用户；注意要切换到的目的用户必须用()号括起来，比如(ALL)、(beinan)<br><br>实例二：<br><br>beinan ALL=(root) /bin/chown, /bin/chmod <br><br>如 果我们把第一个实例中的那行去掉，换成这行；表示的是beinan 可以在任何可能出现的主机名的主机中，可以切换到root下执行 /bin/chown ，可以切换到任何用户招执行/bin/chmod 命令，通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令；<br><br>实例三：<br><br>beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod <br><br>如 果换成这个例子呢？表示的是beinan 可以在任何可能出现的主机名的主机中，可以切换到root下执行 /bin/chown ，不需要输入beinan用户的密码；并且可以切换到任何用户下执行/bin/chmod 命令，但执行chmod时需要beinan输入自己的密码；通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令；<br><br>关于一个命令动作是不是需要密码，我们可以发现在系统在默认的情况下是需要用户密码的，除非特加指出不需要用户需要输入自己密码，所以要在执行动作之前加入NOPASSWD: 参数； <br><br>有可能有的弟兄对系统管理的命令不太懂，不知道其用法，这样就影响了他对 sudoers定义的理解，下面我们再举一个最简单，最有说服务力的例子；<br><br>实例四：<br><br>比如我们想用beinan普通用户通过more /etc/shadow文件的内容时，可能会出现下面的情况；<br><br>[beinan@localhost ~]$ more /etc/shadow<br>/etc/shadow: 权限不够<br><br>这时我们可以用sudo more /etc/shadow 来读取文件的内容；就就需要在/etc/soduers中给beinan授权；<br><br>于是我们就可以先su 到root用户下通过visudo 来改/etc/sudoers ；（比如我们是以beinan用户登录系统的）<br><br>[beinan@localhost ~]$ su<br>Password: 注：在这里输入root密码 <br><br>下面运行visodu；<br><br>[root@localhost beinan]# visudo 注：运行visudo 来改 /etc/sudoers <br><br>加入如下一行，退出保存；退出保存，在这里要会用vi，visudo也是用的vi编辑器；至于vi的用法不多说了；<br><br>beinan ALL=/bin/more 表示beinan可以切换到root下执行more 来查看文件；<br><br>退回到beinan用户下，用exit命令；<br><br>[root@localhost beinan]# exit<br>exit<br>[beinan@localhost ~]$<br><br>查看beinan的通过sudo能执行哪些命令？ <br><br>[beinan@localhost ~]$ sudo -l<br>Password: 注：在这里输入beinan用户的密码<br>User beinan may run the following commands on this host: 注：在这里清晰的说明在本台主机上，beinan用户可以以root权限运行more ；在root权限下的more ，可以查看任何文本文件的内容的；<br>? ? (root) /bin/more<br><br>最后，我们看看是不是beinan用户有能力看到/etc/shadow文件的内容；<br><br>[beinan@localhost ~]$ sudo more /etc/shadow<br><br>beinan 不但能看到 /etc/shadow文件的内容，还能看到只有root权限下才能看到的其它文件的内容，比如；<br><br>[beinan@localhost ~]$ sudo more /etc/gshadow<br><br>对于beinan用户查看和读取所有系统文件中，我只想把/etc/shadow 的内容可以让他查看；可以加入下面的一行；<br><br>beinan ALL=/bin/more /etc/shadow<br><br>题外话：有的弟兄会说，我通过su 切换到root用户就能看到所有想看的内容了，哈哈，对啊。但咱们现在不是在讲述sudo的用法吗？如果主机上有多个用户并且不知道root用户的密码，但又想查看某些他们看不到的文件，这时就需要管理员授权了；这就是sudo的好处；<br><br>实例五：练习用户组在/etc/sudoers中写法；<br><br>如果用户组出现在/etc/sudoers 中，前面要加%号，比如%beinan ，中间不能有空格；<br><br>%beinan ALL=/usr/sbin/*,/sbin/*<br><br>如果我们在 /etc/sudoers 中加上如上一行，表示beinan用户组下的所有成员，在所有可能的出现的主机名下，都能切换到root用户下运行 /usr/sbin和/sbin目录下的所有命令；<br><br>实例六：练习取消某类程序的执行；<br><br>取消程序某类程序的执行，要在命令动作前面加上!号； 在本例中也出现了通配符的*的用法；<br><br>beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注：把这行规则加入到/etc/sudoers中；但您得有beinan这个用户组，并且beinan也是这个组中的才行；<br><br>本规则表示beinan用户在所有可能存在的主机名的主机上运行/usr/sbin和/sbin下所有的程序，但fdisk 程序除外； <br><br>[beinan@localhost ~]$ sudo -l<br>Password: 注：在这里输入beinan用户的密码；<br>User beinan may run the following commands on this host:<br>(root) /usr/sbin/*<br>(root) /sbin/*<br>(root) !/sbin/fdisk<br><br>[beinan@localhost ~]$ sudo /sbin/fdisk -l<br>Sorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost. <br><br>注：不能切换到root用户下运行fdisk 程序；<br><br><strong>实例七：别名的运用的实践；<br><br>假 如我们就一台主机localhost，能通过hostname 来查看，我们在这里就不定义主机别名了，用ALL来匹配所有可能出现的主机名；并且有beinan、linuxsir、lanhaitun 用户；主要是通过小例子能更好理解；sudo虽然简单好用，但能把说的明白的确是件难事；最好的办法是多看例子和man soduers ；<br><br>User_Alias SYSADER=beinan,linuxsir,%beinan <br>User_Alias DISKADER=lanhaitun <br>Runas_Alias OP=root <br>Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root <br>Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注：定义命令别名DSKCMD，下有成员parted和fdisk ；<br>SYSADER ALL= SYDCMD,DSKCMD <br>DISKADER ALL=(OP) DSKCMD</strong><br><br>注解：<br><br>第一行：定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员，用户组前面必须加%号；<br>第二行：定义用户别名 DISKADER ，成员有lanhaitun<br>第三行：定义Runas用户，也就是目标用户的别名为OP，下有成员root<br>第四行：定义SYSCMD命令别名，成员之间用,号分隔，最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密码；<br>第五行：定义命令别名DSKCMD，下有成员parted和fdisk ；<br>第 六行： 表示授权SYSADER下的所有成员，在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。更为明确遥说，beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd，但不能更改root的密码；也可以以root身份运行 parted和fdisk ，本条规则的等价规则是；<br><br>beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk <br><br>第七行：表示授权DISKADER 下的所有成员，能以OP的身份，来运行 DSKCMD ，不需要密码；更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令；其等价规则是：<br><br><br>lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk <br><br>可能有的弟兄会说我想不输入用户的密码就能切换到root并运行SYDCMD和DSKCMD 下的命令，那应该把把NOPASSWD:加在哪里为好？理解下面的例子吧，能明白的；<br><br>SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD <br><br>5、/etc/sudoers中其它的未尽事项；<br><br>在授权规则中，还有 NOEXEC:和EXEC的用法，自己查man sudoers 了解；还有关于在规则中通配符的用法，也是需要了解的。这些内容不多说了，毕竟只是一个入门性的文档。soduers配置文件要多简单就有多简单，要多难就有多难，就看自己的应用了。<br><br>6、sudo的用法；<br><br>我们在前面讲的/etc/sudoers 的规则写法，最终的目的是让用户通过sudo读取配置文件中的规则来实现匹配和授权，以便替换身份来进行命令操作，进而完成在其权限下不可完成的任务；<br><br>我们只说最简单的用法；更为详细的请参考man sudo<br><br>sudo [参数选项] 命令<br>-l 列出用户在主机上可用的和被禁止的命令；一般配置好/etc/sudoers后，要用这个命令来查看和测试是不是配置正确的；<br>-v 验证用户的时间戳；如果用户运行sudo 后，输入用户的密码后，在短时间内可以不用输入口令来直接进行sudo 操作；用-v 可以跟踪最新的时间戳；<br>-u 指定以以某个用户执行特定操作；<br>-k 删除时间戳，下一个sudo 命令要求用求提供密码；<br><br>举列：<br><br>首先我们通过visudo 来改/etc/sudoers 文件，加入下面一行；<br><br>beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk<br><br>然后列出beinan用户在主机上通过sudo 可以切换用户所能用的命令或被禁止用的命令；<br><br>[beinan@localhost ~]$ sudo -l 注：列出用户在主机上能通过切换用户的可用的或被禁止的命令；<br>Password: 注：在这里输入您的用户密码；<br>User beinan may run the following commands on this host:<br>? ? (root) /bin/chown 注：可以切换到root下用chown命令；<br>? ? (root) /bin/chmod 注：可以切换到root下用chmod命令；<br>? ? (root) /usr/sbin/adduser 注：可以切换到root下用adduser命令；<br>? ? (root) /usr/bin/passwd [A-Za-z]* 注：可以切换到root下用 passwd 命令；<br>? ? (root) !/usr/bin/passwd root 注：可以切换到root下，但不能执行passwd root 来更改root密码；<br>? ? (root) /sbin/parted 注：可以切换到 root下执行parted ；<br>? ? (root) /sbin/fdisk 注：可以切换到root下执行 fdisk ；<br><br>通过上面的sudo -l 列出可用命令后，我想通过chown 命令来改变/opt目录的属主为beinan ；<br><br>[beinan@localhost ~]$ ls -ld /opt 注：查看/opt的属主；<br>drwxr-xr-x 26 root root 4096 10月 27 10:09 /opt 注：得到的答案是归属root用户和root用户组； <br><br>[beinan@localhost ~]$ sudo chown beinan:beinan /opt 注：通过chown 来改变属主为beinan用户和beinan用户组；<br>[beinan@localhost ~]$ ls -ld /opt 注：查看/opt属主是不是已经改变了；<br>drwxr-xr-x 26 beinan beinan 4096 10月 27 10:09 /opt<br><br>我们通过上面的例子发现beinan用户能切换到root后执行改变用户口令的passwd命令；但上面的sudo -l 输出又明文写着不能更改root的口令；也就是说除了root的口令，beinan用户不能更改外，其它用户的口令都能更改。下面我们来测试；<br><br>对于一个普通用户来说，除了更改自身的口令以外，他不能更改其它用户的口令。但如果换到root身份执行命令，则可以更改其它用户的口令；<br><br>比如在系统中有linuxsir这个用户, 我们想尝试更改这个用户的口令，<br><br>[beinan@localhost ~]$ passwd linuxsir 注：不通过sudo 直接运行passwd 来更改linuxsir用户的口令；<br>passwd: Only root can specify a user name. 注：失败，提示仅能通过 root来更改；<br>[beinan@localhost ~]$ sudo passwd linuxsir 注：我们通过/etc/sudoers 的定义，让beinan切换到root下执行 passwd 命令来改变linuxsir的口令；<br>Changing password for user linuxsir. <br>New UNIX password: 注：输入新口令；<br>Retype new UNIX password: 注：再输入一次；<br>passwd: all authentication tokens updated successfully. 注：改变成功；
 <img src ="http://www.cppblog.com/prayer/aggbug/97101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-09-24 10:13 <a href="http://www.cppblog.com/prayer/archive/2009/09/24/97101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux用户管理全攻略（二）</title><link>http://www.cppblog.com/prayer/archive/2009/09/24/97098.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Sep 2009 01:52:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/09/24/97098.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/97098.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/09/24/97098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/97098.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/97098.html</trackback:ping><description><![CDATA[<p>摘要：本文详解用户（User）和用户组（Group）的配置文件，本文是《Linux 用户（User）和用户组（Group）管理概述》文档的关健部份的细化；通过本文，您至少能明白/etc/passwd /etc/group ，以及什么是UID和GID 等；其中对UID的重要性加以详细的论述；最后，本文还以通过修改用户及用户组配置文件的办法来实现管理用户和用户组，进而说明在Linux系统中，系统文件的重要性；</p>
<p><br>用户（User）和用户组（Group）的配置文件，是系统管理员最应该了解和掌握的系统基础文件之一，从另一方面来说，了解这些文件也是系统安全管理的重要组成部份；做为一个合格的系统管理员应该对用户和用户组配置文件透彻了解才行；</p>
<p>一、用户（User）相关；</p>
<p>谈到用户，就不得不谈用户管理，用户配置文件，以及用户查询和管理的控制工具；用户管理主要通过修改用户配置文件完成；用户管理控制工具最终目的也是为了修改用户配置文件。<br>什么是用户查询和管理控制工具呢？用户查询和控制工具是查询、添加、修改和删除用户等系统管理工具，比如查询用户的id和finger命令，添加用户的useradd 或adduser 、userdel 用户的删除 、设置密码的passwd命令、修改用户usermod 等等；我们需要知道的是通过用户查询和控制工具所进行的动作的最终目的也是修改用户配置文件；所以我们进行用户管理的时候，直接修改用户配置文件一样可以达到用户管理的目的；<br>通过上面的解说，我们能实实在在的感觉到用户（User）配置文件的重要性；其实用户和用户组在系统管理中是不可分割的，但为了说明问题，我们还是得把用户（User）的配置文件单列出来解说，其中包括/etc/passwd 和/etc/shadow 文件；在这之中，你还能了解UID的重要性；<br>通过本标题，您可以了解或掌握的内容有：了解/etc/passwd和/etc/shadow；什么UID ；<br>与用户相关的系统配置文件主要有/etc/passwd 和/etc/shadow，其中/etc/shadow是用户资讯的加密文件，比如用户的密码口令的加密保存等；/etc/passwd 和/etc/shadow 文件是互补的；我们可以通过对比两个文件来差看他们的区别；<br>1、关于/etc/passwd 和 UID；</p>
<p>/etc/passwd 是系统识别用户的一个文件，做个不恰当的比喻，/etc/passwd 是一个花名册，系统所有的用户都在这里有登录记载；当我们以beinan 这个账号登录时，系统首先会查阅 /etc/passwd 文件，看是否有beinan 这个账号，然后确定beinan的UID，通过UID 来确认用户和身份，如果存在则读取/etc/shadow 影子文件中所对应的beinan的密码；如果密码核实无误则登录系统，读取用户的配置文件；<br>1）/etc/passwd 的内容理解：</p>
<p>在/etc/passwd 中，每一行都表示的是一个用户的信息；一行有7个段位；每个段位用:号分割，比如下面是我的系统中的/etc/passwd 的两行；</p>
<p>beinan:x:500:500:beinan sun:/home/beinan:/bin/bash<br>linuxsir:x:505:502:linuxsir open,linuxsir office,13898667715:/home/linuxsir:/bin/bash<br>beinan:x:500:500:beinan sun:/home/beinan:/bin/bash<br>linuxsir:x:501:502::/home/linuxsir:/bin/bash<br>第一字段：用户名（也被称为登录名）；在上面的例子中，我们看到这两个用户的用户名分别是 beinan 和linuxsir；<br>第二字段：口令；在例子中我们看到的是一个x，其实密码已被映射到/etc/shadow 文件中；<br>第三字段：UID ；请参看本文的UID的解说；<br>第四字段：GID；请参看本文的GID的解说；<br>第五字段：用户名全称，这是可选的，可以不设置，在beinan这个用户中，用户的全称是beinan sun ；而linuxsir 这个用户是没有设置全称；<br>第六字段：用户的家目录所在位置；beinan 这个用户是/home/beinan ，而linuxsir 这个用户是/home/linuxsir ；<br>第七字段：用户所用SHELL 的类型，beinan和linuxsir 都用的是 bash ；所以设置为/bin/bash ；</p>
<p>2）关于UID 的理解：</p>
<p>UID 是用户的ID 值，在系统中每个用户的UID的值是唯一的，更确切的说每个用户都要对应一个唯一的UID ，系统管理员应该确保这一规则。系统用户的UID的值从0开始，是一个正整数，至于最大值可以在/etc/login.defs 可以查到，一般Linux发行版约定为60000； 在Linux 中，root的UID是0，拥有系统最高权限；<br>UID 在系统唯一特性，做为系统管理员应该确保这一标准，UID 的唯一性关系到系统的安全，应该值得我们关注！比如我在/etc/passwd 中把beinan的UID 改为0后，你设想会发生什么呢？beinan这个用户会被确认为root用户。beinan这个帐号可以进行所有root的操作；</p>
<p>UID 是确认用户权限的标识，用户登录系统所处的角色是通过UID 来实现的，而非用户名，切记；把几个用户共用一个UID 是危险的，比如我们上面所谈到的，把普通用户的UID 改为0，和root共用一个UID ，这事实上就造成了系统管理权限的混乱。如果我们想用root权限，可以通过su或sudo来实现；切不可随意让一个用户和root分享同一个UID ；</p>
<p>UID是唯一性，只是要求管理员所做的，其实我们修改/etc/passwd 文件，可以修改任何用户的UID的值为0，<br>一般情况下，每个Linux的发行版都会预留一定的UID和GID给系统虚拟用户占用，虚拟用户一般是系统安装时就有的，是为了完成系统任务所必须的用户，但虚拟用户是不能登录系统的，比如ftp、nobody、adm、rpm、bin、shutdown等；<br>在Fedora 系统会把前499 个UID和GID 预留出来，我们添加新用户时的UID 从500开始的，GID也是从500开始，至于其它系统，有的系统可能会把前999UID和GID预留出来；以各个系统中/etc/login.defs中的 UID_MIN 的最小值为准； Fedora 系统 login.defs的UID_MIN是500，而UID_MAX 值为60000，也就是说我们通过adduser默认添加的用户的UID的值是500到60000之间；而Slackware 通过adduser不指定UID来添加用户，默认UID 是从1000开始；</p>
<p>2、关于/etc/shadow ；<br>1）/etc/shadow 概说；</p>
<p>/etc/shadow文件是/etc/passwd 的影子文件，这个文件并不由/etc/passwd 而产生的，这两个文件是应该是对应互补的；shadow内容包括用户及被加密的密码以及其它/etc/passwd 不能包括的信息，比如用户的有效期限等；这个文件只有root权限可以读取和操作，权限如下：</p>
<p>-r-------- 1 root root 1.5K 10月 16 09:49 /etc/shadow<br>/etc/shadow 的权限不能随便改为其它用户可读，这样做是危险的。如果您发现这个文件的权限变成了其它用户组或用户可读了，要进行检查，以防系统安全问题的发生；<br>如果我们以普通用户查看这个文件时，应该什么也查看不到，提示是权限不够：</p>
<p>[beinan@localhost ~]$ more /etc/shadow<br>/etc/shadow: 权限不够</p>
<p>2）/etc/shadow 的内容分析；</p>
<p>/etc/shadow 文件的内容包括9个段位，每个段位之间用:号分割；我们以如下的例子说明；</p>
<p>beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::<br>linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:<br>第一字段：用户名（也被称为登录名），在/etc/shadow中，用户名和/etc/passwd 是相同的，这样就把passwd 和shadow中用的用户记录联系在一起；这个字段是非空的；<br>第二字段：密码（已被加密），如果是有些用户在这段是x，表示这个用户不能登录到系统；这个字段是非空的；<br>第三字段：上次修改口令的时间；这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔（天数），您可以通过passwd 来修改用户的密码，然后查看/etc/shadow中此字段的变化；<br>第四字段：两次修改口令间隔最少的天数；如果设置为0,则禁用此功能；也就是说用户必须经过多少天才能修改其口令；此项功能用处不是太大；默认值是通过/etc/login.defs文件定义中获取，PASS_MIN_DAYS 中有定义；<br>第五字段：两次修改口令间隔最多的天数；这个能增强管理员管理用户口令的时效性，应该说在增强了系统的安全性；如果是系统默认值，是在添加用户时由/etc/login.defs文件定义中获取，在PASS_MAX_DAYS 中定义；<br>第六字段：提前多少天警告用户口令将过期；当用户登录系统后，系统登录程序提醒用户口令将要作废；如果是系统默认值，是在添加用户时由/etc/login.defs文件定义中获取，在PASS_WARN_AGE 中定义；<br>第七字段：在口令过期之后多少天禁用此用户；此字段表示用户口令作废多少天后，系统会禁用此用户，也就是说系统会不能再让此用户登录，也不会提示用户过期，是完全禁用；<br>第八字段：用户过期日期；此字段指定了用户作废的天数（从1970年的1月1日开始的天数），如果这个字段的值为空，帐号永久可用；<br>第九字段：保留字段，目前为空，以备将来Linux发展之用；<br>如果更为详细的，请用 man shadow来查看帮助，您会得到更为详尽的资料；<br>我们再根据实例分析：<br>beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::<br>linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:<br>第一字段：用户名（也被称之为登录名），在例子中有峡谷两条记录，也表示有两个用户beinan和linuxsir<br>第二字段：被加密的密码，如果有的用户在此字段中是x，表示这个用户不能登录系统，也可以看作是虚拟用户，不过虚拟用户和真实用户都是相对的，系统管理员随时可以对任何用户操作；<br>第三字段：表示上次更改口令的天数（距1970年01月01日），上面的例子能说明beinan和linuxsir这两个用户，是在同一天更改了用户密码，当然是通过passwd 命令来更改的，更改密码的时间距1970年01月01日的天数为13072；<br>第四字段：禁用两次口令修改之间最小天数的功能，设置为0<br>第五字段：两次修改口令间隔最多的天数，在例子中都是99999天；这个值如果在添加用户时没有指定的话，是通过/etc/login.defs来获取默认值，PASS_MAX_DAYS 99999；您可以查看/etc/login.defs来查看，具体的值；<br>第六字段：提前多少天警告用户口令将过期；当用户登录系统后，系统登录程序提醒用户口令将要作废；如果是系统默认值，是在添加用户时由/etc/login.defs文件定义中获取，在PASS_WARN_AGE 中定义；在例子中的值是7 ，表示在用户口令将过期的前7天警告用户更改期口令；<br>第七字段：在口令过期之后多少天禁用此用户；此字段表示用户口令作废多少天后，系统会禁用此用户，也就是说系统会不能再让此用户登录，也不会提示用户过期，是完全禁用；在例子中，此字段两个用户的都是空的，表示禁用这个功能；<br>第八字段：用户过期日期；此字段指定了用户作废的天数（从1970年的1月1日开始的天数），如果这个字段的值为空，帐号永久可用；在例子中，我们看到beinan这个用户在此字段是空的，表示此用户永久可用；而linuxsir这个用户表示在距1970年01月01日后13108天后过期，算起来也就是2005年11月21号过期；哈哈，如果有兴趣的的弟兄，自己来算算，大体还是差不多的;)；<br>第九字段：保留字段，目前为空，以备将来Linux发展之用；</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/wupan168/archive/2009/09/17/4563268.aspx">http://blog.csdn.net/wupan168/archive/2009/09/17/4563268.aspx</a></p>
<img src ="http://www.cppblog.com/prayer/aggbug/97098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-09-24 09:52 <a href="http://www.cppblog.com/prayer/archive/2009/09/24/97098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux用户管理全攻略（一）</title><link>http://www.cppblog.com/prayer/archive/2009/09/24/97095.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Sep 2009 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/09/24/97095.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/97095.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/09/24/97095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/97095.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/97095.html</trackback:ping><description><![CDATA[<p>Linux 用户（user）和用户组（group）管理概述</p>
<p>摘要：本文主要讲述在Linux 系统中用户(user)和用户组(group)管理相应的概念；用户(user)和用户组(group)相关命令的列举；其中也对单用户多任务，多用户多任务也做以解说，本文应该说是比较基础的文档；</p>
<p><br>一、理解Linux的单用户多任务，多用户多任务概念；<br>Linux 是一个多用户、多任务的操作系统；我们应该了解单用户多任务和多用户多任务的概念；</p>
<p>1、Linux 的单用户多任务；<br>单用户多任务；比如我们以beinan 登录系统，进入系统后，我要打开gedit 来写文档，但在写文档的过程中，我感觉少点音乐，所以又打开xmms 来点音乐；当然听点音乐还不行，MSN 还得打开，想知道几个弟兄现在正在做什么，这样一样，我在用beinan 用户登录时，执行了gedit 、xmms以及msn等，当然还有输入法fcitx ；这样说来就有点简单了，一个beinan用户，为了完成工作，执行了几个任务；当然beinan这个用户，其它的人还能以远程登录过来，也能做其它的工作。</p>
<p>2、Linux 的多用户、多任务；</p>
<p>有时可能是很多用户同时用同一个系统，但并不所有的用户都一定都要做同一件事，所以这就有多用户多任务之说；<br>举个例子，比如LinuxSir.Org 服务器，上面有FTP 用户、系统管理员、web 用户、常规普通用户等，在同一时刻，可能有的弟兄正在访问论坛；有的可能在上传软件包管理子站，比如luma 或Yuking 兄在管理他们的主页系统和FTP ；在与此同时，可能还会有系统管理员在维护系统；浏览主页的用的是nobody 用户，大家都用同一个，而上传软件包用的是FTP用户；管理员的对系统的维护或查看，可能用的是普通帐号或超级权限root帐号；不同用户所具有的权限也不同，要完成不同的任务得需要不同的用户，也可以说不同的用户，可能完成的工作也不一样；<br>值得注意的是：多用户多任务并不是大家同时挤到一接在一台机器的的键盘和显示器前来操作机器，多用户可能通过远程登录来进行，比如对服务器的远程控制，只要有用户权限任何人都是可以上去操作或访问的；</p>
<p>3、用户的角色区分；</p>
<p>用户在系统中是分角色的，在Linux 系统中，由于角色不同，权限和所完成的任务也不同；值得注意的是用户的角色是通过UID和识别的，特别是UID；在系统管理中，系统管理员一定要坚守UID 唯一的特性；<br>root 用户：系统唯一，是真实的，可以登录系统，可以操作系统任何文件和命令，拥有最高权限；<br>虚拟用户：这类用户也被称之为伪用户或假用户，与真实用户区分开来，这类用户不具有登录系统的能力，但却是系统运行不可缺少的用户，比如bin、daemon、adm、ftp、mail等；这类用户都系统自身拥有的，而非后来添加的，当然我们也可以添加虚拟用户；<br>普通真实用户：这类用户能登录系统，但只能操作自己家目录的内容；权限有限；这类用户都是系统管理员自行添加的；</p>
<p>4、多用户操作系统的安全；</p>
<p>多用户系统从事实来说对系统管理更为方便。从安全角度来说，多用户管理的系统更为安全，比如beinan用户下的某个文件不想让其它用户看到，只是设置一下文件的权限，只有beinan一个用户可读可写可编辑就行了，这样一来只有beinan一个用户可以对其私有文件进行操作，Linux 在多用户下表现最佳，Linux能很好的保护每个用户的安全，但我们也得学会Linux 才是，再安全的系统，如果没有安全意识的管理员或管理技术，这样的系统也不是安全的。<br>从服务器角度来说，多用户的下的系统安全性也是最为重要的，我们常用的Windows 操作系统，它在系纺权限管理的能力只能说是一般般，根本没有没有办法和Linux或Unix 类系统相比；</p>
<p>二、用户(user）和用户组（group）概念；</p>
<p>1、用户（user）的概念；<br>通过前面对Linux 多用户的理解，我们明白Linux 是真正意义上的多用户操作系统，所以我们能在Linux系统中建若干用户（user）。比如我们的同事想用我的计算机，但我不想让他用我的用户名登录，因为我的用户名下有不想让别人看到的资料和信息（也就是隐私内容）这时我就可以给他建一个新的用户名，让他用我所开的用户名去折腾，这从计算机安全角度来说是符合操作规则的；<br>当然用户（user）的概念理解还不仅仅于此，在Linux系统中还有一些用户是用来完成特定任务的，比如nobody和ftp 等，我们访问LinuxSir.Org 的网页程序，就是nobody用户；我们匿名访问ftp 时，会用到用户ftp或nobody ；如果您想了解Linux系统的一些帐号，请查看 /etc/passwd ；</p>
<p>2、用户组（group）的概念；<br>用户组（group）就是具有相同特征的用户（user）的集合体；比如有时我们要让多个用户具有相同的权限，比如查看、修改某一文件或执行某个命令，这时我们需要用户组，我们把用户都定义到同一用户组，我们通过修改文件或目录的权限，让用户组具有一定的操作权限，这样用户组下的用户对该文件或目录都具有相同的权限，这是我们通过定义组和修改文件的权限来实现的；<br>举例：我们为了让一些用户有权限查看某一文档，比如是一个时间表，而编写时间表的人要具有读写执行的权限，我们想让一些用户知道这个时间表的内容，而不让他们修改，所以我们可以把这些用户都划到一个组，然后来修改这个文件的权限，让用户组可读，这样用户组下面的每个用户都是可读的；<br>用户和用户组的对应关系是：一对一、多对一、一对多或多对多；<br>一对一：某个用户可以是某个组的唯一成员；<br>多对一：多个用户可以是某个唯一的组的成员，不归属其它用户组；比如beinan和linuxsir两个用户只归属于beinan用户组；<br>一对多：某个用户可以是多个用户组的成员；比如beinan可以是root组成员，也可以是linuxsir用户组成员，还可以是adm用户组成员；<br>多对多：多个用户对应多个用户组，并且几个用户可以是归属相同的组；其实多对多的关系是前面三条的扩展；理解了上面的三条，这条也能理解；</p>
<p>三、用户（user）和用户组（group）相关的配置文件、命令或目录；</p>
<p>1、与用户（user）和用户组（group）相关的配置文件；<br>1）与用户（user）相关的配置文件；</p>
<p>/etc/passwd 注：用户（user）的配置文件；<br>/etc/shadow 注：用户（user）影子口令文件；</p>
<p>2）与用户组（group）相关的配置文件；<br>/etc/group 注：用户组（group）配置文件；<br>/etc/gshadow 注：用户组（group）的影子文件；</p>
<p>2、管理用户（user）和用户组（group）的相关工具或命令；</p>
<p>1）管理用户（user）的工具或命令；<br>useradd 注：添加用户<br>adduser 注：添加用户<br>passwd 注：为用户设置密码<br>usermod 注：修改用户命令，可以通过usermod 来修改登录名、用户的家目录等等；<br>pwcov 注：同步用户从/etc/passwd 到/etc/shadow<br>pwck 注：pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整；<br>pwunconv 注：是pwcov 的立逆向操作，是从/etc/shadow和 /etc/passwd 创建/etc/passwd ，然后会删除 /etc/shadow 文件；<br>finger 注：查看用户信息工具<br>id 注：查看用户的UID、GID及所归属的用户组<br>chfn 注：更改用户信息工具<br>su 注：用户切换工具<br>sudo 注：sudo 是通过另一个用户来执行命令（execute a command as another user），su 是用来切换用户，然后通过切换到的用户来完成相应的任务，但sudo 能后面直接执行命令，比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令；但得通过visudo 来编辑/etc/sudoers来实现；<br>visudo 注：visodo 是编辑 /etc/sudoers 的命令；也可以不用这个命令，直接用vi 来编辑 /etc/sudoers 的效果是一样的；<br>sudoedit 注：和sudo 功能差不多；</p>
<p>2）管理用户组（group）的工具或命令；</p>
<p>groupadd 注：添加用户组；<br>groupdel 注：删除用户组；<br>groupmod 注：修改用户组信息<br>groups 注：显示用户所属的用户组<br>grpck<br>grpconv 注：通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ，如果/etc/gshadow 不存在则创建；<br>grpunconv 注：通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ，然后删除gshadow文件；</p>
<p>3、/etc/skel 目录；<br>/etc/skel目录一般是存放用户启动文件的目录，这个目录是由root权限控制，当我们添加用户时，这个目录下的文件自动复制到新添加的用户的家目录下；/etc/skel 目录下的文件都是隐藏文件，也就是类似.file格式的；我们可通过修改、添加、删除/etc/skel目录下的文件，来为用户提供一个统一、标准的、默认的用户环境；</p>
<p>[root@localhost beinan]# ls -la /etc/skel/<br>总用量 92<br>drwxr-xr-x 3 root root 4096 8月 11 23:32 .<br>drwxr-xr-x 115 root root 12288 10月 14 13:44 ..<br>-rw-r--r-- 1 root root 24 5月 11 00:15 .bash_logout<br>-rw-r--r-- 1 root root 191 5月 11 00:15 .bash_profile<br>-rw-r--r-- 1 root root 124 5月 11 00:15 .bashrc<br>-rw-r--r-- 1 root root 5619 2005-03-08 .canna<br>-rw-r--r-- 1 root root 438 5月 18 15:23 .emacs<br>-rw-r--r-- 1 root root 120 5月 23 05:18 .gtkrc<br>drwxr-xr-x 3 root root 4096 8月 11 23:16 .kde<br>-rw-r--r-- 1 root root 658 2005-01-17 .zshrc<br>/etc/skel 目录下的文件，一般是我们用useradd 和adduser 命令添加用户（user）时，系统自动复制到新添加用户（user）的家目录下；如果我们通过修改 /etc/passwd 来添加用户时，我们可以自己创建用户的家目录，然后把/etc/skel 下的文件复制到用户的家目录下，然后要用chown 来改变新用户家目录的属主；<br>4、/etc/login.defs 配置文件；<br>/etc/login.defs 文件是当创建用户时的一些规划，比如创建用户时，是否需要家目录，UID和GID的范围；用户的期限等等，这个文件是可以通过root来定义的；<br>比如Fedora 的 /etc/logins.defs 文件内容；</p>
<p># *REQUIRED*<br># Directory where mailboxes reside, _or_ name of file, relative to the<br># home directory. If you _do_ define both, MAIL_DIR takes precedence.<br># QMAIL_DIR is for Qmail<br>#<br>#QMAIL_DIR Maildir<br>MAIL_DIR /var/spool/mail 注：创建用户时，要在目录/var/spool/mail中创建一个用户mail文件；<br>#MAIL_FILE .mail<br># Password aging controls:<br>#<br># PASS_MAX_DAYS Maximum number of days a password may be used.<br># PASS_MIN_DAYS Minimum number of days allowed between password changes.<br># PASS_MIN_LEN Minimum acceptable password length.<br># PASS_WARN_AGE Number of days warning given before a password expires.<br>#<br>PASS_MAX_DAYS 99999 注：用户的密码不过期最多的天数；<br>PASS_MIN_DAYS 0 注：密码修改之间最小的天数；<br>PASS_MIN_LEN 5 注：密码最小长度；<br>PASS_WARN_AGE 7 注：<br>#<br># Min/max values for automatic uid selection in useradd<br>#<br>UID_MIN 500 注：最小UID为500 ，也就是说添加用户时，UID 是从500开始的；<br>UID_MAX 60000 注：最大UID为60000；<br>#<br># Min/max values for automatic gid selection in groupadd<br>#<br>GID_MIN 500 注：GID 是从500开始；<br>GID_MAX 60000<br>#<br># If defined, this command is run when removing a user.<br># It should remove any at/cron/print jobs etc. owned by<br># the user to be removed (passed as the first argument).<br>#<br>#USERDEL_CMD /usr/sbin/userdel_local<br>#<br># If useradd should create home directories for users by default<br># On RH systems, we do. This option is ORed with the -m flag on<br># useradd command line.<br>#<br>CREATE_HOME yes 注：是否创用户家目录，要求创建；</p>
<p>5、/etc/default/useradd 文件；</p>
<p>通过useradd 添加用户时的规则文件；</p>
<p>&nbsp;# useradd defaults file<br>GROUP=100<br>HOME=/home 注：把用户的家目录建在/home中；<br>INACTIVE=-1 注：是否启用帐号过期停权，-1表示不启用；<br>EXPIRE= 注：帐号终止日期，不设置表示不启用；<br>SHELL=/bin/bash 注：所用SHELL的类型；<br>SKEL=/etc/skel 注：默认添加用户的目录默认文件存放位置；也就是说，当我们用adduser添加用户时，用户家目录下的文件，都是从这个目录中复制过去的；</p>
<p>后记：</p>
<p>关于用户（user）和用户组（group）管理内容大约就是这么多；只要把上面所说的内容了解和掌握，用户（user）和用户组（group）管理就差不多了；由于用户（user）和用户组（group）是和文件及目录权限联系在一起的，所以文件及目录权限的操作也会独立成文来给大家介绍；<br>本文只是让新手弟兄明白用户（user）和用户组（group）一些原理，所以我在写此文的时候，大多是解说内容，我的意思是通过解说和索引一些命令，让新手弟兄明白一点理论是比较重要的，技术操作无非是命令的用法；</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/wupan168/archive/2009/09/17/4563265.aspx">http://blog.csdn.net/wupan168/archive/2009/09/17/4563265.aspx</a></p>
<img src ="http://www.cppblog.com/prayer/aggbug/97095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-09-24 09:40 <a href="http://www.cppblog.com/prayer/archive/2009/09/24/97095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>