Category Archives: study

【经验】Debian 建议安装源

1. 一般系统软件新版 backports

sudo tee /etc/apt/sources.list.d/backports.list << EOF
deb http://mirrors.aliyun.com/debian wheezy-backports main
deb-src http://mirrors.aliyun.com/debian wheezy-backports main
EOF

安装backports时

sudo apt-get -t wheezy-backports install pkgname

2. dotdeb

nginx已经出了官方源,但是坑很多,比如 这个。所以现在仍继续用dotdeb打包的nginx。另外如果对redis-server、zabbix、mysql5.6、php5.5有需求可以继续选用

curl http://www.dotdeb.org/dotdeb.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/dotdeb.list << EOF
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all
EOF

Continue reading

【翻訳】技术的杂谈—ssh的-L、-R端口转发是神马?

原文链接:技術的雑談-sshのportForwadingってなあに?

环境

  • ssh的版本:貌似是3.6.1p2
  • OS:大概啥都可以吧

目的

对ssh端口转发的一点点说明

ssh中可以用以下的选项做端口转发。

ssh -l 用户名 -L port:host:port host
又或
ssh -l 用户名 -R port:host:port host

但是读了man还是啥都不懂……(汗)(译者注:我读了man也不懂…这货真是给man看的?) 于是,就实际试了下。

实验

本文作出如下约定,

  • sshd所在的主机为「server」(以下例子中为host1)
  • 运行ssh的主机为「client」(以下例子中为host2)

-L是什么

L选项在man中说明如下:

Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. This works by allocating a socket to listen to port on the local side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine. Port forwardings can also be specified in the configuration file. Only root can for- ward privileged ports.

【适当翻译一下:】
指定了这个选项后,client的端口会指定host的指定server转发数据。
在本地listen这个port后,对这个端口的访问无论是来自哪里都会被转发到指定的server端口云云。以下省略。

就是这种感觉。简明扼要地说,就是「在client侧开个端口,把所有对这个端口的访问全部转发」。(只是,仅有用户为root才能使用)(译者注:没看懂这个root指哪边的用户。总之我实验的时候两边都没用root也成功了。)

于是实验一下:

host2# ssh -l hoge -L 8880:host1:80 host1

运行以上命令之后、

  • host2运行netstat -a之后,发现localhost:8880处于listen状态
  • host1则没啥变化

再从host2运行

# telnet localhost 8880

实际上就和host1的80端口(也就是host1的web服务器)连接起来了。 「GET / HTTP/1.0」然后按两次回车就能显示host1的默认页(top page)。 又或者,把刚才的-L 8880:host1:80用「-L 1234:www.hoge.com:80」代替,则ssh启动的时候(host2的8880端口)会(通过host1)和www.hoge.com的80发起连接。

(译者注:即host2 ssh到 host1之后,访问host2的8880端口,得到结果是以host1视角访问www.hoge.com的80端口的结果)

-R是什么

刚才的-L是在本地建立传送数据用的端口, -R则是把本地的端口映射过去做数据传送用。

于是再次实验:

host2# ssh -l hoge -R 8880:host1:80 host1

运行以上命令之后、

  • host2侧没啥变化
  • host1运行netstat -a之后,发现localhost:8880处于listen状态

再从host1运行

# telnet localhost 8880

发现host1的8880连着host1的80端口了。
(不对,改自己的web服务器端口有什么好玩的…)
但是,这里同样可以指定外部主机端口。(译者注:只不过这里是以host2视角


后记:

  • 这篇文章年代略久远,考虑用ss、curl代替文中的netstattelnet
  • 以我自己的理解
    • -L(local)就是本机上开个新端口,以服务器端的视角把已存在主机:端口的数据拉回来。
    • -R(remote)则是以自己机器为视角把已存在的主机:端口的数据打个洞扔过去。
    • -L和-R决定了视角,自然就决定了在哪边机器上开洞(端口)。
  • -L、-R选项可以这么拆解:
    • ssh -L 客户端端口:某主机:某端口 服务器用户@服务端地址
    • ssh -R 服务端端口:某主机:某端口 服务器用户@服务端地址
  • 如果是ipv6,可以用”/”代替”:”
  • 应用场景举例:
    • ssh -L3128:127.0.0.1:22 user@example.com
      注意这里127.0.0.1并不是只发起ssh连接的localhost,而是example.com的127.0.0.1,即example.com的localhost。
      然后example.com上个squid,然后你懂的…把socksv5转成http某种程度上还是方便不少。
    • 假如有三台主机,c1、c2、s。其中c1和c2都在nat后面,此时c2向c1求助,希望c1能ssh到他的机器当一次好人。在不改变c1 c2所在路由器的端口映射规则,又有临时机器s做中转的情况下可以这么做:
      c2执行ssh -R23333:127.0.0.1:22 s把自己的22端口贴到s的23333端口。
      c1可以先ssh s登录到example.com,然后ssh c2_username@127.0.0.1 -p23333连接到c2的机器,履行他做好人的义务。
      为啥不能直接ssh c2_username@s -p23333呢?在s上ss -anp | grep 23333就知道了,绑的是127.0.0.1,不是0.0.0.0…

【同期】rsync+inotify+ssh==简单的单向文件同步

本文大部分引用自http://heylinux.com/archives/817.html虽然puppet之类的工具也很好用啦,但是仅仅是单向同步,总有种「まだあいつの出番ではない!w」(还没轮到那家伙出场呢!)的感觉。于是小小研究了下rsync+inotify-tools+ssh的方案,简单易行。在这里,暂时把同步的源头叫src,同步到的目的机器叫dst。本文以centos6为例,debian/ubuntu用户请自行把yum之类的脑补成apt-get之类的~

安装软件包

Linux kernel从2.6开始支持inotify-tools。于是src机器

[root@src ~]# yum install rsync inotify-tools

dst机器

[root@dst ~]# yum install rsync

如果提示没找到软件包,请参考 @boypt pt桑这篇博文

设定同步专用帐号

接下来,为两边机器,即srcdst都设定同步专用帐户

[root@src ~]# useradd -m rsync
[root@src ~]# passwd rsync
[root@dst ~]# useradd -m rsync
[root@dst ~]# passwd rsync

最好在dst上编辑/etc/passwd/etc/group使得两边rsync的uid和gid一致。别忘了改完这两个文件之后之后还要chown -R rsync:rsync /home/rsync

接下来作成src的公开键与秘密键,并把src的公开键扔到dst/home/rsync/.ssh/authorized_keys下面。记得authorized_keys权限600,.ssh目录权限700。
最后在两边机器上把想同步的目录的uid:gid也改成rsync:rsync

撰写同步脚本

[root@src ~]# vim dir.rsync

!/bin/sh
SRC=/path/to/dir/ #最后的\很重要! 
DST=rsync@dst's_ip:/path/to/dir
 
#su - rsync
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
        do
                /usr/bin/rsync -ahqzt --delete $SRC $DST
        done

[root@src ~]# chmod +x !$

部分注释引用原文

相关注解如下:
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e create,move,delete,modify,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件

/usr/bin/rsync -ahqzt –delete $SRC $DST
-a 存档模式
-h 保存硬连接
-q 制止非错误信息
-z 压缩文件数据在传输
-t 维护修改时间
-delete 删除于多余文件

要排除同步某个目录时,为rsync添加–exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。
要排除某个目录的事件监听的处理时,为inotifywait添加–exclude或–excludei参数,具体查看man inotifywait。

inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。

然后按照原文我始终不能成功,于是干脆以root权限运行,虽然有安全问题但是……不管了。

!$为bash中上一条命令的最后的参数。因为Meta键总是因为各种原因按不出来所以(ry (emacs什么的最讨厌了 #口亨

最后把dir.rsync&进后台以及cat进/etc/rc.local就ok了。如果中途感觉文件没同步过去记得检查要同步的目录里面的文件权限和各种其他的权限,以及善用bash -x

在OS X ML中iterm2的tmux里使用vim时默认用系统剪贴板

标题很绕,不过如果你是osx+tmux+vim用户还经常在几个pane中使用vim的话你一定能理解我的苦衷。 os x自带的vim是 -clipboard的,所以vim用起来复制的时候特别蛋疼。再加上tmux,就呵呵了……

于是放狗搜了一个下午,在试编了各种坑爹的办法,比如使用fakeclip啊之类的,终于找到了比较科学的姿势。

  • 首先安装iterm2和homebrew
  • 然后用homebrew安装hg(依赖),再安装vim
    此时vim在iterm2中已经可以用系统剪贴板+和*了
    如果要使vim的剪贴板默认为系统剪贴板,在vimrc里加上set clipboard=unnamed
  • 找到了这个比较科学的东西, git clone并make之, cp到 /usr/local/bin
  • ~/.tmux.conf里加入set-option -g default-command "reattach-to-user-namespace -l bash" 最后的bash是终端种类,如果你用其他终端比如zsh就改zsh好了。
  • 最后iterm2里tmux kill-server一下,重新运行tmux,再运行vim,yy一下,你会发现世界真美好,os x真坑爹……

freebsd初体验

被囧三同学 @93rf 拉去修php5-gd库的问题,顺便第一次体验了bsd系server(以下略称bsd)…

之前对freebsd的映像还停留在【进个桌面要半天】【安装过程奇葩】【小心inode耗尽】之类的。第一次玩bsd很顺利地就ssh进去了,不错嘛(喂…

freebsd的cc为clang,shell默认用的csh,但是bash的一套快捷键貌似都可以用(废话readline),所以违和感全然…

php-gd库的攻略设定在此(日语),总之是改 php[ver]-extensions 的Makefile之后再make install,然后问题解决…

然后我就在想包管理在哪里,不是有个ports什么的么?就像debian系的apt-get、rh系的yum、arch的pacman && yaourt之类的东西,于是理所当然的输入ports install pkgname,提示cnf…然后Google了一下,然后整个人都惊呆了,也理解了为啥一般的bin都放在/usr/local下面,因为…人家就是全编译安装的啊!就和gentoo一样…难怪安装的时候可以多开。用 @felixonmars 的话来说,就是

太不低碳了!

vim也没有iftop也没有mutt也没有,一大堆用的东西都没有。装呗,慢慢make,不然怎么办…又想反正是全新的环境,干脆shell也换掉好了,传说zsh很强大就换zsh吧!于是照着 这个(日语) 简单整了下,结果发现prompt是乱码,又照着 这个(日语) 改了下,感觉不错。可是…Home End Delete一个能打的都没有!又放狗搜到Arch的wiki链接到archlinux论坛的这个帖子总算可以用了!仔细看看比bash着实漂亮(咦

mutt发不了邮件,不知道怎么回事… 编译mtr忘了去掉x的依赖,结果后来,嗯,opengl都出现了,等了一个小时,然后在gtk2的时候error自动退出了,2333333333

接下来是vim的配置。由于他要写php,于是直接把家里那套龊配置弄上去,发现自动补全的路径补全不能用,DGBPavim的按键绑定有问题,就NerdTree正常点。我现在也懒得看是怎么回事了,睡醒了再接着搞。

既没有/proc又没有/sys,所以htop无解。还好安装的时候就提示要改/etc/fstab。挺亲切哈…
crontab -e进去看了下半点注释都没有,收回刚才那句话……

现在问题list:

  1. mutt不能发邮件
  2. vim的键映射问题
  3. vim自动补全问题

还没有去找bsd的特色(据说很稳定,不过软件少当然稳定了(ry)和zsh的优势(据说补全很NB?)什么的,今天累了就只写这么多。

总体感觉这次bsd之旅:比较坑爹、低效、低碳。

还是我大ubuntu舒服,稳定,简单,软件包管理也不错,打包规则通俗易懂,文档健全资料多,桌面服务器两手抓…总之老少皆宜。