分类: 'CLI软件' 的归档
ssh反向连接
先介绍一下我这里的情况: 公司的电脑是在内部网里面,不可能有公网地址;家里的电脑是adsl拨号,有动态的公网IP,动态绑定到域名 xxx.xxx.org
如果现在想从家里ssh到公司的电脑,直接连接肯定是不行的,不过可以用以下方法:
1. 在公司电脑上执行: ssh -f -N -R 12121:localhost:22 xxx@xxx.xxx.org
2. 然后在家里的电脑上执行: ssh xxxx@localhost -p 12121 就可以成功连上公司的电脑了.
上面命令里面的 12121 是任一个本地端口(上面例子里面是家里电脑的端口),可以在合理的范围内任意指定.我的理解是这样的: 前一个命令相当于把公司机器的22端口(localhost:22) 映射到 家里机器的12121端口. 然后在家里电脑上直接ssh 本机的 12121 端口,数据就会被转发到公司机器了.就这么简单.
参考此文和 man ssh
刚又学了一招
以前一直用locate查找文件,也没想过它的工作原理,知道我那恢复过的gentoo系统里面出现了这种状况:
locate xxx
locate: warning: database /var/lib/slocate/slocate.db’ is more than 8 days old
什么都查找不了,google了一下,发现需要updatedb一下,嘿嘿,原来这个也有数据库的啊…以前见过updatedb这个进程,还在纳闷是什么进程呢,呵呵.
cksfv 另一个常用的校验工具
说到校验,很多人都会想起 md5sum ,因为ubuntu各版本的光盘都用这个校验的嘛~而且各个发行版里面也都会预装这个小工具.但是这并不是唯一的(废话),今天介绍另一个: cksfv
发现这个是在从 TLF 下载的电影里面,TLF的电影都是用rar分卷压缩的,除了 xxx.rar,xxx.r00,xxx.r01….之外,通常还有个 xxx.sfv 文件.这就是用于check的.
ubuntu用户使用 cksfv 得先安装: apt-get install cksfv 即可.看看包里面的描述:
描述: sfv checker and generator
SFV, Simple File Verification, uses crc32 checksums to verify that files are intact. cksfv automates the task of generating
and checking .sfv sheets. For integrity, md5 checksums are probably a better alternative, but sfv is a widely used method for
verification on the USENET binary newsgroups and other places.
从中可知sfv用的是 CRC32 算法,这种算法产生的sum是32位的,虽然没有md5那么严谨,但是有个好处,就是计算速度比md5快多了.因此,在数据量很大又不是非常重要的场合,就很适用了,比如电影文件.估计这也是很多电影发布小组才有cksfv校验的原因吧.
NTP 网络时钟同步
先看看这个NTP简介.
再看NTP服务器列表,我们一般使用 time.buptnet.edu.cn 北京邮电大学NTP一级服务器 (支持 IPv4 + IPv6)就可以了,延时相对较小.
在ubuntu下使用NTP的方法:
显示和时间服务器的时间差:
$ ntpdate -q time.buptnet.edu.cn
server 195.30.0.29, stratum 2, offset -3.667538, delay 0.49940
20 Dec 13:10:58 ntpdate[7950]: step time server 195.30.0.29 offset -3.667538 sec
说明本地时间比服务器快3秒多点.
直接同步本地时间:
$ sudo ntpdate time.buptnet.edu.cn
也可以直接把上述命令写进root用户的crontab,很方便吧~
aptitude forbid-version
接着昨天的libcairo2问题,小土蛋(其实我至今还没搞清楚zhan为什么叫小土蛋…)留言说可以用什么 aptitude forbid-version ,嘿嘿,于是呼研究了下,发现forbid-version不是zhan想的那样,但是aptitude还是蛮好用的.
降级,如果用 aptitude 命令的话,可以这么做:
- sudo aptitude install libcairo2=1.4.10-1ubuntu4
然后可以用 forbid-version 把有问题的版本锁定:
- sudo aptitude forbid-version libcairo2=1.4.10-1ubuntu4.1
这样以后用 sudo aptitude upgrade 命令升级的时候,就不会升级到 1.4.10-1ubuntu4.1 版本了,但是如果以后又出了个 1.4.10-1ubuntu4.2 的话,还是会升级的,这就是和 hold 的区别,也是这个命令存在的意义所在.嘿嘿.
当然如果用是 sudo apt-get upgrade 升级的话,会照升不误,看来apt-get不买你aptitude的帐啊~哈哈.
Shell脚本转化成二进制文件
工具名称: shc
安装方法: sudo apt-get install shc
使用方法: shc -f xx.sh ,就会生成一个 xx.sh.x 的二进制可执行文件,执行这个可执行文件的效果和执行原shell脚本的效果一样,另外还会生成一个 xx.sh.x.c 的C源文件,自己编译这个源文件成二进制文件也是可以的.
另外这个工具好像还可以设置过期时间,到了这个预设的时间后,再执行二进制文件的话,就会输出一行已过期的信息(当然这个信息也可以自定义),不过我想这个功能一般用不着吧 :)
mo文件的打开方法(在Linux下开发多语言软件必备知识)
在这里遇到一个ccsm的翻译bug,本想打开/usr/share/locale/zh_CN/LC_MESSAGES/ccsm.mo 看看原文是什么,然后提交个bug的,没想到那个”翻转的快照”居然没在这个里面,呵呵,倒是让我学会了 mo 和 po 文件的互转方法.
po 文件转成 mo 文件
|
1 |
msgfmt zh_CN.po -o zh_CN.mo |
mo 文件转成 po 文件
|
1 |
msgunfmt zh_CN.mo -o zh_CN.po |
参见: http://www.51umo.com/Linux/LinuxCode/20070823/38008.shtml
新的百度mp3下载脚本
老版本在这里,由于百度改了代码,不能下载了,所以修改了下脚本.
由于这里不能传附件,只能帖上代码了…
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
#!/bin/bash #Copyright (c) 2006 bones7456 (bones7456@gmail.com) #License: GPLv2 #非常感谢ubuntu社区和oneleaf老兄 #强烈建议安装axel(多线程下载工具)和mid3v2(包含在python-mutagen里,用于修改歌曲的id3信息)#mp3的地址 SOURCE="http://list.mp3.baidu.com/list/newhits.html" #SOURCE="http://list.mp3.baidu.com/topso/mp3topsong.html" 改成这个地址可以下载歌曲top500 #保存mp3的目录 SAVE="${HOME}/baidump3" #下载重试次数 TRYCOUNT=2 #用axel下载时的线程数 AXELNUM=7 #临时目录 TMP="/tmp/baidump3-${USER}" #是否需要暂停 PAUSE=0 if [ x`which axel` = x"" ];then PAUSE=1 cat << EOF 您的系统中没有安装axel多线程下载工具,这将导致只能使用wget进行单线程下载,将会影响下载速度。 如果是ubuntu用户,可以直接使用 sudo apt-get install axel 进行安装,其他系统请访问axel主页:http://wilmer.gaast.net/main.php/axel.html 进行下载、安装。 EOF fi if [ x`which mid3v2` = x"" ];then PAUSE=1 cat << EOF 您的系统中没有安装mid3v2工具,使用该工具可以修改mp3歌曲的标签信息(如歌手、歌名等),并去掉可能包含于其中的广告信息。 如果是ubuntu用户,可以直接使用 sudo apt-get install python-mutagen 进行安装,其他系统请访问其主页:http://www.sacredchao.net/quodlibet/wiki/Development/Mutagen 进行下载、安装。 EOF fi if [ "$PAUSE" = 1 ];then echo "是否继续(y|n)?" read KEYVAR case "$KEYVAR" in "Y" | "y" ) echo 略过。 ;; * ) exit 0 ;; esac fi #创建下载目录 if [ ! -d "${SAVE}" ];then mkdir -p "${SAVE}" fi #创建临时下载目录 if [ -d "${TMP}" ];then rm -rf "${TMP}" fi mkdir -p "${TMP}" echo "开始下载百度最新100首歌曲列表" wget -O ${TMP}/mp3.html ${SOURCE} echo "下载百度最新100首歌曲列表完成。" #转换网页编码 iconv -f gbk -t utf8 ${TMP}/mp3.html |\ grep " href=\"http://mp3.baidu.com/m" |\ #将mp3list.txt所有开头的空格去掉 sed -e 's/ *//' |\ #将mp3list.txt所有开头的tab去掉 sed -e 's/\t*//' |\ #将mp3list.txt所有全角空格去掉 sed -e 's/ //g' |\ #将所有的回车符去掉 sed ':a;N;$!ba;s/\n/,/g' |\ #在td>,后面加上回车符,一行表示一个mp3文件。 sed -e 's/,<td/\n&<td/g' |\ sed -e 's/td>,/td>\n/g' |\ #删除<td width="30%"> <td> </td> <td...FFFFFF"> <p> </p> sed -e 's/<td width="30%">//g' |\ sed -e 's/<td>//g' |\ sed -e 's/<\/td>//g' |\ sed -e 's/<p>//g' |\ sed -e 's/<\/p>//g' |\ sed -e 's/<td.*"border">//g' |\ #删除</a>..."_blank"> sed -e 's/<\/A>\/<A.*_blank>/、/g' |\ sed -e 's/<\/A>/<\/a>/g' |\ sed -e 's/<\/a>.*_blank>/-/g' |\ #sed -e 's/<\/a>.*_blank">/-/g' |\ #删除) sed -e 's/<\/a>)/<\/a>/g' |\ #删除& sed -e 's/\&\;/\//g' >${TMP}/mp3list.txt #得到:<a href="http://mp3.baidu.com/m?tn=baidump3&ct=134217728&lm=-1&li=2&word=Baby%20Baby%20tell%20me%20%CD%F5%D0%C4%C1%E8" target="_blank">Baby ,Baby tell me-王心凌</a> #取得行号,循环 line=$(awk 'END{print NR}' ${TMP}/mp3list.txt) i=1; while((i<=line));do downed=0; mpline=`awk 'NR=='"$i"'' ${TMP}/mp3list.txt` url=`echo $mpline | sed -e 's/<a href="//g' | sed 's/\ target.*//g' | sed 's/"//g' | cat` name=`echo $mpline | sed -e 's/.*_blank">//g' | sed -e 's/.*_blank>//g' | sed -e 's/<\/b>//g' |sed -e 's/<b>//g' |\ sed -e 's/<\/a>//g' | sed -e 's/\//-/g' | sed -e 's/:/-/g' | sed -e 's/"/'\''/g' | cat` title=`echo $name | sed -e 's/-.*//g'` #检查是否已经下载过这首歌,如果下载过,放弃 if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ]; then echo -e "\e[1;6m\e[1;31m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m" ((i++)) continue; fi echo "开始通过 $url 下载 $name"; wget -O ${TMP}/down.html $url echo "获取 $name 下载列表完成。"; #down.txt为有效的下载地址 iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "onclick=\"return ow(event,this)\"" |\ sed -e 's/.*<a href="//g' | sed -e 's/" target="_blank".*//g' > ${TMP}/down.txt #size.txt为有效的下载文件大小 iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M<\/td>" |\ sed -e 's/<td>//g' | sed -e 's/ M<\/td>//g' > ${TMP}/size.txt #down.txt与size.txt合并而在的down_size.txt文件中字段之间以"`"作为分隔符 paste -d '`' ${TMP}/size.txt ${TMP}/down.txt > ${TMP}/down_size.txt #排序 sort -n -r ${TMP}/down_size.txt > ${TMP}/down_size_sort.txt #去掉后面的尺寸 sed 's/.*`//' ${TMP}/down_size_sort.txt > ${TMP}/temp.txt ##### 析取出mp3 的下载地址或 wma的下载地址 ############## grep -i "word=mp3" ${TMP}/temp.txt | grep "$title" > ${TMP}/down_mp3.txt grep -i "word=wma" ${TMP}/temp.txt | grep "$title" > ${TMP}/down_wma.txt downline_mp3=$(awk 'END{print NR}' ${TMP}/down_mp3.txt); downline_wma=$(awk 'END{print NR}' ${TMP}/down_wma.txt); echo -e "\e[1;6m\e[1;31m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。\e[1;6m\e[00m" echo -e "\e[1;6m\e[1;31m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。\e[1;6m\e[00m" # 初始化计数器 j=1; # 优先下载mp3格式的歌曲 while((j<=downline_mp3)); do mp3=`awk 'NR=='"$j"'' ${TMP}/down_mp3.txt | sed -e 's/ /\\ /g'` echo -e "\e[1;6m\e[1;31m正在下载${name}.mp3\e[1;6m\e[00m" #echo -e "\e[1;6m\e[1;31m中转页面地址为${mp3}\e[1;6m\e[00m" wget -O "${TMP}/transit.html" "$mp3" realURL=`iconv -f gbk -t utf8 -c ${TMP}/transit.html | grep "<li class=\"li\" style=\"margin-right:10px;\">" | sed 's/.*href="//' | sed 's/" target="_blank">.*//'` #echo -e "\e[1;6m\e[1;31m真实下载地址为${realURL}\e[1;6m\e[00m" if [ x`which axel` != x"" ];then axel -n $AXELNUM -a -o "${TMP}/${name}.mp3" "${realURL}" else #wget太慢了。但是如果没有安装axel,可以把上面一行注释掉,用下面一行代替 wget -c --tries=$TRYCOUNT $realURL -O "${TMP}/${name}.mp3" fi if [ "$?" = 0 ]; then if [ `file -ib "${TMP}/${name}.mp3" | sed -e 's/\/.*//g'` = "audio" ]; then if [ x`which mid3v2` != x"" ];then title=`echo $name | sed -e 's/-.*//g'` artist=`echo $name | sed -e 's/.*-//g' | sed -e 's/.mp3//g' | sed -e 's/.wma//g'` mid3v2 -D "${TMP}/${name}.mp3" mid3v2 -t "${title}" -a "${artist}" "${TMP}/${name}.mp3" fi mv "${TMP}/${name}.mp3" "${SAVE}/${name}.mp3" downed=1; break; else echo -e "\e[1;6m\e[1;31m下载 ${name}.mp3 文件无效,正在删除重新下载\e[1;6m\e[00m" rm "${TMP}/${name}.mp3"; ((j++)) fi else echo -e "\e[1;6m\e[1;31m下载 ${name}.mp3 文件无效,正在删除重新下载\e[1;6m\e[00m" rm "${TMP}/${name}.mp3"; ((j++)) fi done #如果下载成功继续下其余的歌 #continue用于跳过循环体中的后续命令 if [ "$downed" = 1 ] ; then ((i++)) echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m" continue; fi # 如果没有mp3格式的则下载wma格式的歌 j=1; while((j<=downline_wma)); do wma=`awk 'NR=='"$j"'' ${TMP}/down_wma.txt` echo -e "\e[1;6m\e[1;31m正在下载${name}.wma\e[1;6m\e[00m" #echo -e "\e[1;6m\e[1;31m中转页面地址为${mp3}\e[1;6m\e[00m" wget -O "${TMP}/transit.html" "$wma" realURL=`iconv -f gbk -t utf8 -c ${TMP}/transit.html | grep "<li class=\"li\" style=\"margin-right:10px;\">" | sed 's/.*href="//' | sed 's/" target="_blank">.*//'` #echo -e "\e[1;6m\e[1;31m真实下载地址为${realURL}\e[1;6m\e[00m" if [ x`which axel` != x"" ];then axel -n $AXELNUM -a -o "${TMP}/${name}.wma" "${realURL}" else #wget太慢了。但是如果没有安装axel,可以把上面一行注释掉,用下面一行代替 wget -c --tries=$TRYCOUNT $realURL -O "${TMP}/${name}.wma" fi if [ "$?" = 0 ]; then if [ `file -ib "${TMP}/${name}.wma" | sed -e 's/\/.*//g'` = "application" ]; then #title=`echo $name | sed -e 's/-.*//g'` #artist=`echo $name | sed -e 's/.*-//g' | sed -e 's/.mp3//g' | sed -e 's/.wma//g'` #mid3v2 -D "${TMP}/${name}.wma" #mid3v2 -t "${title}" -a "${artist}" "${TMP}/${name}.wma" mv "${TMP}/${name}.wma" "${SAVE}/${name}.wma" downed=1; break; else echo -e "\e[1;6m\e[1;31m下载 ${name}.wma 文件无效,正在删除重新下载\e[1;6m\e[00m" rm "${TMP}/${name}.wma"; ((j++)) fi else echo -e "\e[1;6m\e[1;31m下载 ${name}.wma 文件无效,正在删除重新下载\e[1;6m\e[00m" rm "${TMP}/${name}.wma"; ((j++)) fi done ((i++)) if [ "$downed" = 1 ] ; then echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m" else echo -e "\e[1;7m\e[1;41m下载 $name 失败\e[1;7m\e[00m" fi done rm -fr ${TMP} exit 0 |
命令行的聊天工具 finch / gaim-text
以前在命令行下,提到聊天估计也就想到irssi上上irc,MSN什么的都没想过吧.
现在用 finch / gaim-text 就完全可以实现MSN/Gtalk之类的聊天了,至于QQ,还不知道,估计部分没有验证码的”正常”QQ应该可以上吧.
而且,如果以前用过 pidgin / gaim 的话,界面一点都不会陌生哦~差不多就是和gaim一样的.
至于安装,就不要说了,因为装好pidgin / gaim 之后就自然有了 :lol:
值得注意的是一下快捷键的用法,详见: http://developer.pidgin.im/wiki/Using%20Finch
放个图:

at命令的用法
顺便也在这里记录一下吧.
法一:
命令行输入:
at 17:20 tomorrow 回车会出现:
warning: commands will be executed using /bin/sh
at> 这时候输入到时间后要执行的命令,可以输多行,输完了ctrl+d.
就可以了
法二:
将命令保存成文件再执行:
at -f 文件名 17:20 tomorrow 回车.
这个文件最好加个可执行权限.
更多信息 man at