Bash的模式和配置文件加载

有些很基础的东西,一直以来也就没有搞懂,其实,究其原因,还是不求甚解。关于Bash的种种,便是如是。接下来,我来过一点man里面有的东西,经常看man的人,就请自动飘过吧。

Bash是shell的一种,运行中的Bash有两种属性(状态/模式),一种,是否interactive shell(交互式Shell),另一种,是否login shell(登录Shell),然后,运行中的Shell排列组合有这么几种:

  1. 登录交互式Shell
  2. 非登录交互式Shell
  3. 登录非交互式Shell
  4. 非登录非交互式Shell

关于这两种东西的定义也是非常简单明了,但是非常不容易记忆:

交互式Shell:没有非选项参数,没有-c,标准输入和标准输出与终端相连的,或者用-i参数启动的Bash实例。可以通过探测PS1变量是否设置或者$-返回值中是否包含字幕i来判定。

什么是没有非选项参数?比如bash ~/myscript/clear_temp_files.sh这样执行的Shell脚本的Bash实例,就不是交互式Shell,因为脚本的路径,就是非选项参数。

-c又是干什么的?就是使用一个字符串作为Bash的传入参数,比如bash -c ‘ls -ahl’,这种Shell进程也不算是交互式Shell。

登录Shell:第0个参数以-号开头的Bash实例,或者用–login参数启动的Bash Shell。

更加诡异了,什么叫第0个参数以-号开头?你只要随便登录一个*nix系统,Mac也行,Linux也行,然后echo $0,你就明白了,惊讶吧,出来的值竟然是-bash。真的是以-号开头的!!

搞不清楚这两个东西,到底有没有什么决定性的关系呢?事实上是没有太大关系的,又一个事实是我工作四年了,还没搞清楚这点东西。I survived. No big deal. 什么时候出问题了呢?比如当你配置了一个crontab,然后你发现,我擦,为毛总是不执行呢?又然后,为啥环境变量没有呢?一般,crontab里的东西都属于运维脚本,用不着一个小开发去写,所以,你survive的机会师很大的。

好吧,我漏了很重要的一块内容没说。

就是Bash启动的时候,要加载哪些配置文件的问题。搞清楚上面两点,就可以搞清楚Bash的配置文件到底是怎么加载的。对于一个登录Shell(不管是不是交互式的)来说,一般会按照顺序加载如下四个配置文件,如果存在的话。

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

对于一个交互式非登录Shell来说呢?加载的文件又不一样了:

  1. /etc/bash.bashrc
  2. ~/.bashrc

所以,我们就会搞清楚一些事情的原因。比如一个crontab的bash脚本,到底会不会执行如上的配置文件,答案是否定的。一个crontab脚本,没经过处理的话,既不是交互式Shell,也不是登录Shell,所以上面的都不会执行。

怎么处理?比如可以把shabang改一下#!/bin/bash -l让脚本用登录Shell来解释执行,就可以加载/etc/profile或者,调用Bash解释器,加-l参数也可以。看似很简单对吧。

另一个遇到的问题,为什么在Linux,我们总是配置~/.bashrc但是在Mac下,我们配置就没有用呢,要去配置~/.bash_profile才行?哈!什么情况加载~/.bashrc,上面说得很清楚了,交互式非登录Shell,那在Mac下,你打开Term,echo一下$0,看看,前面是不是有个-号?说明这是交互式的登录Shell,当然不会加载~/.bashrc了。实属正常。你肯定要问了,为啥Linux下没问题呢?你打开~/.profile看看就知道了,这货竟然在~/.profile文件里面source了~/.bashrc!啊!谜题都解开了~

模97

一般在开发大型系统的时候,都免不了要分库分表,一种常见的分表方案,就是按照用户的id来进行分库分表。

我们的产品id,是数字,因为传统和一些习俗原因,很多数字对中国人有着特殊含义。比如大家不喜欢4和喜欢8,当然只是个例子。然后我们项目开发就遇到了一些麻烦,就4和8这个例子来说,就会产生这么一个麻烦。如果按照模100分表,那么4号表里是空的,8号表里压力很大。然后,就有了各种办法,比如模256。再比如,md5以后,取后两位。这两种都是分了256个表了。

结果有一天,我看到一个系统,分表方案是模97。我就觉得这个数字很蹊跷,问了下开发。这个97很完美地解决了4和8那个案例。原来,这个97是个素数。我有一种当头一棒的感觉,原来如此啊……

[Linode]VPS服务器的安全问题

因为放在VPS上的博客一直Nginx 502和500,我去看了一下access.log,不看不要紧,一看下一跳。我的博客是个没多少访问量的博客,竟然每秒也能产生数十条的log,而最糟糕的是,这些log,都指向了同一个文件,xmlrpc.php。

这个xmlrpc.php,其实是WordPress博客提供的一种API接口,如果你使用Live Writer或者MarsEdit这类软件,这个xmlrpc.php就是必不可少的一个东西了。其实就是使用xml文件描述的,远程方法调用。频繁地访问这个API,非奸即盗啊!试密码,或者发垃圾评论,或者发垃圾文章,太糟糕了。虽然这么久了,没有被攻破,但是看着总归不爽。

一般方法是将访问的IP都找出来,然后全部iptables禁用掉。如果你不用客户端,直接把xmlrpc禁用掉好了,省得让贼惦记着。

  1. grep "POST /xmlrpc.php" access.log* | awk '{print $1}' | sort | uniq -c | sort -nr

上述命令,用倒序列出所有攻击得IP和攻击次数,对于攻击最多的,直接iptables就好。

然后,以前ishow也谈过的,ssh试密码的问题,可以对auth.log搜索一下“Failed password”这个关键词。我看了,我自己的,是没有的。又看了管理的两台朋友的服务器,都有10万这个量级的攻击次数。我大体想了想,可能因为我一开始习惯性更换了sshd的端口,导致攻击者找不到目标了的关系。所以这个问题,我建议直接更换sshd的端口,很方便。

[HowTo]怎样判定一个字符串是一个合法正则表达式?

http://stackoverflow.com/questions/172303/is-there-a-regular-expression-to-detect-a-valid-regular-expression

由此衍生的一个问题,是不是可以写一个正则表达式,来判定一个字符串是不是正则表达式。

答案是否定的:

http://stackoverflow.com/questions/2789407/regular-expression-for-regular-expressions

Page 1 of 2912345678910...20...Last »

无觅相关文章插件,快速提升流量