linuxshell总结历程

1 shell 中的数组 可以是关联数组,索引值不是数组 0 1 2  

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于做网站、成都做网站、和顺网络推广、小程序设计、和顺网络营销、和顺企业策划、和顺品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供和顺建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

decalre -A   f_value       # 申明数组  可以省略 

f_value=([apple]='100doll' [orange]='150 doll')   定义数组 

echo ${f_value[apple]}  # 去数组值 

例如: 

declare -A f_fruit    # 一定要申明,不同于索引为 0 1 2 的可以不需要申明   # declare -a  A  这是定义 普通的数组

f_fruit=([apple]='100RMB' [orange]='50RMB') 

echo ${f_fruit[apple]} 

echo ${f_fruit[orange]} 

echo ${!f_fruit[*]} 

3  sh脚本调试    

全部调试  sh -x 

部分调试  只调试代码中的类容 

set -x

代码

set +x

例子: 

 #!/bin/bash 

for i in {1..6} 

do 

         set -x 

        echo $i 

        set +x 

done 

echo "script executed" 

  

注: set -x 在执行时显示参数和命令 

    set +x 禁止调试上 

4 读取read ,  不用enter 回车表示确定用特定的字符表示结束

read -d ":" 

例如; 

read -p "Please enter you name:"  -d ":"  NAME 

例如; 

read -p "Input you Name: " Name 

read -d ":" -p "Input you User: " User 

echo 

read -t 5 -s -p "Input you Password: " Password 

补充: 

-s 无回显方式如密码输入 

-t  超时设置 

5 运行直到命令成功

repeat() 

  { while true  : ; do  $@ && return; sleep 30;done } 

执行函数  repeat wget -c http://download 

6 find 的基于depth 深度

find  -maxdepth 2 二级   

-mindepth 最小的深度 

find /data/zhiliang.cui/scripts/ -mindepth 10 -name "*.sh"  -print  

7  单向散列算法 md5sum

生成校验和

[  root@cui1 data]# md5sum /data/zhiliang.cui/scripts/sh/1.sh /data/zhiliang.cui/scripts/sh/for.sh   
24edee6130b1e1c6e57708592f6d6fa9  /data/zhiliang.cui/scripts/sh/1.sh  
81eef2d13e3dfeabfe53e6a3ddf43156  /data/zhiliang.cui/scripts/sh/for.sh 

> 定向到文件 file_sum.md5   

-c   检查校验和和文件校验和比较 

文件修改后的结果 

 --status  不输出任何东西,一般用于执行返回码的作用 

注: 

加密的其他算法: 

base64 

[  root@cui1 data]# cat file_sum.md5   
24edee6130b1e1c6e57708592f6d6fa9  /data/zhiliang.cui/scripts/sh/1.sh  
81eef2d13e3dfeabfe53e6a3ddf43156  /data/zhiliang.cui/scripts/sh/for.sh  
[  root@cui1 data]#   base64 file_sum.md5   
MjRlZGVlNjEzMGIxZTFjNmU1NzcwODU5MmY2ZDZmYTkgIC9kYXRhL3poaWxpYW5nLmN1aS9zY3Jp  
cHRzL3NoLzEuc2gKODFlZWYyZDEzZTNkZmVhYmZlNTNlNmEzZGRmNDMxNTYgIC9kYXRhL3poaWxp  
YW5nLmN1aS9zY3JpcHRzL3NoL2Zvci5zaAo=  
[  root@cui1 data]# base64 file_sum.md5 > base64  
[  root@cui1 data]#   base64 -d base64   #解密  
24edee6130b1e1c6e57708592f6d6fa9  /data/zhiliang.cui/scripts/sh/1.sh  
81eef2d13e3dfeabfe53e6a3ddf43156  /data/zhiliang.cui/scripts/sh/for.sh 

gpg 加密 

gpg -c file 以交互式方式加密

解密  

gpg -d 以交互式方式解密

加salt的加密方法:  

openssl -1 -salt SALT_STRING PASSWORD

8 分隔文件 

以大小或者行数分隔 split

-b 以大小分隔 -b 10K  以10K大小一个文件进行分隔

-l 一行数切割

split -b 100K messages-20150212 

-a 指定【后缀】长度  默认为2   

-d 以数字作为分隔后的后缀 

默认是字母为后缀 

前缀可以指定: split [OPTION] [INPUT [PREFIX]] 

例如:

[  root@cui1 test]# split -b 100K -d -a 4 messages-20150212 message  
[  root@cui1 test]# ll  
总用量 760  
-rw-r--r-- 1 root root 102400 3月   3 00:21   message  0000   {message 为指定的前缀   0000表示使用数组作为后缀}  
-rw-r--r-- 1 root root 102400 3月   3 00:21 message0001  
-rw-r--r-- 1 root root 102400 3月   3 00:21 message0002  
-rw-r--r-- 1 root root  78495 3月   3 00:21 message0003  
-rwxr-xr-x 1 root root 385695 3月   3 00:21 messages-20150212 

注: 扩展  csplit 是split变体工具,支持 以指定文件字符作为切割符 

9 利用并行进程加速执行脚本 

^C[  root@cui1 test]# vim sleep   
#!/bin/sh  
#  
pidarray=()  
for((i=1;i<=5;i++))  
do  
    sleep 10 &  
      pidarray+=("$!")  
done  

wait ${pidarray[@]}   

# wait  等待所有的完成 

1 放到后台运行 

2 wait 等待所有进程【号】结束才结束脚本 

10  回环文件

dd 

mkfs.ext4 

mount -o loop 

/dev/loop* 

10 统计字符个数 

[  root@cui1 sh]# echo 123 | wc -c  
4  
[  root@cui1 sh]# echo -n 123 | wc -c  

其实-n 只是表示避免添加  额外的换行符

11 wget下载

wget URL  

-O 指定下载保存的路径/文件 

-o  下载的log 

-t 指定重试的次数 

-t 0 无线次数 

12 纯文本形式dump 

lynx URL -dump > file.txt 

Lynx 是一个字符界面下的全功能的WWW浏览器,支持很多操作系统  

lynx  -source   http://pim.qq.com     dump下网页的source 源文件 

12  sftp  模拟ftp格式进入 一个交互式命令

服务器不需要  打开ftp服务,只要 

sftp -oPort=22   root@192.168.7.235

13 lastb  失败登入获取

14 watch 动态观察变化

wathc COMMAND 

默认2秒 

-n SECOND 指定秒数 

-d  颜色标明变化的部分

15 fsck

fsck 会自动检测文件系统类型 调用fsck.type ,但是检测之前最后做个模拟, 

fsck -N  进行模拟,看结果在真正执行,比如fsck可能会将某些扇区标为坏的扇区,但我们却希望从中恢复数据 

-A  

       -A     Walk  through  the /etc/fstab file 

fsck检测时一定不能在挂载状态

16 shell结合MySQL操作的方式

mysql -u $USER -p$PASS  << EOF 2> /dev/null 

create table students( 

id int, 

name varchar(100), 

mark int 

); 

EOF

17 ping  -c 个数 

注: 只要其中有一个值能够ping通,其ech $? 返回值就是  0,如果所有都ping不通 则返回值为1 (不成功)

18 打印出文件中从第二行开始的文件 

 tail -n +2

      -n, --lines=K 

              output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth

sed -n '2,$p'

同义词: 

    head -n -Kth 

     

19 ls 命令

ls -S  可以以大小进行排序,从大到小 

常用ls -lhS

ls -lhSr

ls -t 已修改的时间进行排序 

常用ls -lt (从最新的文件到最旧的)

ls -ltr

ls -n 显示uid 和 gid 而不是用户名和用户组

20 gzip 

用法 

gzip file 

默认  源文件被删除 生成  file.gz 

如何  保存源文件且输出压缩文件呢  可以使用-c 选项original

-c  Write output on standard output; keep original files unchanged. 

gzip -c file > file.gz 

联想: 

cat file1 file2 file3 | gzip > file.gz 

gzip -l  file.gz  检查文件的压缩比 

gunzip = gzip -d 

gunzip -c file.gz   能够保留原始文件

挂载磁盘,用于修复作用 

guestmount -a vm112x113.img -m /dev/sda2  /mnt   

21 找出当前你在哪个shell中 

echo “$0”  或者 ps -p $$  或者 ps $$

如何找出子的shell 在第几层  可不可以退出 ctrl + D 

找出子shell的层级或临时shell的嵌套层级,每个bash实例启动后,变量  $SHLVL 的值都会加一 

如 

echo “$SHLVL”

结果为1

输入 screen 

echo “$SHLVL”

结果为2

输入 bash

echo “$SHLVL”

结果为3

22  lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长 

23 find /data/ -name "*sum*" -type d

find /data -name “keyword” -type f 查找路径下关键字为keyword的文件

23 eval 

一 e v a l命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。

echo "Last argument os "$(eval echo \$$#)""

eval命令:将参数组合为一个新的命令,然后交给Shell执行

eval可以读取一连串的参数,并依参数本身的内容来执行命令。常用来处理Shell脚本中的变量,参数不限数目,参数用分号“;”隔开,如果命令后面不带参数或者参数为空,命令将返回0值。

Usage: eval [arg ...]

arg交给eval进行组合的参数

例:

1、编辑一个shell,先定义一个变量并赋值ls命令,之后把这个变量传递给eval

#!/bin/bash

#定义变量

command="ls -l /home"

eval $command   #访问变量前面加一个$符号。

2、把ls --color -l \作为参数传递给eval

linux@office:~$ eval 'ls --color -l \'

总计 72

-rwxrwxrwx   1 linux linux   106 2011-03-04 09:58 cmd

drwxr-xr-x   2 linux linux 4096 2011-03-04 09:15 Desktop

drwxr-xr-x 14 linux linux 4096 2011-03-04 08:00 Documents

drwxr-xr-x   4 linux linux 4096 2011-03-04 09:15 Downloads

-rw-r--r--   1 linux linux   619 2011-03-04 09:42 echo

  

24 删除本路径下 除某个文件外的所有

rm -rf `ls | grep -v "tmux”`

25 cp(scp) 中的重要选项

-p  preserver  保留文件的原有权限和时间戳

-r/-R  递归的拷贝目录

-a  等于-p -r -d

注:  scp -r d1 d2 的结果是  d2/d1

scp -r d1/* d2 的结果 d2/*

26 kill 掉某个用户, 强制这个用户退出

1 w 查看哪些用户登入

2 ps -ef | grep “pts/4”

3 kill 掉此用户的sshd进程即可

kill -9 17306

27 passwd -S  查看密码的最新更改时间,如果密码重来没有更改过可以判断此账户的创建时间了

[root@cui1 zhiliang]# passwd -S zhiliang

zhiliang PS 2015-08-02 0 99999 7 -1 (密码已设置,使用 SHA512 加密。)

28 多行变一行,如果有需要可以将多行实现成为一行

如果将由必要实现 两个参数到一行中, 可以试用xargs -n2

-n  Use at most max-args arguments per  command  line

注: 当然可以是用awk的多行处理技术实现(待研究)

29:awk -F ”正则表达式"

df -h | grep "/boot" | awk -F "[  \t%]+" '{print $5}’ 

30 

head 和 tail 的高级用法:

head

       -n, --lines=[-]K

              print the first K lines instead of the first 10; with the leading ‘-’, print all but the last K

              lines of each file

如使用方法: head -n-2  (如果k前面有-号,表示打印所有的,除了最后的2行)

tail

-n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth

如使用方法: tail -n+2   就是输出从第二行开始的所有行

输出从第二行开始,也就是过滤到了第一行

31 如何查看一个文件的完整access modify(文件内容被改变) change时间

ls -l filename 看到的只有月日 的modify时间

查看完整时间方法1  ls -l —full-time filename

stat filename

[root@cui1 zhiliang.cui]# ls -l --full-time trigge83_list

-rw-r--r-- 1 root root 232089 2015-08-09 06:21:40.388338770 -0400 trigge83_list

[root@cui1 zhiliang.cui]# stat trigge83_list 

  File: "trigge83_list"

  Size: 232089          Blocks: 456        IO Block: 4096   普通文件

Device: fd00h/64768d    Inode: 279504      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2015-08-09 06:20:26.695384447 -0400

Modify: 2015-08-09 06:21:40.388338770 -0400

Change: 2015-08-09 06:26:10.308193915 -0400

32 ftp客户端的问题

有原始的ftp yum install ftp 和 window上的 等,还有lftp yum install -y lftp

不同的命令可能支持的性不一样

比如: ftp 上传的时候   put localfile remotefile    (其中remotefile 不能省略也就是说只能重名名文件)

一般推荐使用lftp

用户名:密码@remotehost

lftp ftp: NGjZPR86KinJO69Vf@192.168.216.171

33 sh -c 的作用

-c string, shell方式 执行后面string中的一系列命令

 sh -c 'cd /data/zhiliang.cui; touch testfiel'

34 sudo 可以让你切换身份来进行某项任务,而不仅仅sudo 默认到root用户

sudo -u username 执行命令

su - username 执行命令

两者的区别

前者是以某个用户的身份去执行,而su - 是切换到这个用户去执行命令,会先登入,在执行命令,在执行完成之后,会退出!

所以,要以某个身份去执行命令,还是推荐sudo -u username,因为su - 的这种方式不是都能达到目的的

如:sshd 这个用户没有登入权限为nologin的 就不能用su - 来完成了

如:

注: 默认root 是可以不用密码,切换到任何用户的

且看:

[root@mail ~]# cat /etc/sudoers | grep root

## the root user, without needing the root password.

## Allow root to run any commands anywhere 

root    ALL=(ALL)   ALL

## cdrom as root

经典用法:

sudo -u zhiliang sh -c 'cd /home/zhiliang; touch 1' 

35 source filename.sh  和 ./filename.sh  和 sh filename.sh /root/filename.sh 的各种区别

./filename.sh  和 /root/filename.sh  相似必须要有执行权限和 首行

#/bin/bash 定义解释程序

不能filename.sh 的原因是shell终端会将它视为命令,而/root/filename.sh 是”/“开头的,shell就知道是一个文件,不是个命令

sh filename.sh 的是将这个sh脚本文件作为sh的参数执行

source filename.sh 的之前的执行方式的区别本质是,没有开始子shell,是在本shell的环境中执行!

[root@master ~]# cat test.sh 

#!/bin/bash

a=1

source test.sh

和 sh test.sh 

区别

是 source 执行的的时候 echo $a是有的,sh执行的是没有a这变量的

还有一个不常见的是exec  可以研究下

exec 3

cat <&3

36 nc 命令

nc包

nc-1.84-22.el6.x86_64 

-l 监听

-w 设置空闲超时,自动断开 ,默认不超时

-u UDP

用途:

1 传送文件

监听方  : nc -l 1234 > receive.txt

传送方: nc 192.168.7.235 1234 < send.txt

注: 传送方将,将一个文本文件,通过连接socket 传送个socket,监听方(接收方)将接收到的文件,输入到receive.txt 文件

2 传送目录

监听方  : nc -l 1234 |  tar xzvf -

传送方:  tar czvf - dir | nc 192.168.7.235 1234

3 扫描端口

nc -v -w 10 192.168.7.234 80

或一些列端口

nc -v -w 10 192.168.7.234 -z 80-100 

37 find 按返回查找一个模糊文件

find /data/path/… -name 1*.py

38 /dev/shm   linux内存设备目录入口

echo “abc-test” > /dev/shm/abc.txt

cat /dev/shm/abc.txt

作用: 需要快速提取的文件,可以这以写入这个目录下,一直在内存中的运行

注: 1 重启丢失 2 默认是内存的一半大小 3 文件系统是tmpfs 4 区别swap这个虚拟内存

39 screen 

screen -S name  创建一个这样的窗口 虚拟终端

screen -ls

screen -r name/id  恢复窗口

ctrl +a +d 退出但不关闭窗口

ctrl +a  +k 杀掉当前会话窗口

ctrl +a +z 将这个会话挂起回到 SHLVL=1 的状态(fg 1 恢复)

screen -d pid/name 将这个窗口置为离线

echo $SHLVL 可以检查是不是在窗口中还是在正常的shell终端中

screen -x 多个人同时可以看处于Attached的窗口动态(适合远程多个人需要看屏

幕) 

注: screen 中会话的三种状态

1 Attached  处于运行当中的,如果你要 screen -x name/pid 可以看 

2 Detached 处于离线的 screen -r name/pid 可以恢复到那个窗口

3 Dead 处于被kill -9 pid 杀死的,如果需要移除 screen -wipe pid/name

40 uname -i = arch 获取  hardware platform

41 shell 自定义函数库和引入函数库

shell函数互相调用的

 # Source function library.

. ./

一般自己写的函数推荐和函数库放在同一级目录下! 方便移动

42: 测试速度 ssh的吞吐量

yum install pv

yes | pv | ssh 192.168.7.235 "cat > /dev/null”

43 

客户端连接数据

mysql -h292.168.7.235  -uroot -p

基本数据库语法:

grant all on *.* to 'cui'@'192.168.7.235' identified by '12qwaszx';

 select user,password,host from mysql.user;

44 ssh使用自动化的选项

ssh $ip -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3  -o BatchMode=yes -o StrictHostKeyChecking=no 

45 shell命令组合

为了在当前shell中执行一组命令

()运算符:

    ( 命令;命令;命令… )

用处一般是,

ls b.txt || ( echo "one" && echo "two” )’ 

ls b.txt || ( echo "one" ; echo "two” ) 

46 mkpasswd 创建随机密码(可指定长度和复杂度)

常用于和  echo “password” | passwd —stdin   root   连用

mkpasswd -l 8 -s 2  

-l 密码长度

-s 特殊字符的个数

如结果: s|7dF5_V

echo “s|7dF5_V”   | passwd —stdin root

47 iptables和tcpdump经常不记得命令

tcpdump -nn port 53

iptables -A INPUT  -s 10.1.110.30 -p udp —dport 53

iptables -D  INPUT  number

-vv

-e  可显示mac地址

-nn 不反解

src 关键字 源ip地址

dst 目标地址

dst port 22 目标端口

srt port 22 源端口

or 或者

and 且

 tcpdump -vv dst port 22

tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)’

48 如何查看一个应用处于堵塞状态 如 DNS堵塞了

netstat -tulnp | grep 53

查看

查看第一个数字的大小,如果有堵塞就不为0

意义:

Recv-Q: 多少个bytes没有被传入到 socket当中 

Send-Q: 多少bytes没有被远端接收识别 

49 [ -s file ]  如果文件存在且有内容(文件中有内容)则为真

#!/bin/bash

if [!-s"b"]

then

    echo"空文件或者文件不存在"

else

    echo"文件中存在内容"

fi

~   

50 linux文件删除的原理

51 awk的多分割符

echo "-----1:-----2:"  | awk -F "[-:]+" '{print $2}'

52 三剑客取行

ifconfig eth0 | grep "inet addr" | awk -F "[ :\t]+" '{print $4}'

ifconfig eth0 | sed -n '2p' | awk -F "[ :\t]+" '{print $4}'

ifconfig eth0 |  awk -F "[ :\t]+" 'NR ==2 {print $4}'

注: NR: 当前处理的行号

52 linux中的正则 BRE(十个)和 ERE

1).   任意一个字符,但不含(\n)

2)*  匹配前面的0到无穷个重复次数

3)  [0-9]   匹配0-9

4) \  转义字符,将特殊字符还原本性

5) .*    任意字符,匹配重复任意次数

6)^   匹配行的的开头

7)$ 结尾

8)  \{n,m\}  匹配前面的n到m次   用egrep命令不需要转义

\{n,\}

\{n\}

egrep  --color=auto "r{1,5}" /etc/passwd

grep -E --color=auto "r{1,5}" /etc/passwd

等于

grep --color=auto "r\{1,5\}" /etc/passwd

 [[:alnum:]] means [0-9A-Za-z],

[[:space:]]  

ERE (egrep)

|

()  组

+

egrep  --color=auto "^(root|sshd):" /etc/passwd 

      A regular expression may be followed by one of several repetition operators:

       ?      The preceding item is optional and matched at most once.

       *      The preceding item will be matched zero or more times.

       +      The preceding item will be matched one or more times.

       {n}    The preceding item is matched exactly n times.

       {n,}   The preceding item is matched n or more times.

       {,m}   The preceding item is matched at most m times.

       {n,m}  The preceding item is matched at least n times, but not more than m times.

在man grep  过滤  REGULAR  进行查找

53 正则结合sed做替换

sed ’s#正则#不可用正则表达式#g’  作用替换为空

结合se的小括号分组的功能

ifconfig eth0 | sed -n 's#^.*inet addr:\(.*\)  Bcast.*$#\1#gp'

[root@master ~]# ifconfig eth0 | sed -n 's#^.*inet addr:\(.*\)  Bcast:\(.*\) M.*$#\1 \2#gp'

192.168.7.235 192.168.7.255

取数字权限

 stat file1 | sed -n 's#^.*s: (\([0-9]*\).*$#\1#gp'

等于

stat -c %a file1

54 tree的选项

tree -dL 2

-d 只打印目录

-L  打印的层级 -L 1只打印一级

-i 不缩进

-f 打印全路径

tree -idL 1 |egrep -v "^$|direct|\." | xargs du  -sh

55 运维最小化原则

1 系统最小化

2 服务启动最小化

3 操作最小化  rm -f file.txt (不用rm -rf file.txt)

4 登入最小化不用root

5 权限最小化

6 配置参数最小化

56 文件修改前进行备份

cp file file.ori

修改后对比

vimdiff file file.ori

57 

更改sshd_config

如何切换到root(有root权限)的方式:

注: 不能sudo 使用的命令

1 内置命令如 type

2 path中不能找到的命令

58 加大文件描述符

[root@shop-web01 ~]# ulimit -n

65536

默认是1024

/etc/security/limits.conf 

可直接执行

echo “*     -  nofile   65535” >> /etc/security/limits.conf

59 简单加密shell文件

方法一: gzexe

(加密同事压缩)

会把原来没有加密的文件备份为 file.sh~ ,同时 file.sh 即被变成加密文件

还原:

gzexe -d file.sh

60 防***

隐藏版本信息

> /etc/issue

61 锁定系统重要文件

上锁

chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow

解锁

chattr -i

A file with the ‘i’ attribute cannot be modified

62 默认的国外rpm源更改为国内源

http://mirrors.163.com/.help/centos.html

63 windows中文件的类型是通过扩展名(.txt)来区分的

file.txt

file是文件名 .txt是扩展名

linux的扩展名和文件类型没关系,只是沿用windows的习惯进行易于用户识别

64 linux中- 的文件为普通文件,按照文件内容又大致可分为三种

1 ASCII 纯文本文件

2 二级制文件,一般是可执行的命令  cat ls cd

3 data文件 数据格式文件,[root@www py]# file /var/log/wtmp

/var/log/wtmp: dat

通过file命令去判断普通文件的类型

65 过滤本路径下的目录

ls -l | grep “^d”

或者 tree -diL1  | grep “[a-Z]”

66 inode存储的信息,唯独不包含文件名

67 ssh工具

windows客戶端和linux服務器之間傳送工具

1 rz sz

2 winscp 基於ssh sftp

3 SFX(xshell)

4 sftp 基於SSH 加密傳輸

5 samba http ftp nfs

注意: sftp 连接方式:

 sftp -o Port=22  root@192.168.100.13

68 

. /etc/init.d/functions

专业脚本

#!/bin/bash

. /etc/init.d/functions

action  "scp ile to  remotedir is ok" /bin/true

69 :

25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found

其实,这不是一个错误。而是由于每次重启 NTP 服务器之后大约要 3 - 5 分钟客户端才能与 server 建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。

70 ssh 执行sudo命令

ssh 執行sudo命令

[ root@master ~]# tail -1 /etc/sudoers

oldbody         ALL=(ALL)   NOPASSWD: /bin/cp

[ oldboy@master ~]$ scp hosts  oldboy@192.168.100.13:~

hosts                                                                        100%  184     0.2KB/s   00:00    

[ oldboy@master ~]$ ssh  oldboy@192.168.100.13 sudo cp ~/hosts /etc/

sudo: sorry, you must have a tty to run sudo

解决方式: 2种

1 -t 选项

[ oldboy@master ~]$ ssh -t  oldboy@192.168.100.13 sudo cp ~/hosts /etc/     

Connection to 192.168.100.13 closed.

原理來源: 查看sudoers文件:

# Disable "ssh hostname sudo ", because it will show the password in clear.

#         You have to run "ssh -t hostname sudo ".

#

Defaults    requiretty

71 sort的深入

-r 

-n

-k

-t

对这个arp文件以ip地址的大小排序 (第三列排完排第四列)

cat.arp

192.168.0.1   00:0c:29:65:14:0f                        

192.168.1.10   00:0c:29:65:14:0f                        

192.168.20.9   00:0c:29:65:14:0f                        

192.168.0.10   00:0c:29:65:14:0f                        

192.168.1.11   00:0c:29:65:14:0f                        

192.168.10.10   00:0c:29:65:14:0f                        

192.168.200.8   00:0c:29:65:14:0f                        

192.168.19.2    00:50:56:f9:96:ad

结果:

[ oldboy@slave ~]$ cat arp.txt | sort -n -t"."  -k3,3 -k4.1,4.3

192.168.0.1   00:0c:29:65:14:0f                        

192.168.0.10   00:0c:29:65:14:0f                        

192.168.1.10   00:0c:29:65:14:0f                        

192.168.1.11   00:0c:29:65:14:0f                        

192.168.10.10   00:0c:29:65:14:0f                        

192.168.19.2    00:50:56:f9:96:ad                        

192.168.20.9   00:0c:29:65:14:0f                        

192.168.200.8   00:0c:29:65:14:0f 

命令解释:

 sort -n -t"."  -k3,3 -k4.1,4.3

以-n 数字排序,以-t"." 分列,以-k第三列的(第一个字符开始)到第三列的(最后字符)结束

在-k 第四列的第一个字符开始到第四列的三个字符排序为k结束

==   sort -n -t"."  -k3,3 -k4  虽然结果一样但后排序的时间要长(因为-k4 是一默认第一个字符到第四列结束 这样就会包括mac地址参与了排序)

72 awk的庖丁解牛

[ oldboy@slave ~]$ cat access.log 

http://www.baidu.com/index.html

http://www.12306.cn/jsp.php

http://www.sina.com.cn/index.html

http://www.12306.cn/jsp.php

http://www.sina.com.cn/index.html

http://www.12306.cn/jsp.php

http://www.taobao.com/

http://www.baidu.com/index.html

[ oldboy@slave ~]$ cat access.log  | awk -F '/' '{print $3}' | sort -rn | uniq -c

      1  www.taobao.com

      2  www.sina.com.cn

      2  www.baidu.com

      3  www.12306.cn

等于使用awk的数组方式进行排序统计

[ oldboy@slave ~]$ cat access.log  | awk -F '/' '{print $3}' |  awk '{++S[$NF] } END { for(k in S) print S[k],k }' | sort -n 

1  www.taobao.com

2  www.baidu.com

2  www.sina.com.cn

3  www.12306.cn

awk 的統計數組

awk '{++S[$NF] } END { for(k in S) print S[k],k }'

庖丁解牛:

S[]        定義一個名爲S的數組,在awk中,數組下飈通常是從1開始,而不是0

NF        當前記錄里域個數,默認以空格分隔,如上所示的記錄,NF域個數等於1

$NF        表示一行的最後一個域的值,$NF 等於$1在上述中

S[$NF]  表示數組元素的值,如上述表示網站爲key的值

++S[$NF]   表示把某個數加一,如上訴的記錄是把站點名加一

END         awk行處理完執行的語句塊

for (key in S ) 遍歷

print S[k],k  打印值

awk 的統計數組

awk '{++S[$NF] } END { for(k in S) print S[k],k }'

庖丁解牛:

S[]        定義一個名爲S的數組,在awk中,數組下飈通常是從1開始,而不是0

NF        當前記錄里域個數,默認以空格分隔,如上所示的記錄,NF域個數等於1

$NF        表示一行的最後一個域的值,$NF 等於$1在上述中

S[$NF]  表示數組元素的值,如上述表示網站爲key的值

++S[$NF]   表示把某個數加一,如上訴的記錄是把站點名加一

END         awk行處理完執行的語句塊

for (key in S ) 遍歷

print S[k],k  打印值

注意: awk可以直接处理文本,可以单独awk文本不需要cat下文本先,提高性能.

2统计netstat的tcp 连接状况的统计值

[ oldboy@slave ~]$ netstat -an |awk ' /^tcp/ { ++S[$6] } END {for (k in S ) print S[k]"\t"k}' 

2       ESTABLISHED

10      LISTEN

3 统计外网的IP地址不论什么状态

[ oldboy@slave ~]$ netstat -an |awk -F "[ :]+" '/^tcp/ { ++S[$6] } END {for (k in S) print k,S[k]}'  | grep "^[0-9]" | sort -n

0.0.0.0 5

192.168.100.10 1

192.168.100.1 1

73 文件如果有执行权限是可以tab不全出来的(目录是可以不全的,因为有执行权限)

如 /etc/init.d/rsyslog 是可以补全

而 /var/log/mes  是没法不全的

74 bash管道进行执行

 cat a.log | bash

75 过滤文件行中后面的几个字段

[ root@log_server zhiliang.cui]# cat column.log 

1 ls /etc/init.d/

2 cd /root/

33 bash x.sh 1 2

45 echo "abc" 

46 echo $?

[ root@log_server zhiliang.cui]# grep -o "[a-Z].*" column.log 

ls /etc/init.d/

cd /root/

bash x.sh 1 2

echo "abc" 

echo $?

注意: 如果第一列中有字母grep就不出了

去除文件中除第一列之外的所有列 

[ root@log_server zhiliang.cui]# cat column2.log 

1a ls /etc/init.d/

2b cd /root/

33 bash x.sh 1 2

45 echo "abc" 

46 echo $?

[ root@log_server zhiliang.cui]#  awk '{for(i=2;i<=NF;++i) printf $i " ";printf "\n"}' column2.log 

ls /etc/init.d/ 

cd /root/ 

bash x.sh 1 2 

echo "abc" 

echo $? 

或者:

awk '{for(i=2;i<=NF;++i) printf $i " "} {printf "\n"}' column2.log

注释:使用printf而不是用print的原因是print默认输出换行符,而printf默认不输出

76 ssh 拷贝id_rsa.pub 指定特殊端口

ssh-copy-id  "-p 58422 ldap-test03.beta" 

77.sort 的面试题

1 2 3 三个文件,只用到sort uniq -d uniq -u 

得出

X=1交集2交集3    cat 1.txt 2.txt 3.txt | sort | uniq -d

Y=1-2-3 取差集   cat 1.txt 2.txt 3.txt | sort | uniq -u

Z=1并集2并集3    cat 1.txt 2.txt 3.txt | sort | uniq 

sort 默认从下到大排序行

解释:

-d 显示有重复的行

-u 显示文件中不重复的行

78 面试题:

打印1到20之间的奇数

python方法:

In [7]: for i in range(1,20):

   ...:     if i%2 == 1:

   ...:         print i

shell 方法:

for((i=1;i<20;i++))

do

    if [$(($i%2))-eq1];then

        echo$i

    fi

done

或者

for i in`seq 120`

do

    if [$(($i%2))-eq1];then

        echo$i

    fi

done

79 面试题:

apache 的两种工作模式

prefork

worker

80 面试题:

http的请求和响应信息

请求:

HTTP请求的格式如下所示:

<request-line>
<headers>
<blank line>
[<request-body>]

如:

GET / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

Referer:

响应:

如下所示,HTTP响应的格式与请求的格式十分类似:

<status-line>
<headers>
<blank line>
[<response-body>]

正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

81 cookie 和session的区别

82 面试题:

假设Apache产生的日志文件名为access_log,在apache正在运行时,执行命令mv  access_log access_log.bak,执行完后,请问新的apache的日志会打印到哪里,请选择下列描述正确的是

解释:虽然此时文件被改名,但是由于服务正在运行,因为它的inode节点的位置没有变,程序打开的fd仍然会指向原来那个inode,不会因为文件名的改变而改变。apache会继续向已改名的文件中追加日志。

83 tcpdump 抓包 源地址 源端口

-vv

-e  可显示mac地址

src 关键字 源ip地址

dst 目标地址

dst port 22 目标端口

srt port 22 源端口

or 或者

and 且

 tcpdump -vv dst port 22

tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)'

84 tcp的三次握手和4次断开

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。 
(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。 
(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。 
(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。 
完成三次握手,客户端与服务器开始传送数据。

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。 
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。 
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。 
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。 
TCP采用四次挥手关闭连接如图2所示。

85 mysql忘记密码的快速处理方法:

killall mysqld

mysqld_safe --skip-grant-tables &

mysql -uroot 

update mysql.user set password=PASSWORD('12qwaszx') where User='root'

flush privileges;

quit

killall mysqld

/etc/init.d/mysqld start

ps -ef | grep mysql

86 清空zabbix的history表的数据

truncate table history;

历史数据保留14天

趋势数据保留3年

历史数据和趋势数据的区别

http://doc.okbase.net/doclist/archive/57552.html

注:

-- 清空全部数据,不写日志,不可恢复,速度极快

truncate  table  表名;

 

-- 清空全部数据,写日志,数据可恢复,速度慢

delete  from  表名

但是

mysql mysql 1635778560 2月  19 21:02 history.ibd

文件却没有被减小或者清空

item 的这个地方可以优化


通过 housekeeper 进程执行

如果完全情况history,一天的数据会没有,但是趋势数还是有的,趋势数据好几天的也会没有

实验得到的

87: 详细说明vim 写文件都磁盘的过程 面试题(越详细越好)

88

wget -q -P directory file

-P: 下载的目录前缀,默认是本目录

89 获取序列的方法:---自行体会

[andy@master ~]$ seq -s " " 1 100

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

[andy@master ~]$ 

[andy@master ~]$ 

[andy@master ~]$ echo {1..100} | tr " " "+"

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


当前题目:linuxshell总结历程
文章路径:http://scyanting.com/article/geipig.html