Linux 101 Hacks linux.101hacks.com
I
Linux 101 Hacks linux.101hacks.com
II
译者序
《Linux 101 Hacks》是哈工大IBM技术俱乐部08年新人暑假培训中学习Linux基本系统管理知识的参考文献,该书中的很多技巧对于初学者提高系统管理的工作效率很有帮助。考虑到很多初学者因为个人程度或者习惯的原因,更喜欢中文版的文档,因此在开学后,IBM俱乐部组织所有新人对《Linux 101 Hacks》进行了翻译。从大二到大三的七名同学参与了翻译工作,他们是:朱涛,陶克路,白亚龙,王珑珑,谭振声,黄大伟,许之晟。 本书主审是哈尔滨工业大学计算机学院吴晋老师,同时由李志,熊飞,张智,韩文祥,王澍,张祖羽协助完成部分章节的审校,他们牺牲了宝贵的考试复习和工作时间对译版的初稿进行了细致的批注和修改,让我们受益颇多,在此向他们表示感谢。本书基于原版模板制作,最后的统稿以及排版由朱涛完成。 本书的翻译工作得到了作者Ramesh Natarajan和浮图开放实验室的很大支持,在此向他们表示感谢。 本书所有Hacks都已在Ubuntu 9.04 环境下测试通过。本书仅供学习交流之用,整个翻译过程存在错误与疏漏不可避免。如果书中存在任何问题,请用以下方式联系我们:
作者网站:http://www.thegeekstuff.com/
原书网站:http://linux.101hacks.com/
译者网站: blog.footoo.org blog.cliffwoo.com 译者联系方式:
[email protected] [email protected]
Linux 101 Hacks linux.101hacks.com
III www.thegeekstuff.com
目录
译者序 ................................................................................... II
目录 ..................................................................................... III
引文 ...................................................................................... 1
关于作者 ................................................................................ 2
电子书《Vim 101 Hacks》 ........................................................... 3
版权和声明 .............................................................................. 4
前言 ...................................................................................... 5
版本 ...................................................................................... 6
第一章:强大的CD命令技巧 ......................................................... 7
技巧1:CDPATH : 设置cd命令的基目录 ....................................................... 7
技巧2:使用cd和alias命令快速返回上级目录 ................................................ 8
技巧3:用一条语句执行―mkdir‖和―cd‖命令 ................................................. 10
技巧4:用―cd -‖在最近访问的两个目录之间切换 ............................................ 10
技巧5:用―dirs‖、―pushd‖、―popd‖来操作目录栈 ........................................ 11
技巧6:用―shopt –s cdspell‖自动纠正―cd‖命令的目录名输入错误 ...................... 13
第二章:日期操作 .................................................................... 14
技巧7:设置系统日期和时间 ..................................................................... 14
技巧8:设置硬件日期和时间 ..................................................................... 14
技巧9:用特定格式显示当前时间 ............................................................... 15
技巧10:显示过去的日期和时间 ................................................................ 16
技巧11:显示未来的日期和时间 ................................................................ 17
第三章:SSH(Secure SHell)客户端命令 ....................................... 19
技巧12:查看SSH客户端版本 ................................................................... 19
技巧13:用SSH登录到远程主机 ................................................................ 19
技巧14:调试SSH客户端会话 ................................................................... 20
技巧15:用SSH退出符切换SSH会话 .......................................................... 21
技巧16:用SSH退出字符会话,显示信息 ..................................................... 22
第四章:重要的linux命令 ......................................................... 24
技巧17:grep命令 ................................................................................ 24
技巧18:find命令 ................................................................................. 25
技巧19:禁止标准输出和错误信息的输出 ..................................................... 26
技巧20:join命令 ................................................................................. 27
Linux 101 Hacks linux.101hacks.com
IV www.thegeekstuff.com
技巧21:改变字符的大小写 ...................................................................... 27
技巧22:xargs命令 ............................................................................... 28
技巧23:sort命令 ................................................................................. 29
技巧24:uniq命令 ................................................................................ 31
技巧25:cut命令 .................................................................................. 31
技巧26:stat命令 ................................................................................. 32
技巧27:diff命令 ................................................................................. 33
技巧28:显示用户总的连接时间 ................................................................ 34
第五章:PS1,PS2,PS3和PROMPT_COMMAND .................................. 36
技巧29:PS1——默认提示符 ..................................................................... 36
技巧30:PS2——再谈提示符 ..................................................................... 36
技巧31:PS3——Shell脚本中使用select时的提示符 ....................................... 37
技巧32:PS4——PS4-―set -x"用来修改跟踪输出的前缀 ..................................... 38
技巧33:PROMPT_COMMAND环境变量 ....................................................... 39
第六章:用功能强大的彩色终端快速使用PS1 ................................... 40
技巧34:在提示符中显示用户名,主机名,当前目录 ....................................... 40
技巧35:在提示符里显示当前时间.............................................................. 40
技巧36:任意命令的输出作为提示符 ........................................................... 41
技巧37:改变提示符的前景颜色 ................................................................ 41
技巧38:改变提示符的背景色 ................................................................... 42
技巧39:在提示符中显示多种颜色.............................................................. 42
技巧40:用tput改变提示符颜色 ............................................................... 43
技巧41:使用已有的PS1变量创建自己的提示符 ............................................ 44
技巧42:通过PS1调用bash shell函数 ....................................................... 45
技巧43:通过PS1中调用shell脚本 ........................................................... 45
第七章:归档和压缩 ................................................................. 47
技巧 44:zip命令基础 ............................................................................ 47
技巧 45:zip高级用法 ............................................................................ 49
技巧 46:zip文件的密码保护 ................................................................... 49
技巧 47:检查zip文件的完整性 ................................................................ 50
技巧 48:tar命令的基础知识.................................................................... 50
技巧 49:在tar中使用gzip, bzip2 ............................................................ 51
第八章:history命令................................................................ 52
技巧 50:使用HISTTIMEFORMAT在历史中显示TIMESTAMP .............................. 52
技巧 51:用Ctrl + R搜索历史命令........................................................... 52
技巧 52:四种不同的方法快速执行之前的命令 ............................................... 53
技巧 53:执行历史命令中的特定命令 .......................................................... 53
技巧 54:执行以特定字开头的历史命令 ....................................................... 53
技巧 55:用HISTSIZE控制历史命令的总数 ................................................... 53
技巧 56:使用HISTFILE改变历史文件名 ...................................................... 54
技巧 57:使用HISTCONTROL来消除命令历史中的连续重复条目......................... 54
Linux 101 Hacks linux.101hacks.com
V www.thegeekstuff.com
技巧 58:使用HISTCONTROL在整个历史中去除重复命令 ................................. 54
技巧 59:使用HISTCONTROL强制history忽略某条特定命令 ............................ 55
技巧 60:使用c选项清除所有的历史命令 .................................................... 55
技巧 61:替换命令历史中的内容 ................................................................ 55
技巧 62:替换特定命令的特定参数 ............................................................. 56
技巧63:用HISTSIZE禁用history .............................................................. 56
技巧64:用HISTIGNORE让history在存储时忽略某些指令 ............................... 56
第九章:系统管理任务 .............................................................. 58
技巧 65:用 fdisk 进行分区 ..................................................................... 58
技巧 66:用 mke2fsk 格式化分区 ............................................................. 59
技巧 67:挂载分区 ................................................................................ 60
技巧 68:用tune2fs进行分区调整 ............................................................. 61
技巧 69:创建交换分区 ........................................................................... 62
技巧 70:创建新用户 .............................................................................. 62
技巧 71:创建新的组并将用户加入该组 ....................................................... 63
技巧 72:在OpenSSH中设置SSH的无密码登陆 ............................................. 64
技巧 73:与 ssh-agent 一起来使用 ssh-copy-id ............................................ 65
技巧 74:crontab ................................................................................. 66
技巧 75:用Magic SysRq键实现Linux安全重启 ............................................ 68
第十章:Apachectl 和 Httpd 实例 ............................................... 70
技巧76:传递不同的httpd.conf文件给apachectl ......................................... 70
技巧77:使用一个临时DocumentRoot而不修改httpd.conf ............................. 71
技巧78:暂时提高Log的级别 ................................................................... 71
技巧79:显示Apache内的模块 ................................................................. 72
技巧80:显示httpd.conf内所有可接受的指令 .............................................. 72
技巧81:验证被修改的httpd.conf ............................................................. 73
技巧82:显示httpd的编译参数 ................................................................ 73
技巧83:根据需要加载一个指定模块 ........................................................... 74
第十一章:Bash脚本 ................................................................ 76
技巧84:.bash_*files的执行顺序 .............................................................. 76
技巧85:如何在bash shell中产生随机数 ..................................................... 77
技巧86:调试一个脚本 ........................................................................... 77
技巧87:使用引号(Quoting) ................................................................. 78
技巧88:将数据文件的指定域读取到shell脚本中 ........................................... 80
第十二章:监控系统和性能 ......................................................... 81
技巧89:free命令................................................................................. 81
技巧90:top命令 .................................................................................. 81
技巧91:ps命令 ................................................................................... 83
技巧92:df命令 ................................................................................... 85
技巧93:kill命令 .................................................................................. 85
技巧94:du命令 ................................................................................... 87
Linux 101 Hacks linux.101hacks.com
VI www.thegeekstuff.com
技巧95:lsof命令 ................................................................................. 87
技巧96:sar命令 .................................................................................. 89
技巧97:vmstat命令 ............................................................................. 91
技巧98:netstat命令 ............................................................................. 92
技巧99:sysctl命令 ............................................................................... 94
技巧100:nice命令 ............................................................................... 95
技巧101:renice命令 ............................................................................ 96
第十三章 一些额外的技巧 .......................................................... 98
额外技巧1:让cd命令对参数大小写不敏感 .................................................. 98
额外技巧2:一次动作为多次SSH连接指定密码 .............................................. 99
额外技巧3:rar命令用法示例 .................................................................. 100
额外技巧4:用Comm命令比较两个文件 ..................................................... 102
额外技巧5:Compact-Disk (CD)操作 .......................................................... 102
额外技巧6:DVD操作 ............................................................................ 103
额外技巧7:从CD或者DVD创建ISO文件 ................................................... 105
额外技巧8:OD命令用法示例 .................................................................. 106
额外技巧9:Gpg 命令用法示例 ................................................................ 107
额外的技巧10:Tee命令示例 .................................................................. 111
12本精彩的Linux书籍 ............................................................113
扩展阅读 .............................................................................115
您的反馈与支持 .....................................................................116
Linux 101 Hacks linux.101hacks.com
1 www.thegeekstuff.com
引文
―世界上只有10种人:理解H二进制H的人,不理解二进制的人,以及理解H格雷码H的人‖ -- Geek 本书中共介绍了101条技巧,以此来帮助你打下坚实的Linux系统管理的基础。每条技巧中都有与之对应的示例来帮助你理解。 这本书包含13个章节,前六章的技巧是基于我以前发表的日志整理过来的。后面六章是刚刚发表的。 第十三章“额外技巧”,包含10个新加的技巧。我们会在后续的版本中增添更多的技巧。
你还可以在如下网站阅读此书——http://linux.101hacks.com/
Linux 101 Hacks linux.101hacks.com
2 www.thegeekstuff.com
关于作者
我是Ramesh Natarajan,The Geek Stuff博客以及本书的作者。
我精通多门编程语言,而C是我的最爱。我还曾从事过一些基础架构方面的工作,如Linux系统管理,数据库管理,网络,硬件和存储(EMC)。
我还开发过一个免费,简单,可靠的密码管理系统——Password Dragon,它可以Windows,Linux,Max下运行。
同时我也是《vim 101 hacks》的作者——thegeekstuff.com/vim-101-hacks-ebook/
如果对本书有意见反馈,请通过这个thegeekstuff.com/contac我联系。
Linux 101 Hacks linux.101hacks.com
3 www.thegeekstuff.com
电子书《Vim 101 Hacks》
如果你喜欢电子书《Linux 101 Hacks》,考虑一下购买我的另一本书——《Vim 101 Hacks》。
如果你在Linux/Unix环境上花很多时间,阅读该书会让你更好的掌握Vim。
如果你因为Vim编辑器不是很直观、使用起来枯燥无趣而决定推迟学习Vim——那么看了本书后,你将不再孤单。
《Vim 101 Hacks》是一本可下载并包含101个基于Vim最新特性示例的电子书,通过学习它,你将会更快更高效地使用Vim 编辑器。 这本电子书中提及的每种技巧都非常的明了而且易于理解。这些实用的技巧会向你展示如何使用Vim编辑器的某一种特性。
购买电子书 《Vim 101 hacks》
http://www.thegeekstuff.com/vim-101-hacks-ebook/
Linux 101 Hacks linux.101hacks.com
4 www.thegeekstuff.com
版权和声明
Copyright © 2009 - 2010 – Ramesh Natarajan. All rights reserved. 未经作者允许书中的任何一部分都不得重新出版,翻译,发布,或者以其他任何形式共享。
Linux 101 Hacks linux.101hacks.com
5 www.thegeekstuff.com
前言
又一本技巧的合集?是的!如果你刚完成初级系统管理课程或者想寻求一种能更有效的完成工作的方法,学习这本“Linux 101 Hacks”电子书是个不错的开始。这些实用的技巧写的很好,简练且易读。 真的不错-我会把它推荐给我的学生。 --Prof. Dr. Fritz Mehner, FH Südwestfalen, Germany
(包含bah-support vim 插件内的Vim 插件作者)
Linux 101 Hacks linux.101hacks.com
6 www.thegeekstuff.com
版本
版本号
日期
修订版
1.0
2009年2月12日
第一版
1.1
2010年1月13日
增加了第十三章“额外技巧”
在此处下载最新版本。
Linux 101 Hacks linux.101hacks.com
7 www.thegeekstuff.com
第一章:强大的CD命令技巧
cd 在Linux(在Unix中也是一样)中使用频率很高的一个命令。这一章中提到的6中cd命令的使用技巧,将会立刻提高你的工作效率,让你更加轻松地在命令行下切换目录。
技巧1:CDPATH : 设置cd命令的基目录
如果你经常使用CD命令进入某一个特定目录下的子目录,你可以将CDPATH设置为该目录,当使用cd进入其下的子目录时,则不需要键入该目录名,示例如下: [ramesh@dev-db ~]# pwd /home/ramesh [ramesh@dev-db ~]# cd mail -bash: cd: mail: No such file or directory [注: 以上试图进入当前目录下的mail子目录] [ramesh@dev-db ~]# export CDPATH=/etc [ramesh@dev-db ~]# cd mail /etc/mail [注: 以上为进入/etc下的mail目录,而不是当前目录下的mail目录] [ramesh@dev-db /etc/mail]# pwd /etc/mail 如果希望设置永久有效,可以将 export CDPATH=/etc 写入 ~/.bash_profile 。 与环境变量PATH相似的是,你也可以在CDPATH加入多个目录项,每个目录项以冒号分隔,示例如下:例如: export CDPATH=.:~:/etc:/var 这个技巧在如下情况中使用相当广泛: o Oracle的数据库管理员(DBAs)经常要在ORACLE的家目录($ORACLE_HOME)下工作,就可以将CDPATH变量设置为Oracle的目录。 o Linux/Unix系统管理员经常要在/etc目录下工作,就可以将CDPATH变量设置成/etc o 开发者要经常在工程目录下工作,如/home/projects,就可以将CDPATH变量设置为 /home/projects
o 普通用户经常要在他们的主目录下进行子目录之间的切换,就可以设置CDPATH变量
Linux 101 Hacks linux.101hacks.com
8 www.thegeekstuff.com
为~(这是Linux/Unix中主目录的简单写法)
技巧2:使用cd和alias命令快速返回上级目录
当你在一个多级的目录下希望返回上级目录时,经常需要使用cd ../../ ,至于需要多少个../,完全由你所需要返回的目录级数而定,如下例: # mkdir -p /tmp/very/long/directory/structure/that/is/too/deep # cd /tmp/very/long/directory/structure/that/is/too/deep # pwd /tmp/very/long/directory/structure/that/is/too/deep # cd ../../../../ # pwd /tmp/very/long/directory/structure 你可以使用以下四种方法来替代 cd ../../../../ ,以便能快速的向上返回四级目录。:
方法一: 用“..n”退回到高层目录
在下面的方法中,“..4”用来退回4级目录,“..3”退回3级目录,“..2”退回2级目录。将以下的几个别名写入到~/.bashrc(别的Linux/Unix可能是~/.bash_profile)中,之后重新登入即可。 alias ..="cd .." alias ..2="cd ../.." alias ..3="cd ../../.." alias ..4="cd ../../../.." alias ..5="cd ../../../../.." # cd /tmp/very/long/directory/structure/that/is/too/deep # ..4 [注: 使用..4 向上返回四级目录] # pwd /tmp/very/long/directory/structure/
方法二:仅使用 "." 返回上级目录
Linux 101 Hacks linux.101hacks.com
9 www.thegeekstuff.com
在以下的例子中,.....(5个点) 用于向上返回四级目录。使用5个点来代表返回四级目录其实很容易记忆,当你输入前来那个点时,意味着返回上级目录,然后每输入一个点,代表又向上返回一级目录。所以使用....(4个点)代表返回3级目录,2个点代表返回一级目录。为了使.....(5个点)可以正常使用,将以下别名加入./.bash_profile文件,并重新登入。 alias ..="cd .." alias ...="cd ../.." alias ....="cd ../../.." alias .....="cd ../../../.." alias ......="cd ../../../../.." # cd /tmp/very/long/directory/structure/that/is/too/deep # ..... [注:使用.....(5个点)意味着向上返回四级目录] # pwd /tmp/very/long/directory/structure/
方法三:用cd命令加上连续的”点”实现退回高层目录
在以下的例子中,使用cd .....(cd后接5个点)代表向上返回四级目录。当你输入前两个点,意味着你想返回上级目录,然后每输入一个点就意味着再向上返回一级目录,所以使用 5个点来向上返回4级目录是很容易记忆的。使用cd ....(cd后接4个点)向上返回3级目录,cd ...(cd后接3个点)向上返回2级目录。为了使cd .....(5个点)可以正常使用,将以下别名加入./.bash_profile文件,并重新登入即可。 alias cd..="cd .." alias cd...="cd ../.." alias cd....="cd ../../.." alias cd.....="cd ../../../.." alias cd......="cd ../../../../.." # cd /tmp/very/long/directory/structure/that/is/too/deep # cd..... [ 注: 用 cd.....退回四层目录] # pwd /tmp/very/long/directory/structure
方法四:用cd后跟数字退回高层目录(译者注:原著中为Method 5)
在下面的例子中,用“cd4”(cd后跟数字4)来退回4层目录。 alias cd1="cd .." alias cd2="cd ../.." alias cd3="cd ../../.."
Linux 101 Hacks linux.101hacks.com
10 www.thegeekstuff.com
alias cd4="cd ../../../.." alias cd5="cd ../../../../.."
技巧3:用一条语句执行―mkdir‖和―cd‖命令
有时候当你需要新建一个目录后,希望马上进入到这个目录中去(cd),你可以按照下面的方法去做。 # mkdir -p /tmp/subdir1/subdir2/subdir3 # cd /tmp/subdir1/subdir2/subdir3 # pwd /tmp/subdir1/subdir2/subdir3 如果将mkdir 和cd 操作在一个单独的命令中实现会不会很棒呢?试着将如下代码加入./.bash_profile 并重新登录。 $ vi .bash_profile function mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; } 好了,现在看一下吧,mkdir和cd已经可以在一个命令行中实现了。 # mkdircd /tmp/subdir1/subdir2/subdir3 [注: 该命令在创建目录后并自动切换到该目录下] # pwd /tmp/subdir1/subdir2/subdir3
技巧4:用―cd -‖在最近访问的两个目录之间切换
你可以用“cd -”在最近访问的两个目录之间进行切换,如下所示: # cd /tmp/very/long/directory/structure/that/is/too/deep # cd /tmp/subdir1/subdir2/subdir3 # cd - # pwd /tmp/very/long/directory/structure/that/is/too/deep
Linux 101 Hacks linux.101hacks.com
11 www.thegeekstuff.com
# cd - # pwd /tmp/subdir1/subdir2/subdir3 # cd - # pwd /tmp/very/long/directory/structure/that/is/too/deep
技巧5:用―dirs‖、―pushd‖、―popd‖来操作目录栈
你可以将目录压入目录栈,也可以稍后将该目录弹出。在随后的示例中,将会用到以下三个命令: * dirs:显示目录栈 * pushd:将目录压入目录栈 * popd:将目录弹出目录栈 dirs命令显示当前所在目录及目录栈中的内容。即使目录栈为空,dirs也会显示当前所在的目录,示例如下: # popd -bash: popd: directory stack empty # dirs ~ # pwd /home/ramesh 如何使用pushd和popd呢?让我们先创建一些临时的目录然后把他们压入目录堆栈中去。 # mkdir /tmp/dir1 # mkdir /tmp/dir2 # mkdir /tmp/dir3 # mkdir /tmp/dir4 # cd /tmp/dir1 # pushd .
Linux 101 Hacks linux.101hacks.com
12 www.thegeekstuff.com
# cd /tmp/dir2 # pushd . # cd /tmp/dir3 # pushd . # cd /tmp/dir4 # pushd . # dirs /tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1 [注:显示的第一个目录名总会是当前所在的目录,而不是显式压入堆栈里的内容] 此时,目录堆栈就包含以下内容: /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1 最后被压入的目录会在堆栈的顶端。当你执行“popd”,系统就会跳转到栈顶的目录中,并且从堆栈中把它清除掉。正如上面所展示的,最后压入堆栈的是/tmp/dir4,所以当进行一次popd时,就会跳转到/tmp/dir4目录下同时从堆栈中将它移除。如下所示: # popd # pwd /tmp/dir4 [注:执行完上popd命令之后,目录栈包括以下目录 /tmp/dir3 /tmp/dir2 /tmp/dir1] # popd # pwd /tmp/dir3 [注:执行完上popd命令之后,目录栈包括以下目录] /tmp/dir2 /tmp/dir1] # popd # pwd
Linux 101 Hacks linux.101hacks.com
13 www.thegeekstuff.com
/tmp/dir2 [注:执行完上popd命令之后,目录栈包括以下目录 /tmp/dir1] # popd # pwd /tmp/dir1 [注:执行完上popd命令之后,目录栈包括以下目录] # popd -bash: popd: directory stack empty
技巧6:用―shopt –s cdspell‖自动纠正―cd‖命令的目录名输入错误
使用"shopt -s cdspell"可以自动修正cd时拼写错误的目录名。如果你在输入时经常犯些错误,这个命令是很有用的。详见以下示例: # cd /etc/mall -bash: cd: /etc/mall: No such file or directory # shopt -s cdspell # cd /etc/mall # pwd /etc/mail [注: 当我错误的把mail敲成了mall,用这个命令mall就自动被换成了mail]
Linux 101 Hacks linux.101hacks.com
14 www.thegeekstuff.com
第二章:日期操作
技巧7:设置系统日期和时间
可以使用下列命令修改系统时间 # date {mmddhhmiyyyy.ss} mm——代表月份 dd——代表日期 hh——代表24小时制的小时 mi——代表分钟 yyyy——代表年 ss——代表秒 例如,将系统日期设置为 2008年01月31日,下午10:19:53 命令为: # date 013122192009.53 你也可以按照下面的办法来设置: # date 013122192009.53 # date +%Y%m%d -s "20090131" # date -s "01/31/2009 22:19:53" # date -s "31 JAN 2009 22:19:53" # date set="31 JAN 2009 22:19:53" 如果只设置时间: 命令: # date +%T -s "22:19:53" # date +%T%p -s "10:19:53PM"
技巧8:设置硬件日期和时间
在设置系统日期和时间之前,先要确定操作系统时间已经被设置恰当。方法见:技巧7。 设置硬件时间要依赖于操作系统时间,具体方法如下: # hwclock –systohc
Linux 101 Hacks linux.101hacks.com
15 www.thegeekstuff.com
# hwclock --systohc –-utc 不加任何参数使用hwclock,可以查看当前的硬件日期和时间。 # hwclock 查看clock文件,确认是否设置了UTC(译者注:协调世界时): #cat /etc/default/rcS UTC=yes 在其他一些版本的Linux(如RebHat)中可以这样查看: # cat /etc/sysconfig/clock ZONE="America/Los_Angeles" UTC=false ARC=false
技巧9:用特定格式显示当前时间
以下的方法可以用各种不同的格式来显示当前时间: $ date Thu Jan 1 08:19:23 PST 2009 $ date --date="now" Thu Jan 1 08:20:05 PST 2009 $ date --date="today" Thu Jan 1 08:20:12 PST 2009 $ date --date='1970-01-01 00:00:01 UTC +5 hours' +%s 18001 $ date '+Current Date: %m/%d/%y%nCurrent Time:%H:%M:%S' Current Date: 01/01/09 Current Time:08:21:41 $ date +"%d-%m-%Y" 01-01-2009 $ date +"%d/%m/%Y" 01/01/2009
Linux 101 Hacks linux.101hacks.com
16 www.thegeekstuff.com
$ date +"%A,%B %d %Y" Thursday,January 01 2009 以下是date命令的不同的格式选项,各选项所代表含义如下: o %D 日期(月/日/年) o %d 一个月中的第几天 (01..31) o %m 月份 (01..12) o %y 年份的后两位 (00..99) o %a 当前语言下星期的缩写 (Sun..Sat) o %A 当前语言下星期的全拼 (Sunday..Saturday) o %b 当前语言下月份的缩写 (Jan..Dec) o %B 当前语言下的月份的全称 (January..December) o %H 24小时制小时 (00..23) o %I 12小时制小时 (01..12) o %Y 年份(1970…)
技巧10:显示过去的日期和时间
如下方法可以用来显示过去的日期和时间: $ date --date='3 seconds ago' Thu Jan 1 08:27:00 PST 2009 $ date --date="1 day ago" Wed Dec 31 08:27:13 PST 2008 $ date --date="1 days ago" Wed Dec 31 08:27:18 PST 2008 $ date --date="1 month ago" Mon Dec 1 08:27:23 PST 2008 $ date --date="1 year ago" Tue Jan 1 08:27:28 PST 2008 $ date --date="yesterday" Wed Dec 31 08:27:34 PST 2008 $ date --date="10 months 2 day ago" Thu Feb 28 08:27:41 PST 2008
Linux 101 Hacks linux.101hacks.com
17 www.thegeekstuff.com
技巧11:显示未来的日期和时间
如下的方法可以用来展示未来的日期和时间: $ date Thu Jan 1 08:30:07 PST 2009 $ date --date='3 seconds' Thu Jan 1 08:30:12 PST 2009 $ date --date='4 hours' Thu Jan 1 12:30:17 PST 2009 $ date --date='tomorrow' Fri Jan 2 08:30:25 PST 2009 $ date --date="1 day" Fri Jan 2 08:30:31 PST 2009 $ date --date="1 days" Fri Jan 2 08:30:38 PST 2009 $ date --date="2 days" Sat Jan 3 08:30:43 PST 2009 $ date --date='1 month' Sun Feb 1 08:30:48 PST 2009 $ date --date='1 week' Thu Jan 8 08:30:53 PST 2009 $ date --date="2 months" Sun Mar 1 08:30:58 PST 2009 $ date --date="2 years" Sat Jan 1 08:31:03 PST 2011 $ date --date="next day" Fri Jan 2 08:31:10 PST 2009 $ date --date="-1 days ago" Fri Jan 2 08:31:15 PST 2009
Linux 101 Hacks linux.101hacks.com
18 www.thegeekstuff.com
$ date --date="this Wednesday" Wed Jan 7 00:00:00 PST 2009
Linux 101 Hacks linux.101hacks.com
19 www.thegeekstuff.com
第三章:SSH(Secure SHell)客户端命令
技巧12:查看SSH客户端版本
有的时候需要确认一下SSH客户端及其相应的版本号。使用ssh -V命令可以得到版本号。需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用OpenSSH: $ ssh -V OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003 下面的例子表明该系统正在使用SSH2: $ ssh -V ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-pc-linux-gnu
技巧13:用SSH登录到远程主机
当你第一次使用ssh登录远程主机时,会出现没有找到主机密钥的提示信息。输入"yes"后,系统会将远程主机的密钥加入到你的主目录下的 .ssh/hostkeys下,这样你就可以继续操作了。示例如下: localhost$ ssh -l jsmith remotehost.example.com Host key not found from database. Key fingerprint: xabie-dezbc-manud-bartd-satsy-limit-nexiu-jambl-title-jarde-tuxum You can get a public key‘s fingerprint by running % ssh-keygen -F publickey.pub on the keyfile. Are you sure you want to continue connecting (yes/no)? Yes Host key saved to /home/jsmith/.ssh2/hostkeys/key_22_remotehost.example.com.pub host key for remotehost.example.com, accepted by jsmith Mon May 26 2008 16:06:50 -0700
[email protected] password: remotehost.example.com$ 因为远程主机的密钥已经加入到ssh客户端的已知主机列表中,当你第二次登陆远程主机时,只需要你输入远程主机的登录密码即可。 localhost$ ssh -l jsmith remotehost.example.com
[email protected] password: remotehost.example.com$
Linux 101 Hacks linux.101hacks.com
20 www.thegeekstuff.com
由于各种原因,可能在你第一次登陆远程主机后,该主机的密钥发生改变,你将会看到一些警告信息。出现这种情况,可能有两个原因: o 系统管理员在远程主机上升级或者重新安装了SSH服务器 o 有人在进行一些恶意行为,等等。 在你输入“yes”之前呢,最佳的选择或许是联系你的系统管理员来分析为什么会出现主机验证码改变的信息,核对主机验证码是否正确。 localhost$ ssh -l jsmith remotehost.example.com @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the- middle attack)! It is also possible that the host key has just been changed. Please contact your system administrator. Add correct host key to ―/home/jsmith/.ssh2/hostkeys/key_22_remotehost.example.com.pub‖ to get rid of this message. Received server key‘s fingerprint: xabie-dezbc-manud-bartd-satsy-limit-nexiu-jambl-title-arde-tuxum You can get a public key‘s fingerprint by running % ssh-keygen -F publickey.pub on the keyfile. Agent forwarding is disabled to avoid attacks by corrupted servers. Are you sure you want to continue connecting (yes/no)? yes Do you want to change the host key on disk (yes/no)? yes Agent forwarding re-enabled. Host key saved to /home/jsmith/.ssh2/hostkeys/key_22_remotehost.example.com.pub host key for remotehost.example.com, accepted by jsmith Mon May 26 2008 16:17:31 -0700 jsmith @remotehost.example.com‘s password: remotehost$
技巧14:调试SSH客户端会话
当ssh连接出现问题时,我们需要通过查看调试信息来定位这些错误。一般来讲使用v选项(注意:是小写的v),即可查看调试信息。 没有SSH客户端调试信息的例子: localhost$ ssh -l jsmith remotehost.example.com
Linux 101 Hacks linux.101hacks.com
21 www.thegeekstuff.com
warning: Connecting to remotehost.example.com failed: No address associated to the name
包含ssh调试信息的例子:
locaclhost$ ssh -v -l jsmith remotehost.example.com debug: SshConfig/sshconfig.c:2838/ssh2_parse_config_ext: Metaconfig parsing stopped at line 3. debug: SshConfig/sshconfig.c:637/ssh_config_set_param_verbose: Setting variable ‗VerboseMode‘ to ‗FALSE‘. debug: SshConfig/sshconfig.c:3130/ssh_config_read_file_ext: Read 17 params from config file. debug: Ssh2/ssh2.c:1707/main: User config file not found, using defaults. (Looked for ‗/home/jsmith/.ssh2/ssh2_config‘) debug: Connecting to remotehost.example.com, port 22… (SOCKS not used) warning: Connecting to remotehost.example.com failed: No address associated to the name [译者注:很多命令中,v选项对应的英文是 verbose,也就是详细的信息的意思。] 当你使用ssh从本机登录到远程主机时,你可能希望切换到本地做一些操作,然后再重新回到远程主机。这个时候,你不需要中断ssh连接,只需要按照如下步骤操作即可:
技巧15:用SSH退出符切换SSH会话
这个技巧非常实用。尤其是远程登陆到一台主机A,然后从A登陆到B,如果希望在A上做一些操作,还得再开一个终端,很是麻烦。 当你使用ssh从本机登录到远程主机时,你可能希望切换到本地做一些操作,然后再重新回到远程主机。这个时候,你不需要中断ssh连接,只需要按照如下步骤操作即可: 当你已经登录到了远程主机时,你可能想要回到本地主机进行一些操作,然后又继续回到远程主机。在这种情况下,没有必要断开远程主机的会话,你可以用下面的办法来完成: 1.登入远程主机: localhost$ ssh -l jsmith remotehost 2.已连接远程主机: remotehost$ 3.要临时回到本地主机,输入退出符号:“~”与“Control-Z”组合。
Linux 101 Hacks linux.101hacks.com
22 www.thegeekstuff.com
当你输入“~”你不会立即在屏幕上看到,当你按下<Control-Z>并且按回车之后才一起显示。如下,在远程主机中以此输入“~<Control-Z>” remotehost$ ~^Z [1]+ Stopped ssh -l jsmith remotehost localhost$ 4.现在你已经退回到了本地主机,ssh远程客户端会话就在UNIX后台中运行,你可以向下面那样查看它: localhost$ jobs [1]+ Stopped ssh -l jsmith remotehost 5. 你可以将后台运行的ssh会话进程切换到前台,重新回到远程主机,而无需输入密码 localhost$ fg %1 ssh -l jsmith remotehost remotehost$
技巧16:用SSH退出字符会话,显示信息
要想取得一些关于当前会话有用的信息,可以按以下方式完成。不过这只能在SSH 2 客户端上使用。
登录到远程服务器 localhost$ ssh -l jsmith remotehost 如下所示,在远程服务器上,输入ssh退出字符~并输入s。这样会显示出很多有关当前ssh连接的有用信息 remotehost$ [注:当你在命令行上输入~s时,它是不可见的.] remote host: remotehost local host: localhost remote version: SSH-1.99-OpenSSH_3.9p1 local version: SSH-2.0-3.2.9.1 SSH Secure Shell (non-commercial) compressed bytes in: 1506 uncompressed bytes in: 1622 compressed bytes out: 4997 uncompressed bytes out: 5118
Linux 101 Hacks linux.101hacks.com
23 www.thegeekstuff.com
packets in: 15 packets out: 24 rekeys: 0 Algorithms: Chosen key exchange algorithm: diffie-hellman-group1-sha1 Chosen host key algorithm: ssh-dss Common host key algorithms: ssh-dss,ssh-rsa Algorithms client to server: Cipher: aes128-cbc MAC: hmac-sha1 Compression: zlib Algorithms server to client: Cipher: aes128-cbc MAC: hmac-sha1 Compression: zlib localhost$
了解更多关于SSH的信息
提醒一下,有关SSH公钥认证请参考openSSH和SSH2程
Linux 101 Hacks linux.101hacks.com
24 www.thegeekstuff.com
第四章:重要的linux命令
技巧17:grep命令
grep 命令是用来在文件中查找含有一些特定文本。 grep有许多参数,它是一个非常有用的命令 语法:grep [选项] pattern [文件名]
在一个文件中,如何查找所有可以匹配关键字的内容?
在下面这个例子中,grep在“/etc/password/” 文件下查找所有含有“John” 的行并全部显示出来 # grep John /etc/passwd jsmith:x:1082:1082:John Smith:/home/jsmith:/bin/bash jdoe:x:1083:1083:John Doe:/home/jdoe:/bin/bash 参数-v会显示出所有不包含匹配文本的内容。下面的例子中,显示了所有在“/etc/password”下不含有“John”的内容。 注:在“/etc/password”下有几行不包含“John”,只有第一行显示了 # grep -v John /etc/passwd jbourne:x:1084:1084:Jason Bourne:/home/jbourne:/bin/bash
在一个特定的文件中有多少行包含指定的匹配内容呢?
在下面这个例子中,显示了在“/etc/password/”下含有“John”的行的总数 # grep -c John /etc/passwd 2 用-cv也可以得到不含有“John”的行的总数 # grep -cv John /etc/passwd 39
如何在查找时忽略大小写
利用“-i”,搜索的时候会忽略大小写 # grep -i john /etc/passwd
Linux 101 Hacks linux.101hacks.com
25 www.thegeekstuff.com
jsmith:x:1082:1082:John Smith:/home/jsmith:/bin/bash jdoe:x:1083:1083:John Doe:/home/jdoe:/bin/bash
如何在所有的子目录下执行相应的查找?
可以利用“-r”来完成。在下面的例子中,在“/home/users/”的子目录下忽略大小写,查找“John”,这会以“文件名:匹配的内容”形式显示。也可以利用参数“-l”,只显示文件名。 # grep -ri john /home/users /home/users/subdir1/letter.txt:John, Thanks for your contribution. /home/users/name_list.txt:John Smith /home/users/name_list.txt:John Doe # grep -ril john /root /home/users/subdir1/letter.txt /home/users/name_list.txt
技巧18:find命令
find命令是一个在UNIX文件系统中查找文件的常用命令,可以进行很多条件查找。让我们来看一些find命令的实例。 语法: find 路径 约束条件
如何查找在文件名中含有指定关键字的文件?
下面这条命令查找在“/etc”目录下所有文件名中含有“mail”的文件。 # find /etc -name "*mail*"
如何查找文件大小超过指定值的文件?
下面这个命令会列出系统中所有大于100M的文件 # find / -type f -size +100M
如何查找在最近几天没有被修改过的文件?
下面这条命令会列出在当前目录下在最近60天没有被修改过文件 # find . -mtime +60
如何查找在最近几天被修改的文件?
Linux 101 Hacks linux.101hacks.com
26 www.thegeekstuff.com
下面这条命令会列出在当前目录下在最近2天被修改过文件 # find . –mtime -2
如何删除扩展名为.tar.gz并且大于100M的压缩文件?
当你不想意外删除文件时,那么当执行下列命令要小心点。最好的方法是利用“ls -l”去执行下列相同命令以确保当执行rm命令时,你知道什么文件会被删除。 # find / -type f -name *.tar.gz -size +100M -exec ls -l {} \; # find / -type f -name *.tar.gz -size +100M -exec rm -f {} \;
如何对最近几天没有被修改的文件进行存档?
下面的命令查找到在“/home/jsmith”目录下最近60天没有被修改的文件并且在“/tmp”下创建一个格式为“ddmmyyyy_archive.tar”的归档文件 # find /home/jsmith -type f -mtime +60 | xargs tar -cvf /tmp/`date '+%d%m%Y'_archive.tar` 提醒一下:你可以使用“midnight commander”上进行有关文件的一些操作,它是UNIX字符界面下一款非常强大的文件管理器。
技巧19:禁止标准输出和错误信息的输出
当我们调试shell脚本的时候,我们往往不希望看到标准输出和标准错误的信息。我们可以使用/dev/nulll来禁止标准错误的信息。
将标准输出重定向到/dev/null
当你调试shell脚本的时候不想看输出,只想看错误信息的时候,这个命令会非常有用。 # cat file.txt > /dev/null # ./shell-script.sh > /dev/null
用“2>/dev/null”禁止错误输出
当你只想看标准输出,而不想看错误信息的时候,这个命令会非常的有用。 # cat invalid-file-name.txt 2> /dev/null # ./shell-script.sh 2> /dev/null
Linux 101 Hacks linux.101hacks.com
27 www.thegeekstuff.com
技巧20:join命令
join命令可基于两个文件的共同项,把他们合并起来。 在下例中,我们有两个文件,分别是employee.txt和salary,他们拥有共同的项- employee-id。所以我们基于employee-id项,将两个文件合并起来。 $ cat employee.txt 100 Jason Smith 200 John Doe 300 Sanjay Gupta 400 Ashok Sharma $ cat bonus.txt 100 $5,000 200 $500 300 $3,000 400 $1,250 $ join employee.txt bonus.txt 100 Jason Smith $5,000 200 John Doe $500 300 Sanjay Gupta $3,000 400 Ashok Sharma $1,250
技巧21:改变字符的大小写
将一个文件内容全部转换成大写字母
$ cat employee.txt 100 Jason Smith 200 John Doe 300 Sanjay Gupta 400 Ashok Sharma $ tr a-z A-Z < employee.txt 100 JASON SMITH
Linux 101 Hacks linux.101hacks.com
28 www.thegeekstuff.com
200 JOHN DOE 300 SANJAY GUPTA 400 ASHOK SHARMA
将一个文件内容全部转换成小写字母
$ cat department.txt 100 FINANCE 200 MARKETING 300 PRODUCT DEVELOPMENT 400 SALES $ tr A-Z a-z < department.txt 100 finance 200 marketing 300 product development 400 sales
技巧22:xargs命令
xargs是一个非常强大的命令,可以取一个命令的输出作为另一个命令的参数。下面就是几个关于如何有效使用xargs命令的实例
1. 当你使用rm命令去删除很多的文件时,你可能会得到错误信息:“/bin/rm Argument list too long – Linux”。这时可以用xargs来避免这个问题 find ~ -name ‗*.log‘ -print0 | xargs -0 rm –f 获得/etc下所有以.conf结尾的文件。可以有多种方法获得如下结果。以下命令仅仅为了帮助大家理解如何使用xargs.find命令的输入结果一个接一个的传递给xargs,作为ls -l的参数。 # find /etc -name "*.conf" | xargs ls –l 当你想下载一些URL,这些URL都保存在一个文件里,你可以以如下的方式使用xargs命令 # cat url-list.txt | xargs wget –c 找出所有的.jpg格式的图片,并将其归档。 # find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz 将所有的jpg图片文件复制到外置的硬盘中
Linux 101 Hacks linux.101hacks.com
29 www.thegeekstuff.com
# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
技巧23:sort命令
sort命令可以对一个文件中的文本行进行排序。以下几个例子来演示如何使用sort命令,样例文本是雇员数据,格式如下: employee_name: employee_id: department_name. $ cat names.txt Emma Thomas:100:Marketing Alex Jason:200:Sales Madison Randy:300:Product Development Sanjay Gupta:400:Support Nisha Singh:500:Sales
以升序对文本排序
$ sort names.txt Alex Jason:200:Sales Emma Thomas:100:Marketing Madison Randy:300:Product Development Nisha Singh:500:Sales Sanjay Gupta:400:Support
以降序对文本排序
$ sort -r names.txt Sanjay Gupta:400:Support Nisha Singh:500:Sales Madison Randy:300:Product Development Emma Thomas:100:Marketing Alex Jason:200:Sales
对一个使用冒号分隔的文件的第二项进行排序(也就是employee_id)
$ sort -t: -k 2 names.txt Emma Thomas:100:Marketing
Linux 101 Hacks linux.101hacks.com
30 www.thegeekstuff.com
Alex Jason:200:Sales Madison Randy:300:Product Development Sanjay Gupta:400:Support Nisha Singh:500:Sales
对使用tab分隔的第三项进行排序(department_id),并去掉重复项
$ sort -t: -u -k 3 names.txt Emma Thomas:100:Marketing Madison Randy:300:Product Development Alex Jason:200:Sales Sanjay Gupta:400:Support
对passwd文件的第三项进行排序(userid)
$ sort -t: -k 3n /etc/passwd | more root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
基于ip地址对/etc/hosts文件排序
$ sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n /etc/hosts 127.0.0.1 localhost.localdomain localhost 192.168.100.101 dev-db.thegeekstuff.com dev-db 192.168.100.102 prod-db.thegeekstuff.com prod-db 192.168.101.20 dev-web.thegeekstuff.com dev-web 192.168.101.21 prod-web.thegeekstuff.com prod-web
与其它命令组合在一起使用
ps –ef | sort : 对进程列表进行排序 ls -al | sort +4n : 使用升序对ls -al的输出以文件大小进行排序(第5项) ls -al | sort +4nr : 使用降序对ls -al的输出以文件大小进行排序(第5项)
Linux 101 Hacks linux.101hacks.com
31 www.thegeekstuff.com
技巧24:uniq命令
uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。以下是一些常见的例子。 当你有一个包含相同条目的雇员(employee)的文件,你可以以如下方式来删除相同的条目 $ sort namesd.txt | uniq $ sort –u namesd.txt 如果你想知道有多少行是相同的,可以像下面这个做。以下例子中的第一列显示该行的重复数量。在本例中,以Alex和Emma开头的行,在文件中有两个重复行。 $ sort namesd.txt | uniq –c 2 Alex Jason:200:Sales 2 Emma Thomas:100:Marketing 1 Madison Randy:300:Product Development 1 Nisha Singh:500:Sales 1 Sanjay Gupta:400:Support 3. 以下命令仅仅列出了相同的条目 $ sort namesd.txt | uniq –cd 2 Alex Jason:200:Sales 2 Emma Thomas:100:Marketing
技巧25:cut命令
cut命令可以用来显示一个文本文件中特定的列或者其它命令的输出。 下面就是一些例子
显示一个以冒号分隔的文件中的第一列(employee_name)
$ cut -d: -f 1 names.txt Emma Thomas Alex Jason Madison Randy Sanjay Gupta
Linux 101 Hacks linux.101hacks.com
32 www.thegeekstuff.com
Nisha Singh
显示一个以冒号分隔的文件中的第一列和第三列
$ cut -d: -f 1,3 names.txt Emma Thomas:Marketing Alex Jason:Sales Madison Randy:Product Development Sanjay Gupta:Support Nisha Singh:Sales
显示文件中每行的前八个字符
$ cut -c 1-8 names.txt Emma Tho Alex Jas Madison Sanjay G Nisha Si
将cut命令与其它命令组合起来的例子
o Cut –d:-f1 /etc/passwd #显示unix系统所有用户的姓名。 o Free | tr –s ‘’| sed '/^Mem/!d' | cut -d" " -f2 #显示系统中的所有记忆文件
技巧26:stat命令
stat命令那个可以用来查看文件或者文件系统的状态和属性。
显示一个文件或目录的属性
$ stat /etc/my.cnf File: `/etc/my.cnf' Size: 346 Blocks: 16 IO Block: 4096 regular file Device: 801h/2049d Inode: 279856 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-01-01 02:58:30.000000000 -0800 Modify: 2006-06-01 20:42:27.000000000 -0700 Change: 2007-02-02 14:17:27.000000000 -0800
Linux 101 Hacks linux.101hacks.com
33 www.thegeekstuff.com
$ stat /home/ramesh File: `/home/ramesh' Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 803h/2051d Inode: 5521409 Links: 7 Access: (0755/drwxr-xr-x) Uid: ( 401/ramesh) Gid: ( 401/ramesh) Access: 2009-01-01 12:17:42.000000000 -0800 Modify: 2009-01-01 12:07:33.000000000 -0800 Change: 2009-01-09 12:07:33.000000000 -0800
使用 -f 参数查看系统文件得某些属性
$ stat -f / File: "/" ID: 0 Namelen: 255 Type: ext2/ext3 Blocks: Total: 2579457 Free: 2008027 Available: 1876998 Size: 4096 Inodes: Total: 1310720 Free: 1215892
技巧27:diff命令
diff命令可以用来比较两个文件并显示差异。但是输出结果不是很容易阅读。 语法:diff [参数] 文件1 文件2
与旧的文件比较时,新文件做了哪些修改?
执行diff命令时使用 w选项,可以忽略空格。 一般的diff命令的输出是如下形式 o---上面的内容,表明了第一个文件(也就是name_list.txt)中的发生变化 o---下面的内容,表明了第二个文件(也就是name_list_new.txt)听发生的变化。 有关第一个文件中的内容以<开始,有关第二个文件的内容以>开始 # diff -w name_list.txt name_list_new.txt 2c2,3 < John Doe ---
Linux 101 Hacks linux.101hacks.com
34 www.thegeekstuff.com
> John M Doe > Jason Bourne
技巧28:显示用户总的连接时间
ac可以显示用户登录主机的时间信息。
目前登录用户的连接时间
使用 d 选项,可以将输出的时间按天来显示。在本例中,今天我已经登录系统超过6个小时了,在12月1日,我登录系统的时间大约是1个小时。 $ ac –d Dec 1 total 1.08 Dec 2 total 0.99 Dec 3 total 3.39 Dec 4 total 4.50 Today total 6.10
所有用户的连接时间
就像下面所显示的,可以用“-p” 显示所有用户的连接时间。注意这显示了每一个用户的总的连接时间。 $ ac -p john 3.64 madison 0.06 sanjay 88.17 nisha 105.92 ramesh 111.42 total 309.21
显示指定用户的连接时间
$ ac -d sanjay Jul 2 total 12.85 Aug 25 total 5.05 Sep 3 total 1.03 Sep 4 total 5.37
Linux 101 Hacks linux.101hacks.com
35 www.thegeekstuff.com
Dec 24 total 8.15 Dec 29 total 1.42 Today total 2.95
Linux 101 Hacks linux.101hacks.com
36 www.thegeekstuff.com
第五章:PS1,PS2,PS3和PROMPT_COMMAND
技巧29:PS1——默认提示符
如下所示,可以通过修改Linux下的默认提示符,使其更加实用。在下面的例子中,默认的PS1的值是“\s-\v\$”,显示出了shell的名称的版本。我们通过修改,可以使其显示用户名、主机名和当前工作目录。 -bash-3.2$ export PS1="\u@\h \w> " ramesh@dev-db ~> cd /etc/mail ramesh@dev-db /etc/mail> [注: 提示符修改为 "username@hostname current-dir>的形式] 本例中PS1使用的一些代码如下: o \u -- 用户名 o \h -- 主机名 o \w -- 当前目录的完整路径。请注意当你在主目录下的时候,如上面所示只会显示~ 注意,在PS1值之后有一个空格。从个人角度来讲,使用这个空格可以增加一定的可读性。 将export PS1=”\u@\h \w>" 添加到.bash_profile 或者 .bashrc中,则可以保证其永久有效。 ramesh@dev-db ~> vi ~/.bash_profile ramesh@dev-db ~> vi ~/.bashrc [注: 将命令添加到以上任何一个即可] 有关”PS1”的详细用法可以参见下一章
技巧30:PS2——再谈提示符
一个非常长的命令可以通过在末尾加“\”使其分行显示。多行命令的默认提示符是“>”。 我们可以通过修改PS2 ,将提示符修改为"continue->" 。 ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \ > --key_buffer_size=512M --sort_buffer_size=512M \ > --read_buffer_size=4M --write_buffer_size=4M \ > /var/lib/mysql/bugs/*.MYI
Linux 101 Hacks linux.101hacks.com
37 www.thegeekstuff.com
[注: 这里使用 ">" 作为默认提示符] ramesh@dev-db ~> export PS2="continue-> " ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \ continue-> --key_buffer_size=512M --sort_buffer_size=512M \ continue-> --read_buffer_size=4M --write_buffer_size=4M \ continue-> /var/lib/mysql/bugs/*.MYI [注: 与上面类似,用 "continue-> " 作提示符] 当用“\”使长命令分行显示,我发现非常易读。当然我也见过有的人不喜欢分行显示命令
技巧31:PS3——Shell脚本中使用select时的提示符
你可以像下面示范的那样,用环境变量PS3定制shell脚本的select提示:
不使用PS3的脚本输出:
ramesh@dev-db ~> cat ps3.sh select i in mon tue wed exit do case $i in mon) echo "Monday";; tue) echo "Tuesday";; wed) echo "Wednesday";; exit) exit;; esac done ramesh@dev-db ~> ./ps3.sh 1) mon 2) tue 3) wed 4) exit #? 1 Monday #? 4 [注: 缺省的提示符是 #?]
使用PS3的脚本输出:
Linux 101 Hacks linux.101hacks.com
38 www.thegeekstuff.com
ramesh@dev-db ~> cat ps3.sh PS3="Select a day (1-4): " select i in mon tue wed exit do case $i in mon) echo "Monday";; tue) echo "Tuesday";; wed) echo "Wednesday";; exit) exit;; esac done ramesh@dev-db ~> ./ps3.sh 1) mon 2) tue 3) wed 4) exit Select a day (1-4): 1 Monday Select a day (1-4): 4 [注: 设置了PS3变量后,命令提示符已经成为 "Select a day (1-4):"]
技巧32:PS4——PS4-“set -x"用来修改跟踪输出的前缀
如果你像下面那样在调试模式下的脚本中,PS4环境变量可以定制提示信息:
没有设置PS4时的shell脚本输出:
ramesh@dev-db ~> cat ps4.sh set –x echo "PS4 demo script" ls -l /etc/ | wc –l du -sh ~ ramesh@dev-db ~> ./ps4.sh ++ echo 'PS4 demo script' PS4 demo script ++ ls -l /etc/
Linux 101 Hacks linux.101hacks.com
39 www.thegeekstuff.com
++ wc –l 243 ++ du -sh /home/ramesh 48K /home/ramesh [注: 当使用sex -x跟踪输出时的提示符为 ++]
设置PS4后的脚本输出:
PS4在ps.sh中定义了下面两个变量 o $0 显示当前的脚本名 o $LINENO 显示的当前的行号 ramesh@dev-db ~> cat ps4.sh export PS4='$0.$LINENO+ ' set -x echo "PS4 demo script" ls -l /etc/ | wc -l du -sh ~ ramesh@dev-db ~> ./ps4.sh ../ps4.sh.3+ echo 'PS4 demo script' PS4 demo script ../ps4.sh.4+ ls -l /etc/ ../ps4.sh.4+ wc -l 243 ../ps4.sh.5+ du -sh /home/ramesh 48K /home/ramesh [注: 使用PS4后使 "{script-name}.{line-number}+" 成为set –x的命令提示符]
技巧33:PROMPT_COMMAND环境变量
Bash在显示PS1之前先执行PROMPT_COMMAND定义的内容: ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S" 22:08:42 ramesh@dev-db ~> [注: PROMPT_COMMAND和PS1在不同行显示]
Linux 101 Hacks linux.101hacks.com
40 www.thegeekstuff.com
79B如果你想让PROMPT_COMMAND和PS1在同一行显示,用 -n 参数即可: ramesh@dev-db ~> export PROMPT_COMMAND="echo -n [$(date+%k:%m:%S)]" [22:08:51]ramesh@dev-db ~> [注: PROMPT_COMMAND和PS1在同一行显示]
第六章:用功能强大的彩色终端快速使用PS1
技巧34:在提示符中显示用户名,主机名,当前目录
在PS1的例子中包含了以下三条信息: o /u ——用户名 o /h ——主机名 o /W ——当前目录名 -bash-3.2$ export PS1="\u@\h \W> " ramesh@dev-db ~> cd /etc/mail ramesh@dev-db mail>
技巧35:在提示符里显示当前时间
81B在PS1定义的环境变量下可以以$(LINUX COMMAND)的方式执行LINUX命令,在下面的例子中用$(date)在提示中显示当前时间: ramesh@dev-db ~> export PS1="\u@\h [\$(date+%k:%m:%S)]> " ramesh@dev-db [11:09:56]> 你还可以用\t使时间以hh:mm:ss格式显示: ramesh@dev-db ~> export PS1="\u@\h [\t]> " ramesh@dev-db [12:42:55] 83B你还可以用\@使当前时间以12小时制显示: ramesh@dev-db ~> export PS1="[\@] \u@\h> " [04:12 PM] ramesh@dev-db>
Linux 101 Hacks linux.101hacks.com
41 www.thegeekstuff.com
技巧36:任意命令的输出作为提示符
你可以在提示里显示任意LINUX命令的输出,下列命令显示了三项信息,以"|" 做分隔: o \! 历史命令的个数 o \h 主机名 o $kernel_version 用name -r 显示内核信息 o \$! 最后一条命令的状态 ramesh@dev-db ~> kernel_version=$(uname -r) ramesh@dev-db ~> export PS1="\!|\h|$kernel_version|\$?> " 473|dev-db|2.6.25-14.fc9.i686|0>
技巧37:改变提示符的前景颜色
用蓝色显示提示符中的用户名,主机名,和当前目录信息: $ export PS1="\e[0;34m\u@\h \w> \e[m " [注: 亮蓝色] $ export PS1="\e[1;34m\u@\h \w> \e[m " [注: 暗绿色] o \e[ ——表示颜色的提示的起始位置 o x;ym ——表示颜色的代码。颜色的代码在下面有说明 o \e[m ——表示代颜色的提示的结束位置 颜色代码: 黑 0:30 蓝 0;34 绿 0;32 青 0;36 红 0;31 紫 0;35 棕 0;33 [注: 用1代替0,可以使之变成黑体]
将下面的内容写入~/.bashrc或~/.bash_profile可以使其永久生效
Linux 101 Hacks linux.101hacks.com
42 www.thegeekstuff.com
$ vi ~/.bash_profile STARTCOLOR='\e[0;34m'; ENDCOLOR="\e[0m" export PS1="$STARTCOLOR\u@\h \w> $ENDCOLOR"
技巧38:改变提示符的背景色
在PS1变量用“/e{code}m”语句改变提示符的背景色: $ export PS1="\e[47m\u@\h \w> \e[m " [注: 显示亮灰背景] 同时改变前景色和背景色。 $ export PS1="\e[0;34m\e[47m\u@\h \w> \e[m " [注: 显示亮蓝突出亮灰背景] 87B在~/.bashrc或~/.bash_profile中添加如下语句使上面的关于前景色和和背景色的设置保存下来。 $ vi ~/.bash_profile STARTFGCOLOR='\e[0;34m'; STARTBGCOLOR="\e[47m" ENDCOLOR="\e[0m" export PS1="$STARTFGCOLOR$STARTBGCOLOR\u@\h \w> $ENDCOLOR" 尝试下下面的背景色,挑选一个你喜欢的: o \e[40m o \e[41m o \e[42m o \e[43m o \e[44m o \e[45m o \e[46m o \e[47m
技巧39:在提示符中显示多种颜色
在~/bashrc中加入下面的函数就可以在提示符中显示多种颜色。
Linux 101 Hacks linux.101hacks.com
43 www.thegeekstuff.com
function prompt { local BLUE="\[\033[0;34m\]" local DARK_BLUE="\[\033[1;34m\]‖ local RED=‖\[\033[0;31m\]‖ local DARK_RED=‖\[\033[1;31m\]‖ local NO_COLOR=‖\[\033[0m\]‖ case $TERM in xterm*|rxvt*) TITLEBAR=‘\[\033]0;\u@\h:\w\007\]‘ ;; *) TITLEBAR=‖" ;; esac PS1=‖\u@\h [\t]> ‖ PS1=‖${TITLEBAR}\ $BLUE\u@\h $RED[\t]>$NO_COLOR ‖ PS2=‘continue-> ‗ PS4=‘$0.$LINENO+ ‗ } 你可以重新登录或通过“source”命令就可以让上述函数生效。 $. ./.bash_profile $ prompt ramesh@dev-db [13:02:13]>
技巧40:用tput改变提示符颜色
你可以在PS1中使用“tput”改变提示符颜色 $ export PS1="\[$(tput bold)$(tput setb 4)$(tput setaf 7)\]\u@\h:\w $ \[$(tput sgr0)\]― tput设置颜色的方法: o tput setab [1-7] - 通过ANSI转义设置背景色 o tput setb [1-7] - 设置背景色 o tput setaf [1-7] - 通过ANSI转义符设置前景色 o tput setf [1-7] - 设置前景颜色 tput设置文本的方法: o tput bold - 设置粗体
Linux 101 Hacks linux.101hacks.com
44 www.thegeekstuff.com
o tput dim - 打开半光亮模式 o tput smul - 开始下划线 o tput rmul - 退出下划线模式 o tput rev - 打开反转模式 o tput smso - 进入突出显示模式 o tput rmso - 退出突出显示模式 o tput sgr0 - 关闭所有属性 tput的颜色码: o 0 – 黑 o 1 – 红 o 2 – 绿 o 3 – 黄 o 4 – 蓝 o 5 – 洋红 o 6 – 青 o 7 - 白
技巧41:使用已有的PS1变量创建自己的提示符
使用下面的变量定制符合自己口味的提示符: o \a ASCII响铃字符 o \d 以―星期 月 日‖的格式显示日期 (例如,―Tue May 26‖) o \D{format} - 格式传给strftime(3),返回的结果的传入到提示字符串中,空的格式会被本地指定的时间取代,需要括号。 o \e ASCII转义字符 o \h 将主机名作为提示符的第一部分 o \H 主机名 o \j 当前shell管理的作业数 o \l shell终端名称 o \n 换行 o \r 回车 o \s shell名,$0的基础名(最后一个斜线的部分) o \t 以24-hour HH:MM:SS 格式显示当前时间 o \T 以12-hour HH:MM:SS 格式显示当前时间 o \@ 以12-hour am/pm格式显示当前时间 o \A 以24-hour HH:MM 格式格式显示当前时间 o \u 当前用户的用户名 o \v bash的版本号(例如 2.00) o \V bash发行版,版本号+补丁号(例如 2.00.0) o \w 当前工作目录,当工作目录是$HOME时,用波浪号表示 o \W 当前工作目录全路径,当工作目录是$HOME时,用波浪号表示 o \! 命令历史序号
Linux 101 Hacks linux.101hacks.com
45 www.thegeekstuff.com
o \# 当前命令的命令号 o \$ 如果有效的用户ID是0,这个值是#,否则为$ o \nnn 字符相应的八进制数 o \\ 反斜杠 o \[ 非输出字符的开始标记,可以嵌入到提示的终端控制序列中 o \] 非输出字符的结束标记
技巧42:通过PS1调用bash shell函数
你可以像下面那样在PS1中调用一个bash shell函数: ramesh@dev-db ~> function httpdcount { > ps aux | grep httpd | grep -v grep | wc -l > } ramesh@dev-db ~> export PS1="\u@\h [`httpdcount`]> " ramesh@dev-db [12]> [注: 显示当前运行的httpd 进程的总数] 为使其永久生效,可以将其加入./bash_profile 和 ./bashrc中 $ vi .bash_profile function httpdcount { ps aux | grep httpd | grep -v grep | wc -l } export PS1='\u@\h [`httpdcount`]> '
技巧43:通过PS1中调用shell脚本
你可以在PS1中使用脚本。本例中在PS1中调用~/bin/totalfilesize.sh 脚本 ,该脚本可以计算当前目录下的所有文件大小的总和。 ramesh@dev-db ~> cat ~/bin/totalfilesize.sh for filesize in $(ls -l . | grep "^-" | awk '{print $5}') do let totalsize=$totalsize+$filesize done echo -n "$totalsize" ramesh@dev-db ~> export PATH=$PATH:~/bin ramesh@dev-db ~> export PS1="\u@\h [\$(totalfilesize.sh) bytes]> " ramesh@dev-db [534 bytes]> cd /etc/mail ramesh@dev-db [167997 bytes]>
Linux 101 Hacks linux.101hacks.com
46 www.thegeekstuff.com
[注: 通过PS1调用totalfilesize.sh显示当前目录所有文件的总和]
Linux 101 Hacks linux.101hacks.com
47 www.thegeekstuff.com
第七章:归档和压缩
技巧 44:zip命令基础
怎样用zip压缩多个文件呢?
语法: zip {.zip file-name} {file-names} # zip var-log-files.zip /var/log/* adding: var/log/acpid (deflated 81%) adding: var/log/anaconda.log (deflated 79%) adding: var/log/anaconda.syslog (deflated 73%) adding: var/log/anaconda.xlog (deflated 82%) adding: var/log/audit/ (stored 0%) adding: var/log/boot.log (stored 0%) adding: var/log/boot.log.1 (deflated 40%) adding: var/log/boot.log.2 (deflated 42%) adding: var/log/boot.log.3 (deflated 40%) adding: var/log/boot.log.4 (deflated 40%)
如何递归地压缩一个目录及目录下的文件?
# zip -r var-log-dir.zip /var/log/ updating: var/log/ (stored 0%) adding: var/log/wtmp (deflated 78%) adding: var/log/scrollkeeper.log (deflated 94%) adding: var/log/rpmpkgs.3 (deflated 68%) adding: var/log/spooler (stored 0%) adding