标签: linux

监控磁盘读写状况

有时候,我们经常会碰到这样的情形:没有运行任何程序,磁盘却不断执行读写动作,硬盘指示灯常亮,各种操作迟缓甚至鼠标都不能动了。碰到这种状况往往会感到束手无策,并且就纳闷了:究竟是什么程序在读写我的磁盘呢?

这个时候,就到iotop登场的时候了!

屏蔽SSH的暴力穷举破解

最近经常碰到服务器被那些蛋疼得没治的人进行SSH暴力穷举破解,实在是让人讨厌。只好想办法来阻止了。主要有两种方法:

1、 使用SSH本身的配置文件来阻止,在/etc/ssh/sshd_conf文件里加入:

LoginGraceTime 2m
MaxAuthTries 6

这个意思大概就是在2分钟内只可以进行6次登录的尝试。

2、 还有就是使用denyhosts这个软件。它可以分析SSH的日志文件,如果登录认证连续错了指定的次数,就把该IP列入到deny hosts里面。

Linux下Mp3乱码问题的处理

在Linux下播放mp3的时候,经常碰到mp3的信息显示为乱码的问题。这是因为我们能找到的mp3文件标签大部分都是以GBK/GB18030编码的,而绝大多数的Linux(包括Linux系的手机系统)默认的编码是utf8,两者编码不同就会导致乱码问题的出现。

一个很好的解决方法就是安装Mutagen这个软件,用它来把mp3标签的编码统一转换为utf8。在Gentoo下可以通过以下命令安装:

emerge -av mutagen

装完后就可以通过以下命令来把目录下的所有mp3文件批量转换了:

cd /mnt/sda5/music   #转到音乐文件目录
find . -iname "*.mp3" -execdir mid3iconv -e gbk --remove-v1 {} \;
  • -e gbk 参数是代表把 GBK 编码的标签转换为 Unicode 编码,本身是 Unicode 编码的就不转换。如果需要转换其他编码的文件可以自行修改,如改为 Big5。
  • 不过它会同时用 Unicode 编码填满 D3v1, ID3v2, APEv2 标签,但是 ID3v1 又不支持中文的 Unicode 编码,所以转换后的 ID3v1 标签全是问号。所以最好加上 –remove-v1 参数,转换后删除 ID3v1 标签。

Gentoo下Java程序中文显示为方框的处理

最近在捣鼓Pre的时候碰到了一个问题:在我的Gentoo下,java程序的中文都显示为方框,如下图:
java程序中文显示错误图片"

最后,在网上找到了解决方法:在/etc/java-config-2/current-system-vm/jre/lib下面建立目录fonts/fallback

mkdir -p  /etc/java-config-2/current-system-vm/jre/lib/fonts/fallback

然后在这个文件夹里创建一个中文字体的链接:

ln -s /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc  /etc/java-config-2/current-system-vm/jre/lib/fonts/fallback/

这样java程序就可以正常的显示中文了。
java程序中文显示正常图片

一些常用的iptables规则

最近折腾几个ubuntu和centos的服务器,接触了一些基本的iptable的规则,记录下来以备不时需。

iptables的基本语法格式是:

iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配后的动作]

具体的参数可以参照帮助文档,下面是几个常用的例子:

让远程的计算机可以ssh连接到当前计算机(打开22端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

让远程的计算机可以使用当前计算机提供的FTP服务(打开20、21端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20:21 -j ACCEPT

让远程的计算机可以使用当前计算机提供的网页服务(打开80、433端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

让远程的计算机可以使用当前计算机提供的数据库服务(打开3306端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

Git从使用非默认SSH端口的远程仓库上克隆

这篇文章只是记录以防以后忘记。

假设,有台机子的SSH端口设置为3022(SSH默认的端口为22,不过为了安全,很多人都自己定义另外的端口)且有一个Git仓库,现在要把这个仓库克隆到本地,则可以用到以下命令:

git clone ssh://user@domain.com:3022/~/Projects/my_project

Gentoo Rails3.1 安装笔记

Rails3.1的预览版已经出来了,带来了Sass和CoffeeScript这两个另人向往的新特性,因此打算在我的Gentoo上也安装来体验一下。

rvm use 1.9.2@railspre --create
gem update --system
gem update rake
gem install rails -v ">=3.1.0rc"

Rails3.1 需要Ruby >=1.9.2、Gem >=1.8.5、Rake >=0.9.1,所以在安装Rails3.1之前要先检查一下这几个条件是否已经达到。另外,现在网上看到的很多文章都说安装Rails3.1只需要:

gem install rails --pre

但这个方法从6月1日起就不行了,所以现在要改用:

gem install rails -v ">=3.1.0rc"

当使用rvm转到Ruby1.9.2的时候,会有一个问题:

gem -v
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- auto_gem (LoadError)
	from <internal:lib/rubygems/custom_require>:29:in `require'

这是因为gem还在使用系统的库文件,而系统里的Ruby版本还是1.8.*版的,所以就会有这个问题,解决的方法就是执行:

unset RUBYOPT

另外,使用Rails3.1的时候出现下面的错误:

ExecJS::RuntimeError
Could not find a JavaScript runtime</pre></p>
ExecJS::RuntimeError

这是因为系统里没有JS的运行环境,只要手动安装一个就可以了:

emerge nodejs

GNOME下MPC的notify脚本

前两天终于让GNOME3稳定的运行在我的本本上了,觉得它的notify机制很不错,就写了一个小脚本,当我使用快捷键切换mpc的播放状态时,通过notify来显示当前的播放状态和歌曲名。

#!/bin/bash
#
# nmpc 可以把mpc当前播放的歌曲标题通过notify形式显示出来的脚本
#
# Script by: Dachao Nong <ohosanna@gmail.com>

TIMEOUT=5000
ICONPATH='/usr/share/icons/Faenza'
PLAYINGICON=$ICONPATH/actions/32/audio-cd-new.png
PAUSEDICON=$ICONPATH/actions/32/gtk-media-pause.png
STOPEDICON=$ICONPATH/actions/32/gtk-media-stop.png
ERRORICON=$ICONPATH/status/32/error.png

err() {
   echo "$1"
   exit 1
}

usage() {
  echo "usage: nmpc [command]"
  echo
  echo "Commands:"
  echo "     play - Starts playing song."
  echo "     next - Starts playing next song on playlist"
  echo "     prev - Starts playing previous song."
  echo "     stop - Stops playing."
  echo "     toggle - Toggles between play and pause. If stopped starts  playing."
  echo "     -h, --help     - display this"
  exit
}

nmpc_play () {
  mpc play > /dev/null 2>&1
  MSGTITLE="MPC Playing: "
  MSGBODY="`mpc | sed -n '1p'`"
  MSGICON=$PLAYINGICON
}

nmpc_next () {
  mpc next > /dev/null 2>&1
  MSGTITLE="MPC Playing: "
  MSGBODY="`mpc | sed -n '1p'`"
  MSGICON=$PLAYINGICON
}

nmpc_prev () {
  mpc prev > /dev/null 2>&1
  MSGTITLE="MPC Playing: "
  MSGBODY="`mpc | sed -n '1p'`"
  MSGICON=$PLAYINGICON
}

nmpc_stop() {
  mpc stop > /dev/null 2>&1
  MSGTITLE="MPC Stoped!"
  MSGBODY=""
  MSGICON=$STOPEDICON
}

nmpc_toggle() {
  mpc toggle > /dev/null 2>&1
  if [ "`mpc | grep playing`" = "" ]; then
    MSGTITLE="MPC Paused!"
    MSGICON=$PAUSEDICON
  else
    MSGTITLE="MPC Playing: "
    MSGICON=$PLAYINGICON
  fi
  MSGBODY="`mpc | sed -n '1p'`"
}

if [ "`ps -A | grep mpd`" = "" ]; then
  notify-send -t $TIMEOUT -i $ERRORICON -h int:transient:1 "Error" "Oooop!! Mpd not running!"
  exit 1
else
  if [ "`mpc | grep -o playing`" = "" ] && [ "`mpc | grep -o paused`" = "" ]; then
    mpc play > /dev/null 2>&1
  else
    case "$1" in
      'play')
	nmpc_play
      ;;
      'next')
	nmpc_next
      ;;
      'prev')
	nmpc_prev
      ;;
      'stop')
	nmpc_stop
      ;;
      'toggle')
	nmpc_toggle
      ;;
      *)
	usage
	exit 1
      ;;
    esac
    notify-send -t $TIMEOUT -i $MSGICON -h int:transient:1 "$MSGTITLE" "$MSGBODY"
  fi
fi

把上面的代码复制到$PATH目录下,就可以使用nmpc next | nmpc prev | nmpc play | nmpc toggle来控制MPC的播放了,可以把相应的命令绑定到快捷键上,很方便!

效果图
MPC notify by hosanna_cn, on Flickr

TODO:
现在这个脚本需要手动执行才会显示notify,下一步是打算让它在歌曲切换的时候自动把歌曲名显示,要实现这个可能用python|ruby|perl会容易一点。

Gentoo下ROR rails/cli (LoadError)的解决

想学习一下Ruby On Rail,结果安装完之后运行rails new demo新建新项目的时候出现以下错误:

/usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- rails/cli (LoadError)
from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from /usr/lib64/ruby/gems/1.8/gems/rails-3.0.3/bin/rails:8
from /usr/bin/rails:8:in `load'
from /usr/bin/rails:8

最后是通过

emerge -avD =dev-ruby/rack-mount-0.6.13 =dev-ruby/erubis-2.6.6 

把两个包降级后暂时解决这个问题,是新包有问题还是有其它的解决方法?