Latest Posts

ssh 命令在脚本中的使用建议 2013-01-05

以下内容摘自 man ssh_config

BatchMode

If set to “yes”, passphrase/password querying will be disabled. This option is useful in scripts and other batch jobs where no user is present to supply the password. The argument must be “yes” or “no”. The default is “no”.

如果你觉得与其让 ssh 命令跳出个输入密码的提示还不如让其自动失败, 那这个选项值得打开

ConnectTimeout

Specifies the timeout (in seconds) used when connecting to the SSH server, instead of using the default system TCP timeout. This value is used only when the target is down or really unreachable, not when it refuses the connection.

别等这么久了, 你在处理本地环境的机器的时候, 要是一秒还没连上机器基本上再等十秒也不能给你太大帮助, 不如将这条超时调短


以下摘自 man ssh

-n

Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote machine. For example, ssh -n shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.)

我只想说括号里的这一点, 如果你配合 while read 的时候使用 ssh, 请务必加上 -n 选项, 否则 ssh 会读完你剩下的 STDIN 缓冲区, 让你的下一个 while 循环直接结束

综上所述, 你可以在脚本里这样用 ssh

ssh -o ConnectTimeout=2 -o BatchMode=yes -n $host 'command'

让你的 Mac 帮你回忆这一天你到底干了啥? 2013-01-05

MacX 下的截屏实际上是调用了 /usr/sbin/screencapture 这个程序, 所以只要写个脚本定时跑就行了.

#!/usr/bin/env bash
echo $PATH
dir="$HOME/Pictures/screen" # 存在这个位置
[[ ! -d $dir ]] && mkdir -p $dir
cd $dir
filename="$(date +%Y%m%d-%H%M).png"
/usr/sbin/screencapture -o -x $dir/$filename # 截屏!
sips -Z 800 $dir/$filename # 优化一下大小, 缩小成 800px 宽
find $dir -ctime 1 -name '*.png' -type f -delete # 删除一天以上的截图

脚本取名叫 screenshot.sh, 放在用户目录下的 bin 目录, 然后把它加入 crontab: crontab -e

*/2 * * * * bash ~/bin/screenshot.sh  >> /tmp/screenshot.log 2>&1

这样就能每两分钟截图一次并保存在你的 Pictures/screen 文件夹下啦.

善于使用 bash builtin -- read 2013-01-04

正确的在脚本中使用 while read 可以得到诸多好处, read 命令从标准输入中取得输入存入变量. 使用 read 的脚本都可以获得 linux pipe 的所有优点.

将你的脚本放入管道

while read host ip; do
    echo "$host ip is $ip";
done

比如这个脚本名叫 echo_host_ip.sh. 再有一个文件 host_info, 每行都是主机名和 IP 的对应关系.

host1 1.2.3.4
host2 2.3.4.5
host3 3.4.5.6

你可以这样用

  • linux 管道: cat host_info | ./echo_host_ip.sh

  • bash 标准输入导入 ./echo_host_ip.sh < host_info

  • 直接在 bash 中输入一条信息测试 ./echo_host_ip.sh <<< 'host4 4.5.6.7'

Git Status 中文乱码解决 2012-09-23

只要一行就行了

git config --global core.quotepath false

前后效果对比见图

Ruhoh Plugin 第二弹 -- Sitemap Generator 2012-09-13

网站地图(Sitemaps)是一个让搜索引擎了解你站点所有可抓取网页的最快方法. 网站地图是一个列出 URL 以及像是最后修改时间, 更新频率, 重要度, 关联度这些信息的 XML 文件. 所以它可以让搜索引擎更加智能的抓取你的站点.

我根据 sitemaps.org 的标准写了这个 Sitemap Generator. 该文档要求每个页面都需要有

  • <loc>: 用以描述网页的位置

可以有

  • <lastmod>: 用 W3C Datetime 或者 YYYY-MM-DD 来描述最后修改时间

  • <changefreq>: 可用以下几种内容来描述该页面的更新频率

    • always
    • hourly
    • daily
    • weekly
    • monthly
    • yearly
    • never
  • <priority>: 用来描述同一站点里面页面的相对权重, 默认 0.5 (意在通过搜索引擎搜出你自己站点多个页面的时候可以通过这个属性进行自定义排序, 权重大的排在前面. 你设得再大也不能跑到别人前面去啦)

参考了 ruhoh.rbrss.rb 用的 Nokogiri::XML::Builder 搞成的简易工具. 顺便还支持了一些小的自定义, 具体的还请移步 Ruhoh Sitemap Generator

利用 find 删除自编译的 Python 2012-09-05

以前编译 Python 的时候没有修改 prefix, 它默认就安装到 /usr/local 文件夹中, 导致后来想要清理掉这些文件的时候遇到了一点困难. 今天终于下定决心搞定了这个问题.

使用 find 命令找出那段时间创建的文件, 然后再将其删除

首先先确定 /usr/local/bin/python 文件的创建时间

python_mtime=$(stat -c %Y /usr/local/bin/python)
# 1345534652

然后确认现在时间和 Python 安装时间的时间差(单位是分钟)

time_period_min=$(( ( $(date +%s) - python_mtime )/60 ))

最后就能确认出那一小段时间内被修改的文件

find -newermt @$(( python_mtime -1 )) -mmin +$time_period_min | tee find.output

文件列表搞出来了你还删不掉吗.?

cat find.output | xargs rm -rf

最后献上完整的脚本

#!/usr/bin/env bash
file_name=$1
mtime=$(stat -c%Y $file_name)
mtime_p_min=$(( ( $(date +%s) - mtime )/60 ))
find . -newermt @$(( mtime -1 )) -mmin +$mtime_p_min | tee find.output

PS: GNU findutils 从 4.3.3 版本开始支持 -newerXY 参数, 所以本脚本要求 findutils 至少 4.3.3

使用 Alfred 代替系统自带 Spotlight 2012-09-04

首先明确一点, Alfred 使用的是与 SpotLight 相同的系统索引, 所以千万别用 sudo mdutil -a -i off 把系统的文件索引给关了哦.

首先在 System Preferences -> Spotlight 里面去掉 Spotlight 的全局快捷键

接着去掉顶栏右边的放大镜

sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search
# 重启系统 UI
killall SystemUIServer

然后下载 Alfred, 修改快捷键到 Spotlight 原有的默认快捷键 <c-space>

最后确认一下 Alfred -> Alfred Preferences -> Advanced -> Keyboard -> Force Keybord 是不是 U.S. 键盘. 这个功能可以强制指定使用 Alfred 时使用的输入法

在 Mac 10.8 下使用 Passenger & Rvm 的 Rails 应用部署 2012-08-17

本文在 MacOSX 10.8 MountainLion 下测试通过

安装 Homebrew

嘿, 先安装 Homebrew 不需要我再介绍了把?

ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

参考资料: Homebrew Install

安装 RVM

RVM 是 ruby 的环境隔离工具

curl -L https://get.rvm.io | bash -s stable --ruby

参考资料: Installing RVM

用 Gem 安装 Passenger

Passenger 是在 apache 或 nginx 上面部署 Rack 应用的程序

gem install passenger

参考资料: Passenger with nginx on Mac OS X (2nd edition)

使用 Tmux 代替 Screen 2012-08-16

我已经慢慢的开始使用 tmux 来代替 screenbyobu.

最初接触 screen 是因为看了 IBM DeveloperWorks 上的文章 《linux 技巧:使用 screen 管理你的远程会话》. Screen 刚安装好不做配置的时非常不好用, 所以后来出现了 Ubuntu 出品的 Screen 配置 wrapper: Byobu. Byobu 挺好用的, 不过它的问题是除了 ubuntu 以外, 没有其他系统把 byobu 给做进默认仓库并且对它的版本更新做出及时的反应.

经过了这么两年的折腾之后, 我发现, 作为一个 SA, 顺手工具迁移性的难易成为了一个选择工具中的重要指标, 所以我才开始慢慢的向 Tmux 转移. Tmux 似乎是作为 screen 的替代品出现的, 大多数操作都很相似, 而且不需要配置也可以很舒服的使用. 另外 Tmux 还有一个很不错的特性叫分屏, 嗯, 如下图所示.

列举一下常用的命令吧:

  • tmux: 运行一个新的 tmux 窗口
  • tmux ls: 查看已经在运行的 tmux 进程
  • tmux attach: 附着(attach)已有的 tmux 进程

Tmux 默认的 Prefix 是 C-b, 如果已经很熟练 Screen 的话, 可以把 Prefix 换成 C-a, 只要在 ~/.tmux.conf 文件中写入:

set-option -g prefix C-a
unbind-key C-b
bind-key C-a send-prefix

Tmux 到底应该怎么用? 你还是另外找资料把, 比如这里

Awesome Vim-PowerLine 2012-08-13

让你呆板的 Vim 编辑器变成高富帅? -> Vim-Powerline 可以做到

如果你使用基于 PathogenJanus Vim Distribution 管理 Vim 配置的话, 只需要运行这行即可.

git clone https://github.com/Lokaltog/vim-powerline.git ~/.janus/vim-powerline

如果还想要更帅的效果, 那你就在 vimrc 里面加上一行

let g:Powerline_symbols = 'fancy'

接着你当然会发现效果似乎和图片里的不太一样. 因为它用到了一些不存在的字符, 你需要用它提供的 fontpather 对你需要的字体进行处理.

当然当然, 网络上已经提供了好些已经打好 patch 的字体, 比如 Mac 系统上最常用的 Monaco for Vim-powerline, 把解压出来的文件放到 ~/Library/Fonts 文件夹内, 然后在终端字体里面选择 Monaco for vim-powerline 就能正常显示了.