2005-12-18

SSH穿梭机

许多人都经常在Linux/UNIX/*BSD的系统中来回穿梭,这是他们的日常工作,是养家糊口的方法。我也是其中的一员。在系统中跳来跳去、来回登录、传输文件,是挺烦人的;为了减少点麻烦,让日子过得更舒服一些,大家都积累了一些小手段,让事情变得更简单一些。今天记录一下我自己做这些事的方法。我的系统是Debian,下面也以它来讲解;但在其他的大多数系统中也都差不多,Windows系统则可以通过Cygwin来得到下面的这些程序。

一般来说,这些系统都是通过ssh来维护的;要使用它,得先安装openssh-client:
sudo apt-get install openssh-client

然后为自己创建用来进行登录认证的密钥,它可以帮助我们在登录时更安全和方便,也可以让一些工作实现自动化:
test -d $HOME/.ssh || mkdir -m 0700 $HOME/.ssh
ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -b 2048

在创建过程中,要输入两次passphrase。passphrase是只有主人知道的密码,是密钥的最后一层安全屏障;有了它,即使你的.ssh/id_rsa文件被人偷走,盗贼不知道passphrase也一样不能冒用。

不过passphrase带来的一个问题是,每次使用密钥之前都要被提问,但ssh-add可以解决这个麻烦。不过我一般不直接使用ssh-add,有了更方便的Keychain,还可以更省心一些。安装Keychain:
sudo apt-get install keychain ssh-askpass

其中ssh-askpass是用来提问passphrase的小程序。也可以选择安装ssh-askpass-fullscreen或者ssh-askpass-gnome。然后
mkdir -p $HOME/.keychain

并把一下语句放入自己的shell rc。比如我是用bash,则加入~/.bashrc:
keychain ~/.ssh/id_rsa
. ~/.keychain/${HOSTNAME}-sh

这样,可以在第一次登录shell的时候,自动加载密钥,而后就再也不会提问它了。

至此我自己的工作环境就准备完毕了。为了登录到其他主机,还需要把密钥放入主机的~/.ssh/authorized_keys文件中。我通常使用下面的脚本来做这个工作:
#!/bin/sh
#sshpubkey.sh
#Here's a little one liner that'll do the trick (for passwordless auth) after you've done the ssh-keygen:
target="$1"
ssh "$target" 'test -d .ssh || mkdir -m 0700 .ssh ; cat >> .ssh/authorized_keys && chmod 0600 .ssh/*' < ~/.ssh/id_rsa.pub

给要访问的主机添加认证时,只需执行:
sh sshpubkey.sh xyb@my.host.com

就自动设置完毕了。

下面我们就可以开始工作了。要登录它,就:
ssh xyb@my.host.com

要上传文件时,执行:
scp -r mydir/ xyb@my.host.com:/path/to/save

要下载文件时,执行
scp -r xyb@my.host.com:/path/to/ mydir

这样就方便很多了。

不过,有些文件可能经常需要更新。比如,我喜欢在自己的机器上编写程序,然后在另一台主机上编译和调试。所以,我需要有个工具能帮我把文件和目录“同步”到主机上去。这是lftp的长项:
lftp -c "open sftp://xyb@my.host.com; mirror -R /my/dir /path/to/dir"

这一条命令就把数据从我的/my/dir目录“镜像”到了远程主机的/path/to/dir了;而且聪明的lftp会自动判断那些文件是被修改过的,它只更新那些新文件。实际上,我更喜欢这样使用:
lftp -c "open sftp://xyb@my.host.com; repeat 2 mirror -X '*.swp' -v -R /my/dir /path/to/dir"

这条命令会把我的目录每2秒向远程主机同步一次,同时显示它做过那些更新,并忽略所有.swp文件:那是我的编辑器vim创建的临时文件。这样,我就可以放心的编辑我的源代码,每次保存的新代码,至多2秒钟之后就会出现在我的调试主机上了。是不是很方便呢 :-D

1 条评论:

xyb 说...

好地,那我继续发喽。