显示标签为“Linux”的博文。显示所有博文
显示标签为“Linux”的博文。显示所有博文

2016年7月28日星期四

Linux_115:精通 shell 编程之五:局部变量、环境变量、shell 变量

环境:RHEL 7.1 或 MAC 10.11.6

局部变量只能在创建它们的 shell 中使用。
环境变量可以在创建它们的 shell 及其派生出来的任意子进程中使用。
shell 变量是在 shell 初始化的时候被系统设定的变量,比如前文提到的《shell 变量》。

那么,区别到底在哪里呢?通过一个简单的测试说明一下。
实验前,先介绍一下 set、env、export 命令。
(1)set:显示或设置局部变量。
(2)env:显示或设置当前用户的环境变量。
(3)export:显示或设置导出成当前用户的环境变量的局部变量。

开始实验:
(1)设置一个局部变量:$ aaa=bbb
(2)使用 echo 查看刚刚设置的局部变量:$ echo $aaa,输出 bbb,说明局部变量中有 aaa。
(3)使用 env 查看当前用户的环境变量:$ env | grep aaa,没有任何输出,说明当前环境变量中没有 aaa。
(4)使用 set 查看刚刚设置的局部变量:$ set | grep aaa,输出 aaa=bbb,说明局部变量中有 aaa。
(5)使用 export 查看当前用户的环境变量:$ export | grep aaa,没有任何输出,说明当前环境变量中没有 aaa。
(6)使用 export 导出局部变量:$ export aaa
(7)使用 env 再次查看当前用户的环境变量:$ env | grep aaa,输出 aaa=bbb,说明当前环境变量中有 aaa。
(8)使用 export 查看当前用户的环境变量:$ export | grep aaa,输出 aaa=bbb,说明当前环境变量中有 aaa。

小结:

特征
局部变量
环境变量
shell 变量
受子进程影响

被用户设定

shell 设定


可被用户更改

shell 限制



参考文献:
1. 《精通 shell 编程(第二版)》

Linux_114:精通 shell 编程之四:局部变量

环境:RHEL 7.1 或 MAC 10.11.6

局部变量只能在创建它们的 shell 中使用。

1. 标量变量(“名-值”对)
定义格式:name=value,name 是变量名称,value 是变量值。
变量名称只能包括字母,数字和下划线,只能以字母或下划线为开始。
带空格的变量值要用引号(单引号或双引号)引起来。
访问变量只需要在变量名称前加 $ 符号即可。

2. 数组变量
数组是使用一个名称配置一组变量的方法。
定义格式:name[index]=value,index 是介于 0 ~ 1023 之间的一个整数。
给数组赋初值,比如:$ band=(derri terry mike gene),该命令等价于
$ band[0]=derri
$ band[1]=terry
$ band[2]=mike
$ band[3]=gene
访问数组变量:${name[index]}。
访问所有数组变量:${name[*]} 或 ${name[@]} 。
${name[*]} 和 ${name[@]} 的区别在于,如果数组某项值带空格,这时要使用${name[@]},而不能使用${name[*]}。
比如:$ band[4]="ma ping",${name[*]} 和 ${name[@]} 输出虽然看起来一样,但是 ${name[*]} 的结果是 6 项而不是 5 项。

3. 只读变量
当一个变量被指定为只读变量,它的值就无法更改或删除,一直保持到 shell 退出为止。

$ FRUIT=kiwi
$ readonly FRUIT
$ FRUIT=cantaloupe
-bash: FRUIT: readonly variable
$ unset FRUIT
-bash: unset: FRUIT: cannot unset: readonly variable

4. 删除变量
unset  name







3.

参考文献:1. 《精通 shell 编程(第二版)》

Linux_113:精通 shell 编程之三:特殊的 shell 变量

环境:RHEL 7.1 或 MAC 10.11.6

这些 shell 变量主要在 shell 脚本传参中使用。

1. $0
被执行的命令的名字。如果是 shell 脚本查看系统默认的 shell,注意这个不能反映当前使用的 shell 是哪个。

2. $n
这些变量对应的是一个脚本调用的参数。这里的 n 是一个十进制的整数,对应的是参数的位置(第一个参数是 $1,第二个参数是 $2,以此类推)。

3. $#
脚本支持的参数的个数。

4. $*
所有的参数被双重引用。

5. $@
所有的参数被独立地双重引用。

6. $?
最后一个被执行的命令的退出状态。

7. $$
当前 shell 的进程号。对于 shell 脚本来说,这就是它们执行的进程号。

8. $!
最后一个后台命令的进程号。

参考文献:
1. 《精通 shell 编程(第二版)》

2016年7月27日星期三

Linux_112:精通 shell 编程之二:shell 变量

环境:RHEL 7.1 或 MAC 10.11.6

shell 变量是在 shell 初始化的时候被设定的内部变量。

1. PWD
当前的工作目录。

2. UID
当前用户的数字标识。

3. SHLVL
每打开一个新的 bash,就自增 1,用于确认是否关闭了当前会话。

4. REPLY
REPLY 变量 与 read 和 select 命令有关。
(1)read variable 命令用于读取标准输入的变量值,该值会存储到 variable 变量中。
如果 read 命令不带任何变量名,此时,read 就将该值存储到 REPLY 变量中。
(2)select 命令是一种建立菜单的工具,它提供一组字符串供用户选择,用户不必完整地输入字符串,而只需输入相应的序号进行选择。比如:
select variable in list
do
   shell 命令1
   shell 命令2
   shell 命令3
   ……
   break
done
select 自动将 list 形成有编号的菜单,用户输入序号以后,将该序号所对应 list 中的字符串赋给variable 变量,而序号值则保存到 REPLY 变量中。

5.RANDOM
每次随机产生一个介于 0 到 32767 之间的一个整数。

6. SECONDS
shell 启动的时间(秒)。

7. IFS(Internal Field Seprator)
内部域分隔符,用来拆解读入的变量值。默认的分隔符是空格符(space)、制表符(tab)、换行符(\n)。
$ echo $IFS
直接输出 IFS 只能看到一个空白行,看不到任何东西。
$ echo $IFS | od -b
0000000   012                                                           
0000001
转化为二进制就可以看到了,"040"是空格符,"011"是制表符,"012"是换行符 。

8. PATH
命令的搜索路径。

9. HOME
当前用户的主目录。

参考文献:
1. 《精通 shell 编程(第二版)》

Linux_111:精通 shell 编程之一:确定当前使用的 shell

环境:RHEL 7.1 或 MAC 10.11.6

1. echo $SHELL
查看系统默认的 shell,注意这个不能反映当前使用的 shell 是哪个。

2. ps -p $$
查看当前的 shell。
说明:$$ 是一个特殊的 shell 变量,保存的是当前运行 shell 的 PID。

3. echo $0
查看当前的 shell。
说明:$0 是一个特殊的 shell 变量,保存的是被执行的命令的名字。
因为进入一个终端时,第一个被执行的命令总是某个 shell 的名字,所以该 shell 的名字就保存在 $0 中。

4. 查看 shell 版本 
echo $BASH_VERSION

参考文献:
1. 《精通 shell 编程(第二版)》

Linux_110:常用命令之三十六:sed

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

1. 语法:sed [-nefr] [n1[,n2]] function 
(1)-n :安静模式。默认情况下,所有来自标准输入的数据都会列出到终端上。加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
(2)-e :直接在命令列模式上进行 sed 的动作编辑。
(3)-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
(4)-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
(5)-i :直接修改读取的文件内容,而不是输出到终端。
(6)[n1[,n2]] function :n1,n2 行数起止;function,要进行的动作。
其中,function 可以设定的动作有:
(1)a :新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
(2)c :取代,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
(3)d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
(4)i :插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
(5)p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
(6)s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

2. 例子
(1)nl /etc/passwd | sed '2,5d'
显示所有的数据,但是把 2-5 行数据删除。注意, sed 后面接的动作,要用单引号引起来。
(2)nl /etc/passwd | sed '2d'
显示所有的数据,但是只删除第 2 行。
(3)nl /etc/passwd | sed '3,$d'
显示所有的数据,但是第 3 行到最后一行。
(4)nl /etc/passwd | sed '2a drink tea'
在第 2 行后的下一行加上 drink tea。
(5)nl /etc/passwd | sed '2i drink tea'
在第 2 行前的上一行加上 drink tea。
(6)nl /etc/passwd | sed '2a drink tea or \
> drink beer ?
在第 2 行后面加入两行文字,drink tea or  与 drink beer ?
添加的每一行之间都必须要以反斜杠  \ 来添加新行。
(7)nl /etc/passwd | sed '2,5c No 2-5 number'
把第 2~5 行的内容取代成为 No 2-5 number。
(8)nl /etc/passwd | sed -n '5,7p'
 只列出 /etc/passwd 文件的第 5~7 行。

3. 搜索和替换例子
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。
搜索和替换语法格式:sed 's/要被取代的字串/新的字串/g'
(1)nl /etc/passwd | sed '/root/p'
输出含有 root 的匹配行和所有行。
(2)nl /etc/passwd | sed -n '/root/p'
只输出含有 root 的匹配行。
(3)nl /etc/passwd | sed  '/root/d'
删除所有包含 root 的行,输出其它行。
(4)nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
搜索所有包含 root 的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 bash 替换为 blueshell,再输出这行。
(5)nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
搜索所有包含 root 的行,只替换第 1 个 bash 关键字为 blueshell,就退出。
(6)/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
删除 IP 前面的部分。
其中 ifconfig eth0 输出如下:inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
(7)/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
删除 IP 后面的部分。
(8)nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
 -e 表示多点编辑,第一条命令删除第 3 行到末尾的数据,第二条命令搜索 bash 并替换为 blueshell。

参考文献:
1. http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html

Linux_109:常用命令之三十五:awk

awk 是一个强大的文本分析工具,它逐行的读入文件,按分隔符抽取每行的信息片段,再进行各种分析处理。
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0 表示所有域,$1 表示第 1 个域,$n 表 示第 n 个域。
默认域分隔符是空格键 或 tab 键。

1. 命令语法:awk '{pattern + action}' {filenames}
(1)pattern 是根据正则表达式要查找的内容。
(2)action 是在找到匹配内容时所执行的一系列命令。
(3)大括号不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

2. 使用方式

2.1 命令行方式
awk [-F  field-separator]  'commands'  input-file(s)
(1)commands 是 awk 命令。
(2)-F field-separator 是域分隔符,不指定的话,默认是空格。
(3)input-file(s) 是待处理的文件。

2.2 shell 脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk

2.3 文件方式
awk -f awk-script-file input-file(s)
(1)-f awk-script-file 是 awk 脚本文件。
(2)input-file(s) 是待处理的文件。

3. 内置变量
(1)ARGC 命令行参数个数
(2)ARGV 命令行参数排列
(3)ENVIRON 支持队列中系统环境变量的使用
(4)FILENAME 浏览的文件名
(5)FNR 浏览文件的记录数
(6)FS 设置输入域分隔符,等价于命令行 -F 选项
(7)NF 浏览记录的域的个数
(8)NR 已读的记录数
(9)OFS  输出域分隔符
(10)ORS  输出记录分隔符
(11)RS 控制记录分隔符

4. 例子
(1)只显示 /etc/passwd 的账户名称
# cat /etc/passwd | awk  -F ':'  '{print $1}'
这里的 $1表示登录用户,$3 表示登录用户IP,以此类推。
(2)只显示/etc/passwd 的账户和账户对应的 shell,并且账户和 shell 之间以 tab 键间隔。
# cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
(3)只显示/etc/passwd 的账户和账户对应的 shell,并且账户和 shell 之间以逗号间隔,而且在所有行添加列名 name、shell,在最后一行添加 "blue,/bin/nosh"。
# cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
(4)搜索 /etc/passwd 中以 root 开头的所有行
# awk -F: '/^root/' /etc/passwd
(5)统计 /etc/passwd 的文件名,每行的行号,每行的列数,对应的完整行内容:
# awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
# awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

5. 编程

参考文献:
1. http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

Linux_108:常用命令之三十四:tr sort uniq

tr、sort、uniq 命令都是用来统计单词数的,wc 命令同样也可以统计单词的个数,但是要统计一个单词在一个文件中出现的次数,wc 命令就无能为力了。

1. tr (transliterate)
tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
 

1.1 语法:tr 选项 参数

1.2 选项
(1)-c 或 --complerment:取代所有不属于第1字符集的字符。
(2)-d 或 --delete:删除所有属于第1字符集的字符。
(3)-s 或 --squeeze-repeats:把连续重复的字符以单独一个字符表示。
(4)-t 或 --truncate-set1:先删除第一字符集较第二字符集多出的字符。

1.3 参数
(1)字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
(2)字符集2:指定要转换成的目标字符集。

1.3 例子
(1)tr '!?":;\[\]{}(),.' ' ' < ch15.doc
去除文件中的所有标点和分隔符。
(2)echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world
大写转小写。
(3)echo "hello 123 world 456" | tr -d '0-9'
删除数字。
(4)cat text | tr '\t' ' '
制表符转为空格。
(5)echo "thissss is a text linnnnnnne." | tr -s ' sn'
压缩重复的字符。

2. sort
将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后按升序输出。

2.1 语法:sort [options] 文件名

2.2 选项
(1)-u:除去重复行。
(2)-r:sort 默认按升序排,使用 -r 后按降序排。
(3)-o:把排序结果输出到原文件。
(4)-n:按照数值而不是字符排序。比如:按照数字排 10 比 2 大,按照字符排 10 比 2 小。
(5)-t:指定间隔符。
(6)-k:指定列数。
(7)-f:会将小写字母都转换为大写字母来进行比较,亦即忽略大小写。
(8)-c:检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,并返回1。
(9)-C:会检查文件是否已排好序,如果乱序,不输出内容,只返回1。
(10)-M:以月份来排序,比如 JAN 小于 FEB 等等。
(11)-b:忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

2.3 例子
(1)sort -r number.txt -o number.txt
按降序排列,并写入原文件。
(2)sort -n -k 2 -t : fruits.txt
以第2列水果数量排序。
文件有三列,列与列之间用冒号隔开,第1列表示水果类型,第2列表示水果数量,第3列表示水果价格。
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

3. uniq
输出一个文件中所有的唯一的行, 对于那些连续重复的行只显示一次。

3.1 语法:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

3.2 选项
(1)-c: 在每列旁边显示该行重复出现的次数。
(2)-d: 仅显示重复出现的行列。
(3)-f: 忽略比较指定的栏位。
(4)-s: 忽略比较指定的字符。
(5)-u: 仅显示出一次的行列。
(6)-w: 指定要比较的字符。
(7)-n:前n个字段和每个字段前的空白一起被忽略。
(8)+n:前n个字符被忽略。

3.3 例子
(1)uniq -c fruits.txt
显示每一行出现的次数和内容。
(2)uniq -d fruits.txt  
仅显示文件中连续重复出现的行。
(3)uniq -u fruits.txt
显示文件中没有连续出现的行。
 
参考文献:
1. http://man.linuxde.net/tr
2. http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
3. http://blog.chinaunix.net/uid-26495963-id-3282526.html

Linux_107:常用命令之三十三:wc

wc (word count) 命令可以统计指定文件中的字节数、字数、行数,并将统计结果显示输出。如果没有给出文件名,则从标准输入读取。如果是多个文件,最后一行会给出所有指定文件的总统计数。

1. 语法:wc [选项] 文件...

2. 参数说明
(1)-l 统计行数。
(2)-w 统计单词数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
(3)-m 统计字符数。这个标志不能与 -c 标志一起使用。
(4)-c 统计字节数。
(5)-L 打印最长行的长度。

3. 例子
(1)wc test.txt
查看文件的行数、单词数、字符数。
(2)wc -l test.txt
查看文件的行数。
(3)wc -l fruits users
查看每个文件的行数,以及所有文件的总行数。
(4)wc -w fruits users
查看每个文件的单词数,以及所有文件的总单词数。
(5)wc -m fruits users
查看每个文件的字符数,以及所有文件的总字符数。
(6)cat test.txt | wc -l
只打印统计数字不打印文件名。
(7)ls -l | wc -l
统计当前目录下的文件数。

Linux_106:常用命令之三十二:cat

cat 命令用来显示文件内容。

1. 语法:cat [options] file1 ... fileN

2. 参数说明
(1)-n 或 --number 由 1 开始对所有输出的行数编号。
(2)-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号。
(3)-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行。
(4)-v 或 --show-nonprinting 显示非打印字符。
(4)-E 或 --show-ends 在每行结束处显示 $。

3. 例子
(1)cat fruits
(2)cat fruits users
显示两个文件,输出内容是把两个文件的内容连接在一起。
(3)cat -n fruits
输出的每一行前显示行号。
(4)cat -b fruits
跳过空白行。
(5)cat -b fruits users
显示两个文件,每个文件的行号都是从1开始。输出内容是把两个文件的内容连接在一起。
(6)cat file1 file2 > file
合并两个文件为一个文件。

4. 与 EOF 一起使用 
EOF(End OF File)是文本终止符。
在命令行状态下,也可以输入 control + D 代替输入 EOF。
也可以用其它字符来代替 EOF,因为只是一个标识符,不过还是建议使用 EOF。

(1)手工输入多行创建文件
$ cat << EOF > hello.txt
在出现输入提示符">",输入以下内容:
> Hello
> Ma Ping
> EOF
(2)手工输入多行追加文件
$ cat << EOF >> hello.txt
在出现输入提示符">",输入以下内容:
> Ma Qing Chuan
> EOF

总的来说,cat 和 EOF 的组合让用户可以直接输入文件的内容,相当于一个临时文件,但又没有创建任何文件,使用起来非常方便。

2016年7月26日星期二

Linux_105:常用命令之三十二:head、tail

1. head [ -n ] file
用来显示一个文件的最开始几行。
例子:
(1)head -n 5 file
(2)ls -1ut /Users/maping | head -5
某目录中访问最频繁的五个文件。

2. tail [ -n ] file
用来显示一个文件的最后几行。
例子:
(1)tail -n 5 file
(2)ls -1rt /Users/maping | tail -5
某目录中最长时间没有访问的五个文件
(3)tail -f /var/log/httpd/access_log

实时跟踪 follow 选项 -f

2016年6月23日星期四

Linux_104:常用命令之三十一:htpasswd

环境:OS X EI Capitan 10.11.5

htpasswd 命令用于建立和更新存储用户名、密码的文本文件, 用于对HTTP用户的Basic认证。
如果没有这个命令,可以用 # yum -y install httpd-tools 安装。


用法:
htpasswd [-cmdpsD] passwordfile username
htpasswd -b[cmdpsD] passwordfile username password

参数说明:
(1)-c 创建passwdfile。如果passwdfile 已经存在,那么它会重新写入并删去原有内容。
(2)-n 不更新passwordfile,直接显示密码。
(3)-m 使用MD5加密(默认)。
(4)-d 使用CRYPT加密(默认)。
(5)-p 使用普通文本格式的密码。
(6)-s 使用SHA加密。
(7)-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互。
(8)-D 删除指定的用户。

举例:
1. 创建一个新的存储用户名、密码的文本文件的同时创建一个用户
# htpasswd -c /etc/openshift/openshift-passwd testuser
回车后会提示输入口令

2. 在原有用户名、密码的文本文件中,增加一个用户
# htpasswd -b /etc/openshift/openshift-passwd developer openshift
注意,这里一定要把 -c 参数去掉,否则会覆盖原有的文件。

3. 如何不更新密码文件,只显示加密后的用户名和密码?
# htpasswd -n testuser2

4. 如何删除用户名和密码?
# htpasswd -D /etc/openshift/openshift-passwd testuser

5. 如何修改密码?
先删除指定用户,再重新添加一遍该用户。

参考文献:
1. https://blog.linuxeye.com/333.html

2016年2月29日星期一

Linux_103:常用命令之三十:wget

环境:OS X EI Capitan 10.11.3

基本用法:wget url,例如:wget http://maping930883.blogspot.com


参数说明:
(1)-e 指定代理
例如:-e "http_proxy=http://squid.rdu.redhat.com:3128/"
(2)-k 转换链接,将下载的HTML页面中的链接转换为相对链接,即本地链接。
(3)-c 断点续传
(4)-p  下载所有的图片等页面显示所需的内容。

(5)-np  下载的页面不越过指定的URL。
(6)-m  整站下载。
(6)-r 递归下载。

2015年5月22日星期五

Linux_102:常用命令之二十九:source 和 .

环境:MAC OS X 10.10.3

1. source 
语法:source FileName
在当前Shell下执行文件中的各个命令。

比如 setJdk8Env.sh内容如下:

#!/bin/sh

#Set Java Environment
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export ANT_HOME=/Users/maping/Apache/ant
export MAVEN_HOME=/Users/maping/Apache/maven
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$MAVEN_HOME/bin:$PATH

执行 source setJdk8Env.sh,才会在当前Shell中成功设置JDK8的环境变量。
如果执行 ./setJdk8Env.sh,只能够在子Shell中成功设置JDK8的环境变量,随着脚本的执行完毕,又回到了当前Shell,因此是无法看到JDK8的环境变量的。

2. .
点“.”命令和source命令作用一样。
执行 .  set Jdk8Env.sh 和执行 source setJdk8Env.sh 效果一样。

参考文献:
1. http://blog.csdn.net/nash603/article/details/6152200
2. http://blog.chinaunix.net/uid-23622436-id-3222317.html

2015年5月12日星期二

Linux_101:常用命令之二十八:zip unzip

环境:MAC OS X 10.10.3

1. zip
常用语法:zip -q -r -e -m -o [someThing].zip someThing

(1)-q 表示不显示压缩进度状态
(2)-r 表示子目录子文件全部压缩为zip
(3)-e 表示你的压缩文件需要加密,终端会提示你输入密码的
(4)-m 表示压缩完删除原文件
(5)-o 表示设置所有被压缩文件的最后修改时间为当前压缩时间

例子:zip -r \user\someone\someDir\someFile.zip \users\someDir

2. unzip 
unzip为.zip压缩文件的解压缩程序。

语法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密 码>][.zip文 件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]

(1)-c   将 解压缩的结果显示到屏幕上,并对字符做适当的转换。
(2)-f   更 新现有的文件。
(3)-l   显 示压缩文件内所包含的文件。
(4)-p   与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任 何的转换。
(5)-t   检 查压缩文件是否正确。,但不解压。
(6)-u   与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
(7)-v   执 行是时显示详细的信息。或查看压缩文件目录,但不解压。
(8)-z   仅 显示压缩文件的备注文字。
(9)-a   对 文本文件进行必要的字符转换。
(10)-b   不 要对文本文件进行字符转换。
(11)-C   压 缩文件中的文件名称区分大小写。
(12)-j   不 处理压缩文件中原有的目录路径。
(13)-L   将 压缩文件中的全部文件名改为小写。
(14)-M   将 输出结果送到more程 序处理。
(15)-n   解 压缩时不要覆盖原有的文件。
(16)-o   不 必先询问用户,unzip执 行后覆盖原有文件。
(17)-P<密码>   使 用zip的密码选项。
(18)-q   执 行时不显示任何信息。
(19)-s   将 文件名中的空白字符转换为底线字符。
(20)-V   保 留VMS的文件版本信 息。
(21)-X   解 压缩时同时回存文件原来的UID/GID。
(22)[.zip文件]   指定.zip压缩文件。
(23)[文件]   指定 要处理.zip压缩文 件中的哪些文件。
(24)-d <目录>   指 定文件解压缩后所要存储的目录。
(25)-x <文件>   指 定不要处理.zip压 缩文件中的哪些文件。
(26)-Z   unzip -Z等 于执行zipinfo指 令。

参考文献:
1. http://www.cnblogs.com/davidxie/archive/2012/11/23/2784646.html
2. http://www.cnblogs.com/lucyjiayou/archive/2011/12/25/2301046.html

2015年1月19日星期一

Linux_100:常用命令之二十七:man

man命令可以查看命令的帮助信息。
格式:man [command]
比如:man curl

操作说明:
(1)q 退出
(2)Enter 即回车键 下翻一行
(3)Space 即空格键 下翻一页
(4)b 上翻一页
(5)/ 后面跟一个字符串 + Enter 即回车键 查找字符串
(6)n 发现上一次查找的下一个匹配


2015年1月4日星期日

Linux_099:RHEL6下安装Samba服务

环境:RHEL 6.6

RHEL6默认没有安装Samba服务,需要手工安装。
首先挂载RHEL 6.6 iso,然后进入Packages目录。

1. 安装samba
# rpm -ivh samba-3.6.23-12.el6.x86_64.rpm
warning: samba-3.6.23-12.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:samba                  ########################################### [100%]

2. 安装samba-client
# rpm -ivh samba-client-3.6.23-12.el6.x86_64.rpm
warning: samba-client-3.6.23-12.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
    package samba-client-0:3.6.23-12.el6.x86_64 is already installed

3. 创建共享目录,并改变目录属主为nobody
(1)# mkdir -p /share/docs
(2)# chown nobody:nobody /share/docs -R

4. 修改/etc/samba/smb.conf,修改后内容如下:

[global]
workgroup = WORKGROUP
server string = MaPing Samba Server Version %v
netbios name = RHEL 6.6 Server
log file = /var/log/samba/log.%m
security = share
[public]
comment = shared docs
path = /share/docs
public = yes
browseable = yes
writeable = yes

5. 设置防火墙,开启port:139和port:445
# vim /etc/sysconfig/iptables
修改后的文件内容如下:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

6.  disable SELinux
# vim /etc/selinux/config
修改后的文件内容如下:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted


7. 重启samba服务
 (1)service  smb restart
 (2)chkconfig --level 35 smb on

8. 在Windows 7 机器上访问共享目录
(1)可以直接在地址栏输入:\\192.168.0.105\public
(2)在命令行窗口输入:net view \\192.168.0.105,连接成功后,会输出Server以及共享目录信息。
执行 net use H: \\192.168.0.105\public,将共享目录映射为驱动器H。
试一试,应该可以向共享目录中读写文件。

9. 在Linux 机器上访问共享目录
smbclient //192.168.0.105/public

参考文献:
1. http://www.it165.net/os/html/201312/7021.html

2015年1月3日星期六

Linux_098:下载指定的软件 repo

环境:RHEL 6.7

这里以下载 JBoss EAP 和 JBoss Web Server 为例说明如何下载 repo。

访问 https://access.redhat.com/downloads/content/package-browser,根据关键字查找软件,比如:eap6 或 jws3。
输入 jws3,会显示 jboss web server 3 的有关软件包,如下图:

随便选一个组件,点击右边的 X86_64,显示如下画面:

可以看到 JBoss Enterprise Web Server 3 for RHEL 6 x86_64 是软件名称,
jws-3-for-rhel-6-server-rpms 就是 repo label。

点击软件名称,可以选择不同的版本,如下图所示:

接下来就可以下载指定的 repo 了。

subscription-manager register;

subscription-manager list --available;

subscription-manager attach --pool=< your-pool-id >

subscription-manager repos --disable="*"

subscription-manager repos \
    --enable="rhel-6-server-rpms" \
    --enable="jb-eap-7.0-for-rhel-6-server-rpms" \
    --enable="jb-eap-6.4-for-rhel-6-server-rpms" \
    --enable="jb-eap-6.3-for-rhel-6-server-rpms" \
    --enable="jws-3-for-rhel-6-server-rpms" \
    --enable="jb-ews-2-for-rhel-6-server-rpms"

yum install -y yum-utils;

reposync -r jb-eap-7.0-for-rhel-6-server-rpms -p ./;
reposync -r jb-eap-6.4-for-rhel-6-server-rpms -p ./;
reposync -r jb-eap-6.3-for-rhel-6-server-rpms -p ./;
reposync -r jws-3-for-rhel-6-server-rpms -p ./;
reposync -r jb-ews-2-for-rhel-6-server-rpms -p ./;

Linux_097:RHEL6下安装OpenSSH服务

环境:RHEL 6.6


RHEL 6.6 默认已经安装了OpenSSH服务,无需手工安装。
如果不确认是否已经安装了OpenSSH服务,可以运行 rpm -qa openssh-server 查看。
如果不确认是否已经安装了OpenSSH客户端,可以运行 rpm -qa openssh-clients 查看。

首先,增加RHEL 6.6 iso作为本地YUM源,并进入Packages目录。

1. 安装openssh-server
 # rpm -ivh openssh-server*.rpm


2. 安装openssh-clients
 # rpm -ivh openssh-clients*.rpm

3. 测试:ssh [username@ip_address]
例1:ssh maping@192.168.0.105


Linux_096:RHEL6下安装telnet服务

环境:RHEL 6.6

RHEL 6.6 默认没有安装telnet服务,需要手工安装。
如果不确认是否已经安装了telnet服务,可以运行 rpm -qa telnet-server 查看。
首先,增加RHEL 6.6 iso作为本地YUM源,并进入Packages目录。

1. 安装xinetd
# rpm -ivh xinetd-2.3.14-39.el6_4.x86_64.rpm
warning: xinetd-2.3.14-39.el6_4.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:xinetd                 ########################################### [100%]

2. 安装telnet-server
# rpm -ivh telnet-server-0.17-48.el6.x86_64.rpm
warning: telnet-server-0.17-48.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:telnet-server          ########################################### [100%]

3. 安装telnet 
# rpm -ivh telnet-0.17-48.el6.x86_64.rpm
warning: telnet-0.17-48.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:telnet                 ########################################### [100%]

4.  设置防火墙,开启port:23
# vim /etc/sysconfig/iptables
修改后的文件内容如下:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

5.  disable SELinux
# vim /etc/selinux/config
修改后的文件内容如下:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

6. # chkconfig --level 35 telnet on,重启机器。

7. 测试:telnet [IP地址] [Port]
除了测试 telnet 默认的port:23,telnet 还可以用来测试任意远程主机的任意端口是否开启。
例1:telnet 192.168.0.105 8080
Trying 192.168.0.105...
Connected to 192.168.0.105.
Escape character is '^]'.
表示IP地址为192.168.0.105的机器的8080 端口开启。

例2: telnet 192.168.0.105 7777
Trying 192.168.0.105...
telnet: connect to address 192.168.0.105: Connection refused
telnet: Unable to connect to remote host
表示IP地址为192.168.0.105的机器的7777 端口未开启。

参考文献:
1. http://woshixy.blog.51cto.com/5637578/1279126
2. http://zoulu1.blog.163.com/blog/static/46733149201252752125837