linux系统维护相关命令

基础命令

fdisk -l  查看磁盘物理硬盘

df -hal   查看已挂载的硬盘空间使用情况

smartctl -H /dev/sda  检查硬盘坏道


linux下的日期格式化:

date -d '-30 day' +"%Y%m%d"


让python支持https:

yum install openssl-devel

yum install openssl 

编译python


查看内核参数:

sysctl -a


添加用户

useradd -d /data/home/tom -s /bin/sh -g group –G root tom

groupadd test1 


查找io过高的进程:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"     # stat D    Uninterruptible sleep (usually IO)


防火墙设置:

vi /etc/sysconfig/iptablesservice iptables restart

添加白名单:

    iptables -I INPUT -s 1.1.1.1 -j ACCEPT

    去掉白名单:

    iptables -D INPUT -s 1.1.1.1 -j ACCEPT

增加黑名单:

    iptables -I INPUT -s 1.1.1.1 -j DROP  // -s 表示来源

去掉黑名单:

iptables -D INPUT -s 1.1.1.1 -j DROP  // 删除

    iptables -I INPUT -p tcp -dport 80 -s 124.115.0.0/24 -j DROP // 添加

    iptables -D INPUT -p tcp -s 1.1.1.1 --dport 60020 -j DROP

    iptables -I INPUT -p tcp -s  1.1.1.1 --dport 60020 -j DROP

    iptables -L


网卡设置:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

service network restart (或者用ifup)


批量远程操作:

基于sshpass(开源代码,网上可以找到,本机设置StrictHostKeyChecking no),参考http://blog.csdn.net/songbohr/article/details/5610789


常用的性能检测命令:

iostat vmstat top mpstat  netstat lsof  gprof(编译选项)strace  opcontrol(这个单独列)


软件安装卸载:

yum -y install(remove)

rpm


查找文件:

find / -name "*." -exec {} \;

find / -name "" | xargs ...

find /*/kankan/ -name "*.flv" -size +100M|xargs ls -lh

find ./ -name "*.log" -mtime +7 -type f | xargs rm -f   #查找超过7天的文件并删除

find . -type f -name "*.txt" | xargs -i cp{}  /tmp/k/   // xargs指定参数的位置,就是 {} 处

find . -type f -name "*.txt" | xargs -I {} cp {}  /tmp/n/   //同上,可以自己定义替换符 ls *.zip | xargs -n1 unzip  // xargs指定参数个数


远程拷贝文件:

scp  /  nc


流量查看:

sar -n DEV 1 100   (每1秒 100个样本)

iftop  (http://www.ex-parrot.com/~pdw/iftop/)

iptables:

iptables -nvL


shell下的循环:

arr=("a" "b" "c");for i in ${arr[@]};do echo $i;done

for i in `grep -F "tgp#" *|awk -F ":" '{print $1}'|sort|uniq` ; 

do 

        echo $i

sed -i -e "s#set passwd [ eval exec "curl -s \"http://127.0.0.1:54321/\""]

spawn#set passwd [ eval exec \"curl -s \\\\\"http://127.0.0.1:54321/\\\\\"\"]\nset passwd [ eval exec "curl -s \"http://127.0.0.1:54321/\""]

spawn#g" ./${i}

        sed -i -e "s:send \"old_pass:send \"\$passwd:g" ./${i} 

done

#!/bin/env sh

for ((i=0;i<17;++i))

do

    echo $i

    start_pos=`expr ${i} '*' 10000`

    end_pos=`expr ${start_pos} + 10000`

    echo "select ip from table order by ip limit ${start_pos},10000;" |xargs -0 mysql -uuser -hdbhost -DDatabase -ppassword -e  > ./${start_pos}_${end_pos}.txt

done

sed -i -e "s:^$str.*:new_line:g"

source(.) 命令

表示在当前shell的上下文里面执行, 如果直接运行脚本,会fork一个新进程,就不会改变当前shell环境


nc命令:

服务端监听

nc -l -p 12134 < /svr_file   (有些版本不用指定 -p)

客户端:

nc svr_ip 12134 > /local_file


strace的一个例子:

strace -c -e trace=network -p 7697

strace -f 启动进程  // 可以跟踪到子进程


samba:

1.安装

yum -y install samba

2.配置

/etc/samba/smb.conf

[global]

        workgroup = WORKGROUP

        printing = cups

        printcap name = cups

        printcap cache time = 750

        cups options = raw

        map to guest = Bad User

        include = /etc/samba/dhcp.conf

        logon path = \\%L\profiles\.msprofile

        logon home = \\%L\%U\.9xprofile

        logon drive = P:

        usershare allow guests = Yes

        add machine script = /usr/sbin/useradd  -c Machine -d /var/lib/nobody -s /bin/false %m$

        domain logons = Yes

        domain master = Yes

        local master = Yes

        os level = 65

        preferred master = Yes

        security = user

        null password = yes

        guest account = root

[admin]

        comment = 

        inherit acls = Yes

        path = /home/share

        read only = No

        public = Yes

        guest ok = yes

3. 启动服务

service smb restart


shell下求差集的3个方法

sort B B A | uniq -u            //这个是如果A中有,B中没有,则肯定只会出现一次

grep -F -f listb lista -v       //这个是将文件listb作为一个表达式去lista中查找

comm a.txt b.txt


替换linux下文件名中的空格

find ./ -name "*.mp3" -exec rename " " "_" {} \;


共享内存:

ipcs: 检查共享内存

ipcrm:删除共享内存的某个条目


查看所有进程相关信息:

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu | grep -v grep|grep regps -eo pid,lstart,etime | grep 目标进程id

ps -eo lstart,pid,args 


sed使用的几个例子:

sed -e 's:dat:dat/lol:g' succeed_files_lol.txt > succeed_files_lol_replace.txt

sed -i -e 's:dat:dat/lol:g' succeed_files_lol.txt  # -i 表示在文件内直接替换

sed -in-place -e 's:dat:dat/lol:g' succeed_files_lol.txt sed -n '6p' /usr/local/bin/caiji_mgr.log_tmp.3  显示6行

find /usr/local/vpn/ -name "*.py"|xargs sed -i -e 's:c1405:twin13014:g'

sed -i -e 's:\:ujson:g' input_out_file  #全字匹配

sed -i -e '/spawn/a test_sed_insert hahah' temp.txt  #在匹配到spawn开头后,添加一行test_sed_insert hahah

ip=`/sbin/ifconfig|grep -F "255.255.254.0"|awk '{print $2}'`; line=`echo "\"agentip\":\"$ip\","`; echo $line; sed -i -e "/\"btserver_is_bridge/a ${line}" /usr/local/gse/gseagent/conf/gse.conf   在文件中插入一行

sed -i -e "${md5lineno}{s:${md5src}:${md5}:g}" ${yaml}   #在指定的行数位置 进行替换

cat /proc/sys/fs/file-nr   #查看系统文件句柄数

cat /proc/sys/fs/file-max  #系统最大文件句柄数


ssh的端口映射:

ssh -N -f -L $local_port:$dest_mms root\@$remote


tcpdump的例子:

tcpdump -i any  -X -s 0 tcp and port 10089 and tcp[32:2]==0xcf00

-i any 抓取所有网卡

-s 0 表示显示整个包的长度(自适应)

-X 表示 16进制吧

-nn 表示端口号用数字显示,不转义 tcp[32:2]==0xcf00  表示从tcp包头开始算起,32到34字节

tcpdump ip[2:2] > 100  // ip包长度大于100

tcpdump -i any -nn host XX and \(port 3089 or port 7008 or port 9000\)

tcpdump -i any 'port 10020 and ip[2:2] > 1000'


收集进程内存信息的脚本:

setsid watch -n 1800 "(date >> /home/root1/test_watch_mem.txt;pmap 19509|awk '{num[\$2]++}END{for(m in num)printf(\"%s %d\\n\",m,num[m])}' >>/home/root1/test_watch_mem.txt)"


绑定网卡中断:

将网卡与cpu绑定:

1.首先查看/proc/interrupts文件,找到每个网卡对应的中断号(第一列的数字);2.修改相应/proc/irq/中断号/smp_affinity的值(16进制数),只将对应cpu的那一位置1(从最右边开始计算),例如echo 04 > smp_affinity,即将该网卡绑定到cpu2上(第3个cpu,因为索引号从0开始)

如果网卡是 PCI-MSI  或者 PCI-MSIX的,当中断不均衡时,可以手工绑定中断到不同cpu,比如:

echo "2" > /proc/irq/90/smp_affinity   表示将 90 中断绑定到2号cpu

“3” 二进制11,表示1和2个cpu

“f”  1111,表示1/2/3/4 cpu 

如果绑定要生效,需要关闭服务:

service irqbalance stop 

绑定网卡的shell脚本:

#!/bin/sh

process_list=`ps -eaf|grep xl_proxy|grep -v grep|awk '{print $2}'`

cpu_index=0

for pid in ${process_list}

do

        echo "pid=${pid},cpu_index=${cpu_index},cmd=taskset -cp ${cpu_index} ${pid}"

        taskset -cp ${cpu_index} ${pid}

        cpu_index=`expr $cpu_index + 1`

        cpu_index=`expr $cpu_index % 8`

done


邮件字符集:

/usr/local/monitor-base/bin/sendEmail -o message-charset=zh_CN.GB18030 message-charset= 需要和系统的字符集一致,不然会产生编码的乱码


linux下远程批量操作:

http://sourceforge.net/projects/sshpass/files/latest/download ;

基于sshpass的脚本(go):

#!/bin/sh

id=$1

remote_cmd=$2

list_file="./1111.txt"

echo "list_file=$list_file"

ip=`grep "^$id" $list_file|head -n 1|awk '{print $1}'`

pass=`grep "^$id" $list_file|head -n 1|awk '{print $3}'`

user=`grep "^$id" $list_file|head -n 1|awk '{print $2}'`

echo "ip=$ip,user=$user,pass=$pass"

./sshpass -p "$pass" ssh  $user@$ip "$remote_cmd"

远程命令需要按下面的方式传进去,不然sshpass不能解释

echo ${remote_cmd}|xargs

./sshpass -p "$pass" ssh  $user@$ip  -o StrictHostKeyChecking=no

其中1111.txt的内容:ip user  pass   desc


shell调试:

sh -x  


linux下上传/下载文件

sz  /  rz

// 加上这些参数,避免出现乱码

rz -y -e -b -O -Z

为了方便,可以在 .bash_profile里面添加:

alias myrz="rz -y -e -b -O -Z"


网络tcp连接情况(比netstat快):

/usr/sbin/ss -tnoemi


linux设置tcp心跳:

# echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time    #300秒没有数据,启动检查

# echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl      #每30秒检查一次,有响应了则停止

# echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes  #检查次数,如果次数用完,则认为连接断开


使用curl命令上传文件(模仿表单形式):

curl -F auth_appid=tgppic -F fileid=604a0b50d9d64d9592753b9aa7371fcd -F deal_flag=1  -F [email protected] "http://ip:8080/path"


将tab替换成4个空格:

find ./ -name "*.py"|xargs sed -i "s:\t:    :g"


域名分析:

dig domain


删除日志:

35 12 * * * find /data/home/ -mtime +7 -type f -name "*.log" | xargs rm -f


shell的xargs的问题:

cmd="df -h|awk '{print $5}'|grep -v Use|awk -F'%' '{print $1}'"

echo "$cmd"|xargs echo     ---- error!!!

结果为:

df -h|awk {print }|grep -v Use|awk -F% {print }

echo "$cmd"|xargs -0 echo    ---- 正确!!!, 当有特殊字符时,需要带上参数 -0


用grep搜索点号:

grep -F "10.10"   (用grep -e 时,点号会转义)

搜索ip(正则)

grep "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" -REnoa * -r

更简单的搜索ip的方法:

grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" target_file


防止echo转义:

a="grep tom ./*.log"

echo $a        #不加引号,会导致*号展开

echo "${a}"  #加引号,防止通配符展开

echo -E "\n"  #特殊字符不进行转义


环境变量:

/etc/profile --全局环境变量

/etc/init.d/sshd --ssh继承

/etc/init.d/cron --crontab继承

可以在cront脚本里面添加:

. /etc/profile

. ~/.bash_profile 


core文件的生成规则:

cat /proc/sys/kernel/core_pattern


查看指定进程的实时cpu占用:

/usr/bin/top -p ${pid} -bcn 1|grep lbs_conn|awk '{print $(NF-4)}'|cut -d . -f 1

/usr/bin/top -p ${pid} -bcn 1|grep lbs_conn|awk '{print $9}'|cut -d . -f 1


shell基础知识(条件判断):

文件表达式

-e filename 如果 filename存在,则为真

-d filename 如果 filename为目录,则为真 

-f filename 如果 filename为常规文件,则为真

-L filename 如果 filename为符号链接,则为真

-r filename 如果 filename可读,则为真 

-w filename 如果 filename可写,则为真 

-x filename 如果 filename可执行,则为真

-s filename 如果文件长度不为0,则为真

-h filename 如果文件是软链接,则为真

filename1 -nt filename2 如果 filename1比 filename2新,则为真。

filename1 -ot filename2 如果 filename1比 filename2旧,则为真。

整数变量表达式

-eq 等于

-ne 不等于

-gt 大于

-ge 大于等于

-lt 小于

-le 小于等于

字符串变量表达式

If  [ $a = $b ]                 如果string1等于string2,则为真

                                字符串允许使用赋值号做等号

if  [ $string1 !=  $string2 ]   如果string1不等于string2,则为真       

if  [ -n $string  ]             如果string 非空(非0),返回0(true)  

if  [ -z $string  ]             如果string 为空,则为真

if  [ $sting ]                  如果string 非空,返回0 (和-n类似) 

    逻辑非 !                   条件表达式的相反

if [ ! 表达式 ]

if [ ! -d $num ]               如果不存在目录$num

    逻辑与 –a                   条件表达式的并列

if [ 表达式1  –a  表达式2 ]

    逻辑或 -o                   条件表达式的或

if [ 表达式1  –o 表达式2 ]


交换区的处理:

swapoff -a

dd if=/dev/zero of=/data/swapfile1bs=1024 count=2097152  #用zero填充目标文件,块大小是1024,块个数是2097152

mkswap /data/swapfile1

swapon /data/swapfile1

cat /proc/swaps


shell下求字符串子串:

a="test.txt.dat"

echo "${a: -4}"   输出为  .dat

echo "${a:0:4}"  输出为 test


简单的加密解密文件:

加密脚本:

#! /usr/bin/expect

set src_file [lindex $argv 0]

set dst_file [lindex $argv 1]

spawn openssl enc -aes-256-cbc -in $src_file -out $dst_file 

expect {

"*assword:"

{

send "加密口令\n"

}

}

expect {

"*assword:"

{

send "加密口令\n"

}

}

interact

解密脚本:

#! /usr/bin/expect

set src_file [lindex $argv 0]

set dst_file [lindex $argv 1]

spawn openssl enc -aes-256-cbc -d -in $src_file -out $dst_file 

expect {

"*assword:"

{

send "加密口令\n"

}

}

interact

openssl aes256 -in machine_list.txt -e -pass env:DATA_PSWD > machine_list.dat


shell中的变量问题:

管道会开启子shell,则子shell中的变量赋值不会影响到父shell 

cat $C | grep -v '^#' | while read LINE    开启了一个子shell,

do

     if [ "x$A" = "x1" ]; then

         export B=$A

         echo $B

     fi

done

在子shell中对B重新赋值是不能影响到父shell的,所以最后echo $B时值没有改变。

while read LINE

do

   if

   B=$A

   fi

done<$C

这样是可以重新赋值的


shell中的随机数:

echo $RANDOM

http://blog.csdn.net/fdipzone/article/details/24329523)


linux下分割和合并文件:

(dd if=XXX1.tar.gz;dd if=XXX2.tar.gz)  > big1.tar.gz

split -b 8G ./XXX.log


linux下测试mtu值:

ping -c 3 -s 1472 -M do 10.1.1.1


stat文件:

Access : 文件最近一次被访问的时间

Modify:  文件内容最近一次被修改的时间

Change: 文件属性最近一次被改变的时间


用dd快速生成100M的文件:

dd if=/dev/zero of=test bs=1M count=100

dd if=/dev/zero of=test bs=1M count=0 seek=100


重启dns缓存服务

service nscd restart


mysql导出数据

只导出数据库结构

mysqldump -hXX -P3306 -utest -pXX -d dbname > ./test.sql

 导出结构和数据

mysqldump -hXX-P3306 -utest -pXX dbname> ./test_with_data.sql

导入数据

mysql -hXX -P3306 -utest -pXX -Ddbname < ./test_with_data.sql

你可能感兴趣的:(linux系统维护相关命令)