使用git-shell来限制用户ssh登陆

虽然git是分布式的版本管理系统,但对于团队项目开发,通常还是会在单独的服务器上创建一个git server。类似于svn,git server也有好几种配置方式。详情,可以参见git的文档http://git-scm.com/book/en/v2。这里,主要是从上述文档中摘出一部分,说明一下git-shell的用处。

假如,大家都使用ssh的方式来访问:

$ git clone git@10.3.0.99:project.git

这就意味者,访问者具有权限可以ssh登陆到服务器上:

$ ssh git@10.3.0.99

出于安全的考虑,我们最好限制用户只能进行git push/pull,但无法登陆。这可以使用git-shell来完成。

查看一下git-shell的位置:

$ which git-shell
/usr/bin/git-shell

将git-shell的路径添加到/etc/shells文件中,然后修改git用户的shell:

$ sudo chsh git

设置为/usr/bin/git-shell。这样,如果再使用ssh方式登陆,则会报错:

$ ssh git@10.3.0.99
git@10.3.0.99's password: 
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-35-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to 10.3.0.99 closed.

小技巧:追溯历史开发信息

在gcc中,如果想查看以往的代码变动信息,可以查看相应源码目录下的ChangeLog文件。ChangeLog有很好的格式要求和内容规范,并且也要经过review。这虽然对于Patch提交者来来说显得有些繁琐,但当你需要查看历史开发信息的时候,就充分感受到了它的重要性了。

在LLVM中,没有ChangeLog文件,LLVM的开发者认为查看svn log就足够了。但是,日志信息的格式和内容比较随意,而且,一般还需要手动导出到文件中进行查看。使用svn命令时,建议使用svn log -v命令,这个-v选项,可以打印出相关的文件变动信息,可以帮助你更好的追溯代码变动情况。

一键编译安装gcc

今天看到一篇文章,作者通过一个shell脚本和一个Makefile,可以自动下载需要的所有安装包并且编译gcc

$ # Download the scripts using wget.
$ mkdir /opt/gcc-4.9.2
$ cd /opt/gcc-4.9.2
$ wget http://projects.joelinoff.com/gcc-4.9.2/bld.sh
$ wget http://projects.joelinoff.com/gcc-4.9.2/Makefile
$ chmod a+x bld.sh
$ make
[output snipped]
$ # The compiler is installed in /opt/gcc-4.9.2/rtf/bin

我试了一下,果然很方便。只要有一台可以联网的机器就可以了。感兴趣的朋友可以试一试。

P.S.:
(1)编译libiconv时可能会有“'gets' undeclared here“错误,请参考这篇文章
(2)如果机器是64位的,但是缺少32位的库文件。这样在编译gcc时会出现错误:“configure: error: I suspect your system does not have 32-bit developement libraries (libc and headers). If you have them, rerun configure with –enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with –disable-multilib.”。提示需要配置“--disable-multilib”。

如何卸载gdb?

前几天安装最新的gdb过程中出了点问题,想卸载一下。结果执行“make uninstall”命令后,出现下面的结果:

bash-3.2# make uninstall
the uninstall target is not supported in this tree

看起来,gdb不支持直接用“make uninstall”命令卸载,那么如何卸载它呢?我在gdb mailing list里问了一下,收到了Doug Evans回信

Yikes.

A clumsy workaround is to cd into each subdir in the build tree and do
make uninstall there.

只能是进入每个子目录,分别执行“make uninstall”命令了。

后来,他又在一封单独的信中提到,他已经提交了bug,看看会不会有人做一下改进了。

在Solaris上使用LD_OPTIONS环境变量诊断编译链接问题

最近在Solaris上编译一款开源软件,在最后链接阶段出了问题,导致ld程序core dump。由于没有ld程序源代码,导致完全没思路,没办法,只好在stackoverflow上求教:http://stackoverflow.com/questions/26009192/why-the-ld-crash-in-building-libgd。从回复中我才知道可以通过设置LD_OPTIONS环境变量,来了解整个链接过程。举个例子:

LD_OPTIONS=-Dfiles,detail

指定files会输出ld当前处理的文件,detail会提供更多的信息。

可以用“ld -Dhelp”命令打印每个选项的详细帮助信息。

如果想详细了解Solaris下程序的链接过程,可以参考这篇文档:Linker and Libraries Guide