如何在 Linux 下提高工作效率

分享有用的小脚本

Updated on 2017-10-14 08:50 (Created on: 2017-10-14 08:35)

前言

我已经使用 Linux 桌面超过3年,在使用的过程,我自己也编写了不少用于提高工作效率的 脚本,今天就来说说我自己的那些高效的小工具(基本也适用于 OS X), 其实我就是懒 :). 这些脚本我都是保存到一个 tool_function.sh 的文件,兼之我适用的是 Zsh, 所以我就在 .zshrc 文件加上一条:

source /home/samray/.oh-my-unix/tool_functions.sh

这样就可以像使用其他命令一样使用我自己的脚本

SSH 免密码代理

对于开发人员而言,免不了要地登录服务器,或是查看日志,或是修改代码,或是Debug,但 是每次登录服务器的时候都要输入密码,实在烦琐,所以我就编写了个脚本免除这个麻烦

function config_ssh_login_key(){
    if [ $# -lt 3 ];then
	echo "Usage: $(basename $0) -u user -h hostname -p port"
	kill -INT $$
    fi
    #if public/private key doesn't exist ,generate public/private key 
    if [ -f ~/.ssh/id_rsa ];then
	echo "public/private key exists"
    else
	ssh-keygen -t rsa
    fi
    while getopts :u:h:p: option
    do
	case "$option" in
            u) user=$OPTARG;;
            h) hostname=$OPTARG;;
            p) port=$OPTARG;;
            *) echo "Unknown option:$option";;
	esac
    done

    if [ -z "$port" ];then
	port=22
    fi
    #check whether it is the first time to run this script and whether authorized_keys exists
    # ssh_host_and_user="$1@$2"
    authorized_keys="$HOME/.ssh/authorized_keys"
    printf "$user@$hostname's password:";read -r -s password
    if sshpass -pv $password ssh -p "$port" "$user@$hostname" test -e "$authorized_keys";then
	echo "authorized key exists"
	kill -INT $$
    else
	sshpass -p $password ssh  $user@$hostname -p $port "mkdir -p ~/.ssh;chmod 0700 .ssh"
	sshpass -p $password scp -P $port  ~/.ssh/id_rsa.pub $user@$hostname:~/.ssh/authorized_keys
	# ssh-copy-id "$user@$hostname -p $port"
    fi
}

脚本说明

脚本最开始的部分就是判断是否包含 hostname user 这两个关键参数,然后判断是否 已经有生成好的公私钥,如果没有就生成一对公私密钥,然后在服务器新建目录,修改目录 权限为 0700,再把公钥发送到服务器。

脚本用法

config_ssh_login_key -u samray -h 192.168.199.127 -p 666

如果不指定 -p(port) 端口值的话,默认端口是 22. 可能有朋友会担心免密码登录服 务器的安全性,免密码登录这个服务器只是限于当前这个电脑,你如果换一台电脑登录服务 器,你依然需要输入密码。而当别人可以接触到你的电脑的时候,你首先需要担心的就是你 电脑资料的安全。

sudo 免密码使用

对于 Linux 系统,sudo 这个命令真的是不可或缺的,sudo 可以让用户暂时以 root 的权限来运行程序,但是 sudo 面临和 ssh同样的问题,需要输入密码,更何况 sudo 的使用频率远远大于 ssh, 所以免密码使用 sudo 就可以充分减少敲击键盘的 次数. 在 root 权限下运行:

visudo

然后在打开的配置文件添加下面的内容:

samray ALL=(ALL) NOPASSWD:ALL

samray 换成你自己的用户名,保存退出即可。验证一下是否可行:退出 root 权限,然后执行:

sudo visudo

如果可以不用输入密码就进入到刚刚的配置文件,就说明成功了。

生成若干位的密钥

在开发过程中,经常会需要生成若干位密钥或者是随机字符串,得益于 Linux 强大的命令 行工具和自带的伪随机数生成器,可以很简单地生成需要的密钥:

# generate key
function gkey(){
    if [ -n "$1" ];then
     local length="$1"
    else
     local length=32
    fi
    OS_NAME=$(uname)
    if [ $OS_NAME = "Darwin" ]; then
     LC_CTYPE=C cat /dev/urandom |tr -cd "[:alnum:]"|head -c "$length";echo
    else
     cat /dev/urandom |tr -cd "[:alnum:]"|head -c "$length";echo
    fi
}

脚本说明

脚本内容很简单,就是输出 /dev/urandom 这个伪随机数生成器的值,然后获取若干个是 数字或者字母的字符串

脚本用法

gkey

如果没有指定长度,默认生成的就是 32 位的字符串。当然,你也可以自己指定长度:

gkey 64

复制命令行输出

有时需要复制某个命令的输出,一般的做法都是运行某个命令,用鼠标选中目标内容,然后 复制。例如在生成密钥之后,需要复制到项目的配置文件。但是每次都要用鼠标,效率实 在不高。所以就可以编写个脚本实现复制命令行的输出而无需鼠标点击:

OS_NAME=$(uname)
function pclip() {
    if [ $OS_NAME = "CYGWIN" ]; then
	putclip "$@";
    elif [ $OS_NAME = "Darwin" ]; then
	pbcopy "$@";
    else
	if [ -x /usr/bin/xsel ]; then
	    xsel -ib "$@";
	else
	    if [ -x /usr/bin/xclip ]; then
		xclip -selection c "$@";
	    else
		echo "Neither xsel or xclip is installed!"
	    fi
	fi
    fi
}

依赖

在 Linux 下这个脚本就需要依赖其他命令,所以需要安装 xsel 或者是 xclip 命令, 不过很多的发行版本都带有这两个命令

脚本用法:

gkey|pclip

交互选取历史命令

在 Shell 查询历史命令可以使用 history 命令或者是通过 Ctrl-r 来交互搜索命令, 但是我感觉都不方便,我需要更好的搜索工具。需要使用我之前介绍过的 Shell 交互神器 percol, 需 要把下面的代码添加到 .zshrc:

function exists { which $1 &> /dev/null }

if exists percol; then
    function percol_select_history() {
	local tac
	exists gtac && tac="gtac" || { exists tac && tac="tac" || { tac="tail -r" } }
	BUFFER=$(fc -l -n 1 | eval $tac | percol --query "$LBUFFER")
	CURSOR=$#BUFFER         # move cursor
	zle -R -c               # refresh
    }

    zle -N percol_select_history
    bindkey '^R' percol_select_history
fi

运行截图: Imgur

复制当前文件路径或者是目录路径

有时候,我需要复制当前目录下某个文件的路径,但是无论是文件管理器,还是在 Shell 中都要用鼠标选中然后复制指定文件的路径,效率不高且很不方便。所以我通过结合 percol 和上面提高的 pclip 函数改进了做法:

复制当前目录下的某个文件路径:

function pwdf()
{
    local current_dir=`pwd`
    local copied_file=`find $current_dir -type f -print |percol`
    echo -n $copied_file |pclip;
}

或者是复制当前目录的路径:

function pwdp(){
    pwd|pclip;
}

运行截图: Imgur

总结

Perl 语言它爹(Larry Wall)曾经说过——

程序员有三大美德,分别是“懒惰、急躁、傲慢”(Laziness, Impatience and hubris)

现在看来 懒惰 这美德也是推动技术发展的一大动力

备注

这博文我会不断更新的