我是个网站开发者,写代码就在我本地的 ubuntu 机器上,但是网站写好了就要部署到服务器上了。我一般是花 10 美元一个月,买国外的 vps ,也装上 ubuntu 。问题就出来了:第一如何远程操作我的服务器?第二如果传输数据?
这就引出了这次我们要聊的两个强大的工具: 远程操作工具 ssh,数据传输工具 rsync 。
ssh 远程操作
首先 ssh 是网络上两台机器互联的一套协议,默认走 22 端口,就跟 http 类似, http 默认走 80 端口。 22 端口开了,我们的通道就有了,但是还是要求,请求这一方要安装 ssh client,被访问的这一边要安装 ssh server 。
ubuntu 的 desktop 版,就是我本地用的这个带图形界面的系统,默认安装了 ssh 客户端,也就是我可访问他人
$ ssh peter@haoduoshipin.com
如果本地用户,和远端服务器上用户同名,这里的 peter 也可以省略。另外,haoduoshipin.com 的机器是我在 Linode 上申请的一台 VPS 。上面我装了 ubuntu 12.04 的 server 版,默认是有 ssh 的服务器端的,所以我们才可以访问它。
每次都要输入密码挺讨厌的,可以通过添加 ssh key 的方式解决。首先在我自己的机器上
$ ssh-keygen
会出现几个问题,都直接回车取默认值就可以了。这样
$ cd ~/.ssh
$ ls
id_rsa id_rsa.pub
id_rsa 是 private key 这个是要严格保密的,id_rsa.pub 这个上传到服务器的指定位置上。
$ ssh-copy-id peter@haoduoshipin.com
这样,我就把我的 id_rsa.pub 添加到服务器上的 /home/peter/.ssh/authorized_keys 文件之中,后面再用 peter 用户登录就不需要输入密码了。
ssh 登录之后,现在操作的就是我的服务器了。我可以打开配置文件修改一下,使用 vim 。也可以用
$ tail -f log/development.log
查看 log 。这时就有问题出来了,如果我敲 ctrl-d 退出登录,或者网络出了问题,ssh 链接断开了。那我在服务器上正在操作的这个现场也就丢失了。维护住这个现场可以使用 tmux 。参考 http://haoduoshipin.com/episodes/41
ssh 是通的,那么我就可以用 scp 来进行文件传输了。下载
$ scp -r haoduoshipin.com:mydir .
上传 $ scp -r mydir haoduoshipin.com:
注意最后的 :
不能省略。
rsync
scp 是一次把整个的目录内容都拷贝了。如果要把本地的一个目录和远端保持同步则要用到 rsync 。
使用 rsync 的前提是,本地和远端要通 ssh (其他的协议也可以,不过也要配置才行)。
发挥和 scp 类似的命令把本地的一个目录上传到 haoduoshipin.com 服务器上
$ rsync -r mydir haoduoshipin.com:
特别注意,mydir 后面不能有 / 不然会直接把 mydir 中的文件上传,而不上传 mydir 目录本身。另外,最后面的 :
是不能省略的。
要从服务器上,往本地下载数据,基本上就是把 rsync 后面的两个参数颠倒位置
$ rsync -r peter@haoduoshipin.com:mydir .
本地新添加文件后,如果要让远端也同步
$ rsync -r mydir/ haoduoshipin.com:mydir/
为保留更完整的文件信息,通常把 -r 参数改为 -a,-a 的具体功能,可以参考 manpage
要把本地删除的文件,在远端机器上也删除,可以使用 –delete
$ rsync -a --delete mydir/ haoduoshipin.com:mydir/
但是这样有个问题,万一在本地误删了文件,一同步,那远端的备份也被删了,加 -v 参数可以有信息提醒我们会增加或删除那些文件,但是看到信息的时候后悔也晚了。好在还有一个贴心的参数 –dry-run
$ rsync -av --delete mydir/ haoduoshipin.com:mydir/ --dry-run
这样就可以只报告信息,但是不真正进行同步了。实际中,每次我要同步数据的时候,都是先 dry-run 一次,看看没有误删除东西,然后再同步。每次都敲命令太麻烦,所以写了一个脚本:
sync_dryrun()
{
echo
echo -e "\033[1m ...dryrun...\033[0m"
rsync -av --delete ~/Desktop/lgcb/video/ peter@haoduoshipin.com:~/media/lgcb/ --dry-run
echo -e "\033[1m ...dryrun...\033[0m"
echo
}
sync_dryrun
sync_server()
{
echo
echo -e "\033[1m ...syncing...\033[0m"
rsync -av --delete --progress ~/Desktop/lgcb/video/ peter@haoduoshipin.com:~/media/lgcb/
echo -e "\033[1m ...done...\033[0m"
echo
}
echo -n "Want to sync? (Y/n): "
read AAA
if [ "${AAA:-y}" = "y" ];then
sync_server
else
echo Nothing done, bye.
fi
这两个大工具就介绍到这里,实际中还有一些是总会偶尔用到的,如 ftp curl ping ifconfig 等等。可以用到的时候 google 一下,或者参考 TLCL 17 网络: