asuerhao's Blog

如果有什么做的不到的地方请尽管留言, 我会改进的 : )

安全BASH脚本的开场白(仅供参考)

#! /bin/bash --
# '--'标志选项的结束,禁止其余的选项处理.
# 任何'--'之后的参数将作为文件名和参数对待.
# 参数 '-'与之等价. 这可以避免某种程度的欺骗攻击(Spoofing Attack).

# IFS变量中存储着输入字段分割符,它会影响Shell接下来对输入数据解释的方式.
# 为了防止某些Shell导入该变量的一个外部设置,
# 在脚本开始时将IFS重设为标准值(空格,Tab和换行):
IFS=$' \t\n'

# 为了执行我们所预期的命令:
# 首先确定unalias不是一个被重新定义的函数(POSIX中,unset是一个特殊Shell内部命令,
# 它在函数和普通内部命令之前执行,所以你不必担心它被重新定义为一个函数,
# 不过,GNU/BASH却可以将其定义为函数,不解。。。):
unset -f unalias
# 删除所有命令别名,前面加'\'是为了保证unalias不是一个别名:
\unalias -a
# 确保command不是一个函数, 它本身是一个普通的内部命令:
unset -f command
# 设置一个可以信赖的PATH变量:
# 'command -p', 表示使用$PATH的默认值,并避开Shell函数,以执行后面的命令.
# 'getconf', 列出系统配置变量值.
SYSPATH="S(command -p getconf PATH 2>/dev/null)"
if [[ -z "$SYSPATH" ]]; then
      SYSPATH="/usr/bin:/bin"
fi
PATH="$SYSPATH:$PATH"
# 确保所有的子进程继承我们的安全查找路径:
export PATH

看过的几本好书

<<程序设计基础(第3版)>> 维尼特 著, 进入代码世界的入门书, 使用伪代码或BASIC教你如何结构化编程.

<<一站式学习C编程>>, C语言进阶学习, 关于C语言的一些更本质的东西.

<<Ubuntu权威指南>>, 初学Linux时天天拿着这本书看, 很基础也很全面的一本Linux入门书.

<<Shell脚本学习指南>>, 作者经验很丰富, 涉及各种Shell工具, 并且时刻注意Shell脚本的跨平台性.

<<Perl语言入门>>, Perl入门经典, 不过, 只是入门, 但也学到不少东西, 用来处理数据文件是够用了.

Linux 命令行下的计算器

1. bc

  支持简单变量(simple variable)和数组(array), 支持算数运算, 赋值, 关系运算, 逻辑运算, 支持函数和控制结构。

  bc内建了四个特殊变量:

         scale, 精确到小数点后面多少位;

         ibase, 输入数据的进制;

         obase, 输出数据的进制;

         last, 最近打印的变量值.

  调用bc时添加-l选项, 会载入数学函数库, 提供一下函数:

        s (x)  The sine of x, x is in radians.

        c (x)  The cosine of x, x is in radians.

        a (x)  The arctangent of x, arctangent returns radians.

        l (x)  The natural logarithm of x.    

        e (x)  The exponential function of raising e to the value x.

         j (n,x)  The Bessel function of integer order n of x.

示例:

$  #进制转换

$  echo 'obase=16; 255' | bc

$  FF

$  #数学函学运算

$  echo 'scale=10; 4*a(1)' | bc -l

$  3.1415926532

 

2. Awk

  Awk本是专门用来处理文本的, 但它同时提供了一些基础的数值函数, 如:

     atan2(y, x)  返回y/x的正切值;

     int(x)  返回x的整数部分;

     srand(x)  设置虚拟随机产生器的种子;

     rand()  返回平均分布的虚拟随机数r, 0<=r<1;

     sin(x), cos(x), exp(x), log(x), sqrt(x).

  Awk支持标量变量, 数组变量, 赋值, 算数运算, 逻辑运算, 函数和控制结构, 可构造复杂的运算过程.

示例:

$  #计算阶乘

$  awk  'function fact(n) {\

                   if(n<=1) return 1;\

                   return(n*fact(n-1));\

               }\

               BEGIN { print fact(3); }'

$  6

 

3. Perl

  Perl是一门高级的脚本语言, 他内建了一些基本的数学函数, 如果对运算有更高要求的话, 可以引入相应模块:

      Math::BigInt - 大整数和大浮点数运算

      Math::Complex - 复数运算

      Math::BigFloat - 大浮点数运算

      Math::BigInt::Calc - Pure Perl module to support Math::BigInt

      Math::BigInt::CalcEmu - Emulate low-level math with BigInt code

      Math::BigInt::FastCalc - Math::BigInt::Calc with some XS for more speed

      Math::Trig - 三角函数

      Math::BigRat - 大有理数运算

  示例:

$  #打印PI

$  perl -w -e 'use Math::Trig; print(pi, "\n")'

$  3.14159265358979

 

4. Ruby

  Ruby是一门高级的面向对象的脚本语言, 她的Math模块定义了常量PI和E、一些三角函数和对数函数的方法及一些杂类方法。Math的方法都是“模块方法”, 它们可以通过Math这个命名空间来调用, 或者被其它类包含后像全局函数一样使用. Ruby标准库中的一些其它类也能帮助您完成一些复杂的任务:

    BigDecimal类: 用于代替Float, 当进行金融运算时, 可避免二进制浮点运算所带来的舍入误差;

    Complex类: 可以表示和操作一个复数;

    Rational类: 可以表示一个实数, 它定义了实数的算数运算操作符;

    Matrix和Vector类: 向量和矩阵运算;

    全局函数Kernel.rand: 产生随机数;

    Time类: 表示日期和时间.

  示例:

$ #打印PI和E

$  ruby -e 'printf( "Pi= %f, e= %f\n", Math::PI,Math::E)'

$  Pi= 3.141593, e= 2.718282

 

5. Python

  Python也是一门高级的面向对象的脚本语言. Python内置了一些基本的数学函数, 可以直接调用:

      abs(x): 返回x的绝对值;

      complex([real[, imag]]): 创建值为 real+imag*j的复数;

      divmod(a, b): 作除法;

      pow(x, y[, z]): 返回x**y, 或x**y%z;

      round(x[, n]): 根据给定精度进行四舍五入;

      sum(sequence[, start]): 对序列sequence求和, 如果存在参数start, 则再加上start.

  同时, Python标准库中也提供了大量的数值运算模块:

      numbers模块: 数值基本类;

      math模块: 数值运算;

      cmath模块: 复数运算;

      decimal模块: 定点和浮点函数运算;

      fractions模块: 有理数运算;

      random模块: 生成伪随机数.

示例:

$  #计算乘方

$  python -c 'print(pow(2, 3))'

$  8

我的Perl模板

#! /usr/bin/env perl

use 5.010; #启用新特性

use warnings; #警告信息

use diagnostics; #诊断说明

use strict; #强制使用一些严格的、良好的程序语言规则

在Linux下几款常用命令行工具简介 (持续更新) (基本的文件处理命令不算在内)

1. aptitude

    Apt的高级版本,可以更加智能的帮你解决依赖问题, 用Apt无法解决的依赖问题可以尝试用它。

 

2. sdcv

    StarDict的命令行版, 命令后面直接跟单词列表就可以了. 支持单词以‘/’开头的模糊查询(Fuzzy Search)和以‘|’开头的全文查询(Full-test Search),还支持正则表达式中的‘?’和'*'. 不过好像查询结果条目过多的话会出现Bug,只能用'<Ctrl+Enter>'组合键确定输入.

示例:

$  #查询字典中所有以ove结尾的四个字符的单词.

sdcv '?ove'

Found 2 items, similar to ?ove.

0)CET4-->love

1)CET4-->move

Your choice[-1 to abort]: 1 <Ctrl+Enter>

-->CET4

-->love

[lʌv]

n. 爱,恋爱,爱情

vt. 爱,热爱,喜欢

.......

 

3. nmap

    端口扫描工具, 学习服务器搭建时经常用到. 专门用来扫描某主机所开放的端口,提供的服务,操作系统版本,所用的包过滤器和防火墙.

示例:

$ nmap localhost

Starting Nmap 5.21 ( http://nmap.org ) at 2012-04-01 18:07 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00043s latency).
Not shown: 990 closed ports
PORT     STATE SERVICE
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
631/tcp  open  ipp
902/tcp  open  iss-realsecure
3689/tcp open  rendezvous
Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds

 

4. nbtscan

    在学习Linux网络维护时用到的,用于查询网络中的NetBIOS信息. 它会尽量返回某一主机的IP地址, 计算机在网络中的名字MAC地址等信息.

示例:

btscan 192.168.1.29
Doing NBT name scan for addresses from 192.168.1.29
IP address       NetBIOS Name     Server    User               MAC address      
--------------------------------------------------------------------------------------------------------
192.168.1.29     SUBUNTU          <server>  SUBUNTU     00:00:00:00:00:00

 

5. bc

    一个任意精度的可编程的计算器工具.支持简单变量(simple variable)和数组(array), 支持算数运算, 赋值, 关系运算, 逻辑运算, 支持函数和控制结构.

示例:

$  #进制转换

$  echo 'obase=16; 255' | bc

FF

 

6. xdotool

    可以为键盘输入和鼠标动作进行编程,很好玩儿的一个工具.它可以帮你打游戏,帮你听网络公选课,帮你做所有需要鼠标或键盘去重复操作才能完成的无脑操作.

示例:

#  #让鼠标每隔一段时间便单击屏幕上某一特定区域,然后我的网络公选课程一晚就听完了.

$ cat MouseMotion.sh

#! /bin/bash

while (true)
do
    xdotool mousemove 50 50; xdotool click 1
    notify-send "下一部"
    echo -ne "$(date)\n" >> ~/xdot.log
    sleep $((30*60+$RANDOM%5*20))
done

 

7. xsel

    管理X的剪切板. X公有三个剪切板, 分别称为主(PRIMARY),次(SECONDARY)和CLIPBOARD,分别可以通过选项-p, -s, -b制定操作的剪切板.

示例:

$  #将字符串放入CLIPBOARD中:

$  echo -n 'I love you' | xsel -b

 

8. notify-send

    发送桌面提示,在Ubuntu下由libnotify-bin包提供.

示例:

notify-send '该睡觉了'

 

9. zenity

    显示GTK+风格的对话框.我们可以在脚本中使用zenity命令为用户展示一个交互的窗口,可以用来显示一个日历(返回用户选择的日期)、显示错误信息(返回真假)、显示文本输入对话框(返回用户输入文本)等等.你还可以通过一系列选项控制交互式窗口的样式.

示例:

$  #显示一个范围从0到10的标尺对话框

zenity --scale --title='标尺' --text='请选择' --min-value=0 --max-value=10

 

10. tee

    tee命令可以同时将标准输入写往文件和标准输出. 用awk或sed编辑文件时候, 配合tee命令可以直接修改原文件(类似sed的-i选项, 不过sed无法将结果再送到标准输出).

    示例:

$  seq 3 | tee hi

  1

  2

  3

$ cat hi | sed -e 1d | tee hi

  2

  3

$ cat hi

  2

  3

 

10.  screen

  远程登录Linux的时候是否觉得一个终端不够用? 这时您可以使用screen提供的虚拟终端功能, 在同一物理终端运行多个交互式Shell. 注意, screen没有类似emacs的分屏功能, 同一时刻它只能显示一个屏幕. 创建多个虚拟终端后, 您需要利用键绑定在不同终端间切换.

示例:

$  #创建一个执行'vi /etc/hosts'命令的虚拟终端:

$  screen vi /etc/hosts

$  #再次创建一个虚拟终端:

$  <Ctr-a> + c

$  #查看当前所有已创建的虚拟终端:

$ <Ctr-a> + "

$  #返回之前的虚拟终端:

$ <Ctr-a> + p

$  #进入下一个虚拟终端:

$  <Ctr-a> + n

  screen的选项和键绑定的详细情况请参照其手册页.

 

11. wget, axel

  命令行下载工具. wget仅支持HTTP, HTTPS和FTP协议. wget支持断线重连, 可在差网络环境下载大文件, 还可以追踪网页链接以复制整个网站. axel, 下载加速工具, 支持HTTP, HTTPS和FTP. axel通过打开多个链接将文件分段下载.