[SHELL进阶] (转)最牛B的 Linux Shell 命令 (二)


1.用你最喜欢的编辑器来敲命令

command <CTRL-x CTRL-e>

在已经敲完的命令后按 <CTRL-x CTRL-e> ,会打开一个你指定的编辑器(比如vim,通过环境变量$EDITOR指定),里面就是你刚输入的命令,然后爱怎么编辑就怎么编辑吧,特别是那些参数异常复杂的程序,比如mencoder/ffmpeg,一个命令动辄3、4行的,要修改其中的参数,这个方法最合适不过了,保存退出后自动执行这个程序。

实际上这是readline库的功能,在默认情况下,bash使用的是emacs模式的命令行操作方式, <CTRL-x CTRL-e>是调用这个功能的一个绑定。如果你习惯使用vi模式,按 <ESC v> 可以实现同样功能。

如果你喜欢别的编辑器,可以在~/.bashrc里面放上比如export EDITOR=nano的命令。

另外一个修改命令的方法是使用fc命令(Fix Command),在编辑器里面打开上一句命令。我们的第一辑连载提过一个^foo^bar^命令可以用fc来实现:fc -s foo=bar。

2.清空或创建一个文件

> file.txt

>在shell里面是标准输出重定向符,即把(前部个命令的)命令行输出转往一个文件内,但这里没有"前部命令",输出为空,于是就覆盖(或创建)成一个空文件了。

有些脚本的写法是:>file.txt,因为:是bash默认存在的空函数。

单纯创建文件也可以用$touch file.txt,touch本来是用作修改文件的时间戳,但如果文件不存在,就自动创建了。

3.用SSH创建端口转发通道

ssh -N -L2001:remotehost:80 [email protected]

这个命令在本机打开了2001端口,对本机2001端口的请求通过somemachine作为跳板,转到remotehost的80端口上。

实现效果跟术语反向代理是相似的,实际上就是端口转发,注意上面的描述涉及了3台主机,但当然somemachine可以变成localhost。

这个命令比较抽象,但有时候是很有用的,比如因为众所周知的原因国内的IP的80端口无法使用,又或者公司的防火墙只给外网开了ssh端口,需要访问内部服务器一个web应用,以及需要访问某些限定了来源IP的服务,就可以用上这个方法了。

举一个具体例子,运行:

ssh -f -N -L 0.0.0.0:443:twitter.com:443 shell.cjb.net

ssh -f -N -L 0.0.0.0:80:twitter.com:80 shell.cjb.net

然后在/etc/hosts里面添加127.0.0.1 twitter.com,好吧剩下的你懂的。

当然通常做这个功能的反向代理,应该要用squid、nginx之类,ssh就算是轻量级的尝试吧!

4.重置终端

reset

如果你试过不小心cat了某个二进制文件,很可能整个终端就傻掉了,可能不会换行,没法回显,大堆乱码之类的,这时候敲入reset回车,不管命令有没有显示,就能回复正常了。

实际上reset命令只是输出了一些特殊字符,我们看BusyBox里面最简单的reset程序的实现:

printf("\033c\033(K\033[J\033[0m\033[?25h");

输出的这些字符对Shell是有特殊意义的:

\033c: "ESC c" - 发送重置命令;

\033(K: "ESC ( K" - 重载终端的字符映射;

\033[J: "ESC [ J" - 清空终端内容;

\033[0m: "ESC [ 0 m" - 初始化字符显示属性;

\033[?25h: "ESC [ ? 25 h" - 让光标可见;

其中字符显示属性经常用来设定打印字符的颜色等,可参考这个博文

5.在午夜的时候执行某命令

echo cmd | at midnight

说的就是at这个组件,通常跟cron相提并论,不过at主要用于定时一次性任务,而cron定时周期性任务。

at的参数比较人性化,跟英语语法一样,可以tomorrow, next week之类的,详细的查看手册man at。

6.远程传送麦克风语音

dd if=/dev/dsp | ssh [email protected] dd of=/dev/dsp

没错就是实现一个喊话器的功能。

/dev/dsp是Linux下声卡的文件映射(Digital Signal Proccessor),从其中读数据就是录音,往里面写数据就是播放,相当简单!

dd是常用的数据拷贝程序,如果不同时指定if、of,就直接使用stdin/stdout来传输。

如果你没有远程主机,可以试试这样:

dd if=/dev/dsp of=/dev/dsp

直接回放麦克风的声音,只是有一点延时。

但是如果有别的程序正在使用声卡,这个方法就不凑效了,因为一般的声卡都不允许多个音频流同时处理,可以借用alsa组件的工具,arecord跟aplay:

arecord | ssh [email protected] aplay

本地回放就是:

arecord | aplay

如果你想吓吓别人:

cat /dev/urandom | ssh [email protected] aplay

7.映射一个内存目录

mount -t tmpfs -o size=1024m tmpfs /mnt/ram

这个命令开了一块1G内存来当目录用。不过放心,如果里面没文件,是不会占用内存的,用多少占多少。

不过一般来说没必要手动挂载,因为多数发行版都会在fstab内预留了一个内存目录,挂载在/dev/shm,直接使用即可;

最常见的用途是用内存空间来放Firefox的配置,可以让慢吞吞的FF快很多,参见Shellex的博文:用tmpfs让Firefox在内存中飞驰,以及后来的改进:用tmpfs让Firefox在内存中飞驰II,其中提到的脚本来自speeding up firefox with tmpfs and automatic rsync

那个破烂LinuxQQ也可以用这个方法,减少因为大量磁盘IO导致的问题。

8.用DIFF对比远程文件跟本地文件

ssh [email protected] cat /path/to/remotefile | diff /path/to/localfile -

diff通常的用法是从参数读入两个文件,而命令里面的-则是指从stdin读入了。

善用ssh可以让web开发减少很多繁琐,还有比如sshfs,可以从编辑-上传-编辑-上传的人工循环里面解脱出来。

9.查看系统中占用端口的进程

netstat -tulnp

Netstat是很常用的用来查看Linux网络系统的工具之一,这个参数可以背下来:

-t: 显示TCP链接信息

-u: 显示UDP链接信息

-l: 显示监听状态的端口

-n: 直接显示ip,不做名称转换

-p: 显示相应的进程PID以及名称(要root权限)

如果要查看关于sockets更详细占用信息等,可以使用lsof工具。

时间: 2024-10-11 19:01:13

[SHELL进阶] (转)最牛B的 Linux Shell 命令 (二)的相关文章

Linux常用命令二之文件查找命令

本文对Linux常用命令做一个总结,方便日后查阅. (1) which命令 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下 面的一些命令来搜索: ? ? ? ?which??查看可执行文件的位置 ? ? ? ?whereis?查看文件的位置 ? ? ? ?locate???配合数据库查看文件位置 ? ? ? ?find???实际搜寻硬盘查询文件名称 which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一 个搜索结果.也就是说,使用which命

Linux系统管理命令&lt;二&gt;

24.pstree(process status tree) 功能说明:以树状图显示程序. 语 法:pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>] 补充说明:pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系.如果不指定程序识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序.若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用户的所有程序. 参 数: -a 

Linux常用命令(二) - cd

Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的.所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1. 命令格式: cd [目录名] 2. 命令功能: 切换当前目录至dirName 3. 常用范例 例1 进入系统根目录 命令:cd / 例2 返回上一层目录 命令:cd .. 或者 cd .. // 例3 进入当前用户的主目录(root目录) 命令:cd 或者 cd~ 例4  跳转到指定目录 命令: cd

Linux常用命令(二十八) - du

Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能: 显示每个文件和目录的磁盘使用空间. 3.命令参数: -a或-all  显示目录中个别文件的大小. -b或-bytes  显示目录或文件大小时,以byte为单位. -c或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和. -k或--kilobytes  以KB(10

[SHELL进阶] (转)最牛B的 Linux Shell 命令 (四)

1.查看ASCII码表 man 7 ascii 很多人初学编程都会接触到ascii码的概念,有时候为了查某个符号的ascii值,可能还得翻箱倒柜找出当年的课本?Linux Manpage里面其实包含了很多类似的实用资料,上述命令就能很详细的方式解释ascii编码,当然这里还有在线版. man命令的第二个参数是区域码,用来区分索引词的范围,比如printf,在C标准库里面的printf跟bash当中的printf是不同的,前者的查询是man 3 printf,后者是man 1 printf.如果这

[SHELL进阶] (转)最牛B的 Linux Shell 命令 (三)

1. 更友好的显示当前挂载的文件系统 mount | column -t 这条命令适用于任何文件系统,column 用于把输出结果进行列表格式化操作,这里最主要的目的是让大家熟悉一下 columnt 的用法. 下面是单单使用 mount 命令的结果: $ mount /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)

Linux常用命令(二十三)

Linux中用户和用户组 1.用户:使用操作系统的人 2.用户组:具有相同系统权限的一组用户 (1)/etc/group 存储当前系统中所有用户组信息 - Group :          x           : 123   : abc,def,xyz - 组名称 :组密码占位符:组编号:组中用户名列表 (2)/etc/gshadow 存储当前系统中用户组的密码信息 - Group :    *     :               :abc,def,xyz - 组名称:组密码:组管理者:

Linux常用命令(二)

1.     删除空目录:rmdir [目录名]      remove empty directories 2.     删除文件命令或目录:rm     remove rm   -rf [文件或目录] 选项:-r      删除目录 -f     强制 6.复制命令:cp   copy cp  [选项]  [原文件或目录] [目标目录] 选项 : l  -r      复制目录 l  -p       连带文件属性复制 l  -d       若源文件是链接文件,则复制链接属性 l  -a 

Linux Linux常用命令二

whoami 我是谁命令 --该命令用户查看当前系统当前账号的用户名 --由于系统管理员通常需要使用多种身份登录系统,李儒通常使用普通用户登录系统,然后再以su命令切换到root身份对系统进行灌篮.这 时候可以使用whoami来查看当前用户的身份 --whoami who 查看当前所有登录系统的用户信息 --该命令用户查看查看当前所有登录系统的用户信息 --who [参数] --常用参数及含义 "-m" 只显示运行who命令的用户名,登录终端和登录时间----该参数和whoami等价