包含标签 linux 的文章

别让 cd 浪费你的时间

终端下工作最烦躁的就是路径切换,没有自动路径切换的帮助,就像在泥里走路,于是大家发明了各种 autojump / z / fasd 等工具来提升路径切换的效率,今天向大家介绍一个更好用的工具:z.lua,用熟练了以后就像终端里溜冰,路劲切换从此指哪打哪。

z.lua 是一个会学习你使用习惯的 cd 命令,它会跟踪你在 shell 下访问过的路径,通过一套称为 Frecent 的机制(源自 Mozilla),经过一段简短的学习之后,z.lua 会帮你跳转到所有匹配正则关键字的路径里 Frecent 值最高的那条路径去。

正则将按顺序进行匹配,”z foo bar” 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo。

特性说明:

  • 性能比 z.sh 快三倍,比 fasd / autojump 快十倍以上。
  • 支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
  • 支持 Fish Shell,Power Shell 和 Windows cmd。
  • 使用增强匹配算法,更准确的带你去到你想去的地方。
  • 低占用,能够仅在当前路径改变时才更新数据库(将 $_ZL_ADD_ONCE 设成 1)。
  • 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
  • 交互选择模式,支持使用 fzf 进行可视化结果筛选(可选)。
  • 快速跳转到父目录,或者项目根目录,代替反复 “cd ../../..” 。
  • 为不同的操作系统,不同的 Shell 程序提供统一的使用体验。
  • 兼容 lua 5.1, 5.2 和 5.3 以上版本。
  • 自包含且无额外依赖,单个 z.lua 文件完成所有工作。

软件安装:

将下面对应语句添加到你的 .bashrc / .zshrc / .profile 或者对应 shell 的初始化脚本末尾:

eval "$(lua /path/to/z.lua --init bash enhanced once echo)"    # BASH 初始化
eval "$(lua /path/to/z.lua --init zsh enhanced once echo)"     # ZSH 初始化
eval "$(lua /path/to/z.lua --init posix enhanced once echo)"   # 其他 Posix Shell 初始化
source (lua /path/to/z.lua --init fish enhanced once echo | psub)  # Fish Shell 初始化
iex ($(lua /path/to/z.lua --init powershell enhanced once echo) -join "`n") # Power Shell 初始化

然后重新登陆,即可使用。

……

阅读全文

Bash 中文速查表/Cheatsheet (全网最全)

Bash 的知识点向来比较凌乱,有时候写点小脚本,你忘记了条件判断怎么写了,就打开网页搜索一半天;忘记怎么分割字符串,又搜索一半天;忘了怎么解压缩某后缀名,又打开网页搜一半天。

关键大部分搜出来的东西都十分琐碎,东一处,西一处,质量又参差不齐,而且看到一处有些细节有疑问,你还得接着搜索。

连记点笔记也是这一篇那一篇的,用起来找来找去的十分不爽,所以我一怒之下春节期间整理了一份 bash 的 cheatsheet,以图以后有关于 bash 的事情就查看这个文件就够了:

https://github.com/skywind3000/awesome-cheatsheets/blob/master/languages/bash.sh

对于一些工具性的东西,有时候一份速查表比你翻书查网页都高效数倍。

……

阅读全文

为什么说 zsh 是 shell 中的极品?

(这是之前我在知乎上回答的一个可能对大家有点用处的答案,关于 zsh 的一些演示)

色彩高亮

并不是传统基于正则表达式的色彩高亮,而是真的会判断你输入的是啥的色彩高亮:

白色代表普通命令或者程序,红色代表错误命令,这个很管用,你再一个个字母的敲命令,前面都是红色的,如果敲对了最后一个字母的话,你会看到整条命令连着前面的都变成了白色,代表你敲对了。以前无高亮的时候敲错了都不知道,还要往上翻着左右检查。下面青色的代表内建命令或者 alias (echo 和 ls ),这些都不是正则判断出来的,是真的去检查的。

细心的人会发现非零的错误码,也会高亮显示在最右边(上一条 data命令错误,返回127)。

命令提示

注意,命令提示和补全是两个完全不同的系统,很多时候提示比补全更有用:

你才输入完 “tar”命令,后面就用灰色给你提示 tar 命令的参数,而且是随着你动态输入完每一个字母不断修正变化:

比如你输入到 - 后,没有跟着它上面的提示,而是输入了一个c字母,它马上明白你是要压缩,不是解压,然后随即给出你压缩对应的命令提示。

这个命令提示是基于你的历史命令数据库进行分析的,随着你输入的命令越来越多,提示将会越来越准确和顺手,某些不常输入的命令特别管用,比如偶尔查看下网卡配置:

刚输入完:cat /etc/n 它后面已经猜出你可能要查看网卡配置了,然后马上给出你提示,用不着你 tab 补全半天,你才敲 gc ,它就猜测出你可能想运行 gcc,然后马上给出完整建议:

如果你觉得它提示的正确,你可以 CTRL+F 表示采纳,后面就会自动帮你一次性全部输入完了,不用一个字一个字的照着敲。前面的高亮就不说了,用惯这套提示系统,你就再也难以回到光秃秃的 bash 时代了。

智能补全

传统 shell 的补全在 zsh 面前基本都可以下班了:

……

阅读全文

GDB 从裸奔到穿戴整齐

无数次被问道:你在终端下怎么调试更高效?或者怎么在 Vim 里调试?好吧,今天统一回答下,我从来不在 vim 里调试,因为它还不成熟。那除了命令行 GDB 裸奔以外,终端下还有没有更高效的方法?能够让我事半功倍?

当然有,选择恰当的工具和方法,让 GDB 调试效率成倍的提升并没有任何问题。当然,前提条件是你至少会在使用最原始的 GDB。

裸奔状态:原始的 GDB 命令行

穿上各种衣服前,至少得先学会裸奔,找份简单的 GDB cheat sheet 对照一下:

生产环境中出现崩溃时,因线上服务器一般没有开发环境,也无配套源代码,所以程序崩溃后,如果你懒得把 core 文件拖回到开发机检查,可以先在线上服务器先简单gdb看一下。

GDB命令密密麻麻,常用的也就表格上那几条,比如进去以后第一步先用 bt 查看一下调用栈,info local查看一下本地变量,再配合 up/down 在整个调用栈的不同层次之间上下移动一下,检查各处局部变量的值,print 一下某个表达式,即便没代码,看下符号和反汇编,一般也能调试个七七八八。

碰到复杂点的 BUG,必须配合源代码了,那你得把 core 文件拉到开发环境中,再用 gdb 对照源代码调试,配合 list [行号] 指令查看当前运行的源代码,再配合其他方法进行调试。

那么这时候,如果调试复杂度继续上升,你需要不断的断点,每次 next / step 单步完后你都需要 list 一下前后源代码,或者用 disassemble [函数名/地址] 查看一下指令的话,不少人会感觉到抓狂,这时我们需要给裸奔的 GDB 穿条内裤了。

……

阅读全文

Aix 折腾手记

早年开发工作主要在 FreeBSD进行,2006年后来切换到 Linux下,期间穿插使用了一下 Solaris,所以我的网络库一直都是只支持这三个系统。为了让网络库支持更多平台,网上购置了一台 IBM AIX 小型机,因为其他大部分非 Linux系统,今天基本都可以在虚拟机里面安装了,而 AIX系统,你真的没法虚拟。

弄了几天以后,发现真他妈的麻烦,强大是强大,但是真的太琐碎了,相比之下,Linux/FreeBSD之流基本是傻瓜了。不看说明直接操作 AIX的话,可能连开机都麻烦,或者关机没关对,下次直接启动不了。

文字终端就没什么好拍的了,先上一张图形桌面的靓照吧:

是的你没看错,这就是 AIX 7,2012年的操作系统,就是那么的霸道,四处透着古典 Unix的味道。这样的机器今天还跑在各大银行的机房里,AIX系统管理员也拿着比 Linux系统管理员多几倍的工资,虽然工作岗位比较稀少。

……

阅读全文

Linux 网桥设置

在公司机房的物理机上架设 KVM虚拟化的时候,经常需要配置网桥,先要安装网桥工具:

apt-get install bridge-utils   
apt-get install uml-utilities

编辑 /etc/network/interfaces,参考下面配置加入网桥配置信息:

……

阅读全文

Linux 硬件时区折腾备忘

前段时间折腾家中 Nas的虚拟化服务,有时候虚拟机系统时间总是快8个小时。Guest这边设好了,到了 物理机就会慢8个小时。网上说只要修改/etc/default/rcS中的 UTC=no就行了,但还是没反映,没办法,一步步找问题。发现在/etc/rcS.d/S05hwclock.sh有这样一段话:

# 2012-02-16 Roger Leigh rleigh@debian.org
# - Use the UTC/LOCAL setting in /etc/adjtime rather than
# the UTC setting in /etc/default/rcS. Additionally
# source /etc/default/hwclock to permit configuration.
……

阅读全文

Linux 线上系统调优备忘

大公司呆久了,都会对 SA的依赖十分强烈,很多事情 SA都帮我们搞定了。如今控制成本,没有招聘 SA,又没有购买 VPS,从买物理机开始到 IDC部署,服务器调优,虚拟机管理,全部都是自己来,才发现,安装一台 Linux机器自己玩很简单,但是要达到线上服务器的标准,还有若干调优工作需要做,有 SA的日志是多幸福的事情啊。

物理机设备驱动

Dell服务器默认安装系统后会报找不到驱动:

W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin

因为 Debian/Ubuntu 的包都是开源的,默认开源驱动性能不行,于是需要添加 non-free源:

deb http://ftp.de.debian.org/debian main contrib non-free
deb-src http://ftp.de.debian.org/debian main contrib non-free

然后:

apt-get update
apt-get install firmware-linux-free firmware-linux-nonfree

解决 Dell驱动报错问题。

……

阅读全文

Linux 下配置 Iptables 端口转发

经常需要对服务端的端口进行转发映射,让链接A服务器(202.181.55.93:8080)端口的所有tcp数据,forward到B服务器(106.185.43.22:80)端口,比如国内联通出国访问比较快,而电信比较坑爹,如果你家是电信网络,你却想畅快的访问境外的 vps,那么可以在你联通网络的境内服务器上进行这样一个端口映射,你链接境内服务器(201.181.55.93:8080)端口相当于链接境外服务器的(106.185.43.22:80)端口。

Linux内核的 Iptables很强大,它维护一组内核变量,使用 /sbin/iptables命令进行直接规则设置,且通过配置新规则,可以直接支持端口转发,简单在 A服务器上使用下面这个 shell脚本即可:

#! /bin/sh
# create forward rule by source interface
# http://serverfault.com/questions/532569/how-to-do-port-forwarding-redirecting-on-debian
PortForward1() {
	local IN_IF=$1
	local IN_PORT=$2
	local OUT_IP=$3
	local OUT_PORT=$4
	local IPTBL="/sbin/iptables"
	echo "1" > /proc/sys/net/ipv4/ip_forward
	$IPTBL -A PREROUTING -t nat -i $IN_IF -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}
	$IPTBL -A FORWARD -p tcp -d $OUT_IP --dport $OUT_PORT -j ACCEPT
	$IPTBL -A POSTROUTING -t nat -j MASQUERADE
}
# create forward rule by source ip
# http://blog.csdn.net/zzhongcy/article/details/42738285
ForwardPort2() {
	local IN_IP=$1
	local IN_PORT=$2
	local OUT_IP=$3
	local OUT_PORT=$4
	local IPTBL="/sbin/iptables"
	echo "1" > /proc/sys/net/ipv4/ip_forward
	$IPTBL -t nat -A PREROUTING --dst $IN_IP -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}
	$IPTBL -t nat -A POSTROUTING --dst $OUT_IP -p tcp --dport $OUT_PORT -j SNAT --to-source $IN_IP
}
PortForward1 eth3 8080 106.185.43.22 80
# put this file on /etc/network/if-up.d

上面两个函数,一个是针对网卡,一个是针对本地IP设置转发,记得把这个脚本放到 /etc/network/if-up.d 下面并设置可执行权限(Debian/Ubuntu),每次开机重启时保证可以运行,即可。

……

阅读全文