前言
我已经使用 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
运行截图:
复制当前文件路径或者是目录路径
有时候,我需要复制当前目录下某个文件的路径,但是无论是文件管理器,还是在 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;
}
运行截图:
总结
Perl 语言它爹(Larry Wall)曾经说过——
程序员有三大美德,分别是“懒惰、急躁、傲慢”(Laziness, Impatience and hubris)
现在看来 懒惰
这美德也是推动技术发展的一大动力
备注
这博文我会不断更新的