基础命令
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