利用autossh和中间主机为内网主机建立稳定ssh 连接

通常会遇到一些内网主机没有独立IP 地址,隐藏在NAT 之后,用户无法直接建立ssh 连接。

这时候就需要一个中间人机器(具有独立IP)做为跳板,内网机器反向连接至中间机器。用户登陆时,首先连接至中间机器,再反向连接至内网主机。

其步骤如下:

  1. 在内网主机,运行 ssh -R 7777:localhost:22 qing@middleman
  2. 在中间主机,运行 ssh -p 7777 user@localhost

注意:步骤2的user 是内网主机user。

ssh -R 参数中7777 是远端映射的端口,连接该端口将建立起和内网22 号端口的链接;下面是man ssh 中关于-R 选项的说明

-R [bind_address:]port:host:hostport

-R [bind_address:]port:local_socket

-R remote_socket:host:hostport

-R remote_socket:local_socket

-R [bind_address:]port

Specifies that connections to the given TCP port or Unix socket on the remote (server) host are to be forwarded to the local side.

This works by allocating a socket to listen to either a TCP port or to a Unix socket on the remote side. Whenever a connection is made to this port or Unix socket, the connection is forwarded over the secure channel, and a connection is made from the local machine to either an explicit destination specified by host port hostport, or local_socket, or, if no explicit destination was specified, ssh will act as a SOCKS 4/5 proxy and forward connections to the destinations requested by the remote SOCKS client. Port forwardings can also be specified in the configuration file. Privileged ports can be forwarded only when logging in as root on the remote machine. IPv6 ad‐ dresses can be specified by enclosing the address in square brackets.

By default, TCP listening sockets on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config(5)).

If the port argument is ‘0’, the listen port will be dynamically allocated on the server and reported to the client at run time. When used together with -O forward the allocated port will be printed to the standard output.

但这样存在两个问题:1)ssh 连接超过固定时间会自动释放;2)每次连接中间机器都需要用户手动输入密码。

第一个问题通过autossh 解决

autossh 通过将ssh 命令包裹至一个循环中,并在ssh 命令断开时自动建立连接,这样就保证了即使内网机器无法访问,也会自动建立和中间主机的逆向连接。autossh 命令格式如下

autossh [autossh options] [ssh options]

即autossh 除了自身参数,其他参数直接用ssh 的即可。

第二个问题通过公钥免密码登录解决:1)内网主机执行ssh-keygen;2)ssh-copy-id -i ~/.ssh/id_rsa.pub user@middleman_machine

结合起autossh 和免密码登录,autossh 命令如下:

autossh -o "PasswordAuthentication=no" -o "PubkeyAuthentication=yes" -i ~/.ssh/id_rsa -R 7777:localhost:22 user@middleman

将该命令添加至开机启动模块中实现开机启动。

Valgrind Tutorial

Valgrind 是用于调试程序的工具套件,其中最有名的工具是Memcheck,它能够检测出C/C++ 中因为内存错误导致程序中断的问题。

一、引言

使用Valgrind 有两个必要条件:一安装了Valgrind;二需要在编译程序参数中加上 -g 选项;尽量不要使用  -O2 或者更高级别的代码优化,这样会导致Memcheck 误报未初始化的参数(uninitialised-value errors )。 调试方法非常简单,如果你的程序如下执行:

MyProg arg1 arg2 ...

那么这样使用如下命令:

valgrind --leak-check=yes MyProg arg1 arg2 ...

Memcheck 是默认工具(也可以用 –tool=memcheck 指定工具),–leak-check 选项打开了内存泄露检查工具。

继续阅读

Linux 下使用Doxygen

Doxygen 是支持多种语言的文档生成工具。也许在编码前能把设计文档写好,再来编写代码是正确的一件事情,当由于中间编码过程中任务的修改或者代码的优化等原因,会导致开始所写的文档变动非常大,于是在编码前写好文档对于大多数程序员是不太现实的。而在代码写完之后再补上相应的文档则是一件非常常见的做法。Doxygen 就能很好的帮你做好这件事件,在你的代码按照Doxygen 的格式写好注释后,几分钟Doxygen 就能够很快地为你生成文档。最近要使用Doxygen 也是因为代码变多后,之前写的函数往往名字都不记得了,如果能有一份文档查询相应的函数会非常方便。(值得一提的是Hadoop 支持了Doxygen 文档的生成)

继续阅读

如何定制自己的color scheme

在vim 配置文件vimrc 中通过colorscheme 命令可以选择自己喜欢的配色方案,在vim 下输入

:colorscheme torte

既可以选择系统自带torte 配色方案,当然你也可以在vim.org 下载自己喜欢的配色方案,在debian 中用户的配色方案放置在/usr/share/vim/vim72/colors/ 目录下。每个配色方案都是一个单独的vim 文件,比如很多vim 用户喜欢用的desert.vim ,但我觉得这样的配色太花哨了,torte 更适合我。所以如果想定制自己的vim 颜色方案可以看看下面的内容。

继续阅读

信息论基础

信息论是应用数学,电子信息工程和计算机科学相关信息量的一个分支。信息论最早是由香农同学发展起来的,他提出了信号处理操作如数据压缩和可靠地存储、传输数据的基本限制。现已推广并发展到多个领域:自然语言处理(NLP)、加密、包含通信网络更大范围的网络,如神经网,还有量子计算、其他形式的数据分析等等。

衡量信息的一个重要工具是熵(或者称为信息量,为统一起见,下文将全部用熵代替),它用来表示在信息中存储或通信一个符号需要的平均比特长度。熵量化了预测一个随机变量的值的不确定性。比如,说出一次投币过程的结果(两个等概率可能出现的结果)比说出一次掷骰子的结果(六个等概率可能出现的结果)的信息量要少。

应用到信息论基础涉及但不局限于以下方面:无损压缩、有损压缩和信号编码等。

继续阅读

磁盘测速

一、写在测试之前的

程序测试磁盘速度应该考虑到几点:

  1. 首先是内存的存在。内存作为读写的缓冲区,写入一个文件到磁盘时fflush() 会将写入数据从用户态转为核态,只有核态命令fsync() 才能够将数据真正的刷新的硬盘。内存作为缓存在读时可能影响更大。
  2. 其次是磁盘缓存,磁盘缓存是非易失性的,速度接近于内存,但容量一般在16MB~64MB 之间。会对写入速度的测试有较大影响。比如对于64MB 缓存硬盘,只写入一个小于64MB 文件后计算速度会非常大。
  3. 不同磁道上扇区密度不同。如下左图是比较旧磁盘采用的磁道上扇区分法,这样的在同样一圈磁道上扇区数相同,内外径不同磁道上磁头旋转一圈读取的数据量相同,缺点就在于外径扇区没有充分利用较大的磁道。而右边采用的近似等线密度的扇区分区,外径上磁道比内径上磁道具有更多的扇区,也就是说磁头在外径磁道上旋转一周的时间会读取更多的数据,这点在后面的实验中也有证实。
  4. 还有一个需要考虑到得是文件系统的影响,文件系统决定了文件的放置,很大程度上决定了测试的读写性能,比如Linux ext 文件系统就和windows 的文件系统不同(因为不需要碎片整理了)。在下面大部分测试中都使用的是打开文件、写文件、关闭文件,然后对同一个文件重复同样流程。

  1  2

继续阅读