最牛B的Linux Shell命令 系列连载:(二)

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

1
command <CTRL-x CTRL-e>

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

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

若是你喜欢别的编辑器,能够在~/.bashrc里面放上好比export EDITOR=nano的命令。linux

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

2.清空或建立一个文件

1
> file.txt

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

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

单纯建立文件也能够用$touch file.txt,touch原本是用做修改文件的时间戳,但若是文件不存在,就自动建立了。shell

3.用ssh建立端口转发通道

1
ssh -N -L2001:remotehost:80 user@somemachine

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

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

这个命令比较抽象,但有时候是颇有用的,好比由于众所周知的缘由国内的IP的80端口没法使用,又或者公司的防火墙只给外网开了ssh端口,须要访问内部服务器一个web应用,以及须要访问某些限定了来源IP的服务,就能够用上这个方法了。服务器

举一个具体例子,运行:

1
2
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.重置终端

1
reset

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

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

1
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.在午夜的时候执行某命令

1
echo cmd | at midnight

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

at的参数比较人性化,跟英语语法同样,能够tomorrow, next week之类的,详细的查看手册man at

6.远程传送麦克风语音

1
dd if=/dev/dsp | ssh username@host dd of=/dev/dsp

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

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

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

若是你没有远程主机,能够试试这样:

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

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

可是若是有别的程序正在使用声卡,这个方法就不凑效了,由于通常的声卡都不容许多个音频流同时处理,能够借用alsa组件的工具,arecord跟aplay:

1
arecord | ssh username@host aplay

本地回放就是:

1
arecord | aplay

若是你想吓吓别人:

1
cat /dev/urandom | ssh username@host aplay

7.映射一个内存目录

1
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对比远程文件跟本地文件

1
ssh user@host cat /path/to/remotefile | diff /path/to/localfile -

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

善用ssh可让web开发减小不少繁琐,还有好比sshfs,能够从编辑-上传-编辑-上传的人工循环里面解脱出来。

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

1
netstat -tulnp

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

  • -t: 显示TCP连接信息
  • -u: 显示UDP连接信息
  • -l: 显示监听状态的端口
  • -n: 直接显示ip,不作名称转换
  • -p: 显示相应的进程PID以及名称(要root权限)

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

相关文章
相关标签/搜索