您的位置:首页 > 运维架构 > Shell

吐血贡献我常用的shell命令

2009-04-01 11:31 471 查看
1.有点乱,呵呵.高手就不要看了!
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSED:无连接是活动的或正在进行
  LISTEN:服务器在等待进入呼叫
  SYN_RECV:一个连接请求已经到达,等待确认
  SYN_SENT:应用已经开始,打开一个连接
  ESTABLISHED:正常数据传输状态
  FIN_WAIT1:应用说它已经完成
  FIN_WAIT2:另一边已同意释放
  ITMED_WAIT:等待所有分组死掉
  CLOSING:两边同时尝试关闭
  TIME_WAIT:另一边已初始化一个释放
  LAST_ACK:等待所有分组死掉
netstat -an | grep -i "127.0.0.1:80" | awk '{print $6}' | sort | uniq -c | sort -n
统计TCP各个连接状态的数量
netstat -na | grep -c ":80"
显示并发进程
ls -l
按文件大小排序
/Data/apps/httpd/bin/apachectl stop
/Data/apps/httpd/bin/apachectl start
重启和停止apache
netstat -an|grep '192.168.0.1:80'
mail 收邮件
修改邮件路径可以在/etc/profile里修改
history 查看历史的运行指令
查看访问80端口的连接
ls -al
列出当前所有档案(包含隐藏档)及所有的档案属性
alias lm='ls -al'
type ls
查看ls是内建指令还是非内建指令
curl -I 127.0.0.1
telnet 127.0.0.1 11211
telnet 127.0.0.1 25
SHOW VARIABLES LIKE 'have_query_cache';
通过have_query_cache服务器系统变量指示查询缓存是否可用:
SHOW VARIABLES LIKE 'query_cache_size';
取得查询缓存大小
SET GLOBAL query_cache_size = 40000;
FLUSH QUERY CACHE
可以使用FLUSH QUERY CACHE语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。
RESET QUERY CACHE
从查询缓存中移出所有查询
/Data/apps/apache/bin/apachectl -t
/Data/apps/apache/bin/apachectl -k graceful
Error: Table 'xxx' is marked as crashed and should be repaired
REPAIR TABLE `xxx`;
[root@pilot bin]# /Data/apps/mysql/bin/perror 29
OS error code 29: Illegal seek
查询错误代码描述信息
SELECT name, db FROM mysql.proc LIMIT 0 , 30;
查询存储过程列表
lsof | grep mysql
从哪里看描述符
lsof | grep error_log
rsync -az --delete --progress /home/www/test /home/www/test2
本地同步
/usr/bin/rsync -vzrtopg --progress -e ssh [email=root@10.10.208.5]root@10.10.208.5[/email]:/etc/hosts /etc/
mysqldump -h127.0.0.1 -uusername -ppass dbname > db.sql
导出数据库
sftp [email=username@127.0.0.1]username@127.0.0.1[/email]
连接sftp
get /var/www/index.php index.php
下载远程主机文件到本地
put index.php /home/www/index.php
上传本地文件到远程主机
lpwd
查看本机目录
if [ -s /tmp/php-error.log ]
then
DATE=`date +%y%m%d`
cp /tmp/php-error.log /logs/php_error_log/php-error$DATE.log
cat /dev/null > /tmp/php-error.log
gzip -9 /logs/php_error_log/*.log
else
echo ok
fi
=============================================================
dir=`cd /Data/cache;ls | grep "/.old"`
for dirname in $dir
do
cd /Data/cache;find ./$dirname/ -name '*' -exec rm -rdf {} /; >/dev/null 2>&1 &
done
dir = `cd /Data/webapps/360quan.com;ls"
for dirname in $dir
do
echo dirname
done
echo md5(uniqid(microtime()));
生成唯一标识
explorer http://www.sohu.com
mysqladmin -h127.0.0.1 -uroot create 1111
mysqladmin -h127.0.0.1 -uroot status;
mysqladmin -h127.0.0.1 -uroot drop 1111
mysqladmin -h127.0.0.1 -uroot processlist;
mysqladmin -h127.0.0.1 -uroot ping
mysqladmin -h127.0.0.1 -uroot version
mysqladmin -h127.0.0.1 -uroot shutdown
关闭mysql服务器
svn log url
svn info
svn ls
explorer e:
打开E盘
ls | vim -
Vim 能从标准输入读取文本
zfap zo
设置折叠与打开折叠
:colo default
语法高亮设置
CTRL-Z
在vim中把vim先挂起。fg命令
:!ls 从vim内执行单个shell命令
service mysql restart
/etc/init.d/mysql start|stop|restart|reload|force-reloads
ps -A | grep mysql
查看运行的mysql进程
kill后重启mysql
Can't open file: 'group_lists.MYI' (errno: 145)/n的解决方案
repair table group_lists
SELECT benchmark( 100000000, 'select * from group_lists' )
检测Mysql的性能
SELECT * FROM group_lists PROCEDURE ANALYSE ( )
分析各个子段类型大小是否设置合适
ps -ef|grep httpd|wc -l
http://127.0.0.1/server-status
apache信息查看
php_flag engine off 对于不需要php权限的目录或者虚拟主机设置加上这个
ls -al 查看所有文件包括隐藏文件
htpasswd -c /tmp/.htpasswd admin
建立一口令文件,文件名为.htpasswd,用户名为admin
.htaccess文件
AuthName admin-only
AuthType Basic
AuthUserFile /tmp/.htpasswd
require user admin
/Data/apps/apache/bin/httpd -k restart
重启apache
scp /home/scw/group2.sql [email=sunchangwei@192.168.0.2]sunchangwei@192.168.0.2[/email]:/home/sunchangwei
SCP的新命令,这个命令可以在主机间进行大数据量的交互。而且在局域网中传数据,可以达到10MB/S.详细的命令格式,可以用man scp进行查询
gzip 压缩命令
mysql -uroot -p tablename < tablename.sql
导入数据
update mysql.db set db ='group2' where user = 'group';
ll -t
按时间排序
ll -S
按大小排序
awk '{print "space"}' /etc/passwd
awk '{print}' /etc/passwd
awk -F":" '{print $1}' /etc/passwd
awk -F":" '{print "username" $1 "/t/tuid" $3}' /etc/passwd
awk /var/'{print}' /etc/passwd > var.txt
会对/etc/passwd中的每一行执行正则表达式/var/筛选出来保存到var.txt
awk '{print $1}' /etc/passwd | tee passwd.txt
输出到文件的同时也在屏幕上显示
awk 'BEGIN {print "Name Belt/n-----------------------------------"}{print $1"/t",$4}' grade.txt
awk '$4 ~ /Brown/' grade.txt
打印信息头
Name Belt
-----------------------------------
M.Tans Green
J.Lulu green
P.Bunny Yellow
J.Troll Brown-3
L.Tansl Brown-2
awk 'BEGIN {print "Name/n--------"}{print $1} END {print "end-of-report"}' grade.txt
打印信息尾
awk 'BEGIN {print "Name/n--------"}{print $1} END {"end-of-report"}'
awk '{if($4 ~ /Brown/) print $1}' grade.txt
使用操作符和正则例子
awk 'gsub(/48317/,6666){print $0}' grade.txt
把记录中匹配/48317/的替换为6666
sed -n '2p' quote.txt 只打印第二行
sed -n '1,3p' quote.txt
打印第1到3行
sed -n '1,$p' quote.txt 显示一个文件的所有行
sed -n '1p' quote.txt 打印第一行
sed -n '$p' quote.txt 打印最后一行
find /Data/logs -type f -mtime +5 -exec rm {} /;
在logs目录中查找是文件并在5天以前被更改
find -type f -print | xargs file
find -name "*.php"
在当前目录下查找所有扩展名php的文件
find /Data/ -type d
查找目录下的所有目录
grep -i -c "usp" data.f
在data.f文件中查找usp,不区分大小写,只返回匹配的行数
grep -r 'GroupProfileDAO::exist' ./
grep -r 'GroupProfileDAO::exist' *.php 只查找php文件
grep -n -r 'GroupProfileDAO::exist' *.php
加上行号
mysqladmin -uroot ping &>dev/null
mysqladmin -h127.0.0.1 -uroot -proot processlist
mysqladmin -h127.0.0.1 -uroot -proot version
mysqldumpslow -s c -t 5 24.slow.comment.20080822 > 24.slow.comment.20080822.log -g | grep -v local
mysqldumpslow -s c 10.slow.log.20080825 | grep -i notice_message | wc -l
mysqldumpslow -s c -t 20 myqlslow.log
找出查询次数最多的前20条sql
mysqldumpslow -s t -t 20 mysqlslow.log
找出查询时间最多的前20条sql
echo "That is all right, this is a great job." > test.txt
head -n 1 /etc/issue
查看操作系统版本
df -h 查看各分区的使用情况
last | grep "heiyeluren" | wc -l
查看用户登陆日志
ls *[0-9]*
显示包含数字的文件名和目录名
mkdir -p /tmp/dir1/dir2
创建一个目录树
rm -f file1
删除一个叫做 'file1' 的文件'
rmdir dir1
删除一个叫做 'dir1' 的目录'
find /dir1/dir2/ -name /*.php
在此目录中查找以php结尾的文件
du -sh dirname
估算dirname所占用的磁盘空间
df -h | grep 50%
cat /etc/group
查看所有用户组
groupadd group_name 添加一个用户组
groupdel group_name 删除一个用户组
groupmod -n newGroupname oldGroupname 重命名一个用户组
bzip2 file1
压缩一个叫file1的文件
bunzip2 file1 解压缩文件
gzip file1
gunzip file1
more /var/log/messages
查看大文件内容
grep Aug -R /var/log/*
type command
查看command指令是内建指令还是外建
read -p "Please keyin your name: " -t 30 named
读取来自键盘输入的变量,并加上提示,超过30秒没动作自动停止
a[0]="apple"
a[1]="orange"
a[2]="banana"
for b in ${a};do
echo $b
done
shell数组循环例子
echo "empty" >> test1.$$
basename dir 从路径中分离出文件名
cat f1 f2 >> f3
把f1和f2的内容合并到f3
diff f1 f2
dirname 跟basename相反
file filename 用来确定文件类型
logname 显示当前使用的登陆用户名
简单的if控制语句
=======================
if [ -d f1 ]; then
echo "is dir"
else
echo "not dir";
fi
==================================
function checkUser(){
name[0]="admin"
name[1]="test"
name[2]="sysadmin"
name[3]="op"
for row in ${name};do
if [ $row = $1 ];then
return 0
fi
done
return 1
}
pass=N
read -p "please input login username:" -t 30 username
while [ $pass = N ];do
if checkUser $username;then
echo "username pass"
exit 1
else
read -p "pass not right,please input again:" -t 30 username
fi
done
======================================
简单的用户验证脚本
if cp myfile myfile.bak;then
mysqldump -h127.0.0.1 -uroot notice > /tmp/notice.sql
cd /tmp
sftp [email=root@127.0.0.1]root@127.0.0.1[/email]
get notice.sql
rm -fr notice.sql
mysql ad1 < /tmp/ad.sql -uroot -p
导入数据
temph=`date | cut -c12-13`
截取date的第12个和第13个字符
echo -e "/033[34m qweqwe "
RESET QUERY CACHE;
清理查询缓存
SHOW VARIABLES LIKE 'have_query_cache';
INSERT INTO user
SELECT *
FROM user
WHERE user.user = 'group' ON DUPLICATE
KEY UPDATE user.user = 'notice'
UPDATE user SET PASSWORD = md5( 'notice.tiger' ) WHERE User = 'notice'
原来mysql的md5和password不一样
group2
INSERT INTO db
SELECT *
FROM db
WHERE db.user = 'group2' ON DUPLICATE
KEY UPDATE user.user = 'group2'
INSERT INTO mysql.db
SELECT *
FROM mysql.db
WHERE mysql.db.user = 'notice' ON DUPLICATE
KEY UPDATE mysql.db.user = 'noticea'
修改数据库权限后要重启mysql才能生效
/usr/local/bin/convert lifestyle_logo.gif -resize 90x90 out.gif
which php
which convert
查找命令的目录文件
/usr/local/bin/convert -mattecolor "#000000" -frame "3x3" lifestyle_logo.gif remember.gif
为图片加边框,边框颜色是黑色,边框宽度和高度都是3px
/usr/local/bin/convert -fill green -pointsize 40 -draw 'text 10,50 "google"' lifestyle_logo.gif fill.gif
为图片加文字,用green颜色 字体大小40,距离左上角10*50位置,文字为google
/usr/local/bin/convert animation.gif frmae%02d.gif
把gif文件分解为一系列的单个图片
- 遠端登錄
ssh [email=user@remote.machine]user@remote.machine[/email]
- 遠端執行
ssh [email=user@remote.machine]user@remote.machine[/email] 'command ...'
- 遠端複制
scp [email=user@remote.machine]user@remote.machine[/email]:/remote/path /local/path
scp /local/path [email=user@remote.machine]user@remote.machine[/email]:/remote/path
id username
last
df -h
显示所有磁盘系统的信息
show variables like 'datadir'
显示mysql的数据库目录
mysqladmin -h127.0.0.1 -uroot variables
如何修改mysql的默认帐号root
use mysql;
update user set password=password('passowrd') where user='root';
flush privileges; 刷新内存中的权限表
使用mysqladmin和set password,会自动重载该表
mysql>grant all on db.* to 'test'@'%' identified by 'test';
上例运行后的效果是,test用户可通过‘test’密码从任意计算机上访问db数据库。‘%’代表任意字符,‘_’代表一个任意字符。主机名部份还可以是IP地址
 flush logs;
ALTER TABLE table_name DISABLE KEYS;
禁用索引
ALTER TABLE table_name ENABLE KEYS;
启用索引
% mysqldump --opt testdb | gzip > /data/backup/testdb.bak
#--opt选项会对转储过程进行优化,生成的备份文件会小一点,后的管道操作会进行数据压缩
% mysqldump --opt testdb mytable1,mytable2 | gzip > /data/backup/testdb_mytable.bak
#可在数据库后接数据表名,只导出指定的数据表,多个数据表可用逗号分隔
delete from table_name;
or
truncate table table_name 与
delete from table_name where 1;区别
查看mysql运行以来连接计数
show status where variable_name = "Connections";
查看当前客户连接数量
show status where variable_name ="Threads_connected"
语法:
UNIQUE KEY `test` (`xref_key`,`xref_dbname`)
UNIQUE KEY `xref_key` (`xref_key`,`xref_dbname`)
上述语法检查xref_key与xref_dbname的组合是否是唯一值,可以设定多个字段的组合。其中,test是索引表中的字段名称。
该方法适合用来解决多个字段相互依赖,且必须满足唯一性的条件的情况。在经常新增或删除资料表中auto_increment的primary key会造成大量的断层,这类易变动的资料表使用auto_increment并不是一个很适合的索引值,所以可以采取unique key来处理。
rm -fr clean*
SELECT count(1)
FROM group_members
WHERE date_join > '2008-08-22 09:14'
AND date_join < '2008-09-09 10:44'
mysql时间比较
加了新的apache vhost文件, 重启apache前请用apachectl configtest 测试配置文件.

======================================================
通过网站日志做网络爬虫和恶意访问分析
今天公司网站系统发生短暂的访问中断,虽然临时性的通过重启网站服务达到正常运作的目的,但是后续的分析工作还是要做的。首先使用命令
cat www.access.log |grep spider -c 和
cat www.access.log |wc
分别查看有爬虫标志的访问次数和合计的总页面访问次数,发现还有爬虫标志的访问次数超过总访问次数的 10%, 访问显得有些不正常。使用
cat www.access.log |grep spider|awk ‘{print $1}’|sort -n|uniq -c|sort -nr
命令查看爬虫来ip地址来源,发现主要来至于 124.115.4.*和124.115.0.* 这两个地址段。
在防火墙上对其地址做限制。
/etc/sysconfig/iptables 中添加规则
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -s 124.115.0.1/24 -j REJECT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -s 124.115.4.1/24 -j REJECT
service iptables restart 使限制生效
一些已知的爬虫可以在 http://www.wangzhongyuan.com/archives/367.html 看到。可以针对自己的情况做一下分析处理,有选择性的让一些爬虫来访问。当然这个地址列出的都是一些比较有名的爬虫,如Googlebot, Baiduspider,Sogo,Yahoo等都是比较上规矩的,对他们可以通过robots.txt进行爬虫访问规则的设置,而那些较稀奇的比如这里列出的 Sosospider等就没有被列出,所以更多的小爬虫和恶意的访问还是要自己来具体分析处理的。
从网站日志文件中找出爬虫和恶意访问
一般可以对网站访问日志做分析,通过分析单位时间里面某个ip访问服务器的次数等信息来找出爬虫的来源地址和恶意访问的来源地址,比如通过
cat www.access.log |awk ‘{print $1 ” ” substr($4,14,5)}’|sort -n|uniq -c|sort -nr|head -20
这么一个命令就可以列出在一分钟内访问网站次数最多的前20位ip地址。
而通过
cat www.access.log |grep 60.190.128.6 |awk ‘{print $1 ” ” substr($4,14,5)}’|sort -n|uniq -c|sort -nr|head -20
这个命令则可以查看一天中某个ip地址对网站服务器的访问时间分段情况。
对这些命令中表现出的数量比较突出的一些ip地址,一般来说就是有问题的ip了,在配合
cat www.access.log |grep ip地址
可以看看这些高强度的地址访问都在干些什么。是不是正常访问,如果不是就要考虑是否要做限制了。
======================================================
用shell分析网站的访问情况

随着网站正式运行,我们可以通过通用的免费日志分析工具比如awstats获得一些实际访问网站的信息,例如每天ip量,pv量,用户所用的的浏览器,用户所用的操作系统等,但是有时候希望通过手工方式从WEB日志文件中获得一些信息,下面列出了一些最近一段时间我经常在用的命令
获得访问前10位的ip地址
cat access.log|gawk ‘{print $1}’ |sort|uniq -c|sort -nr |head -10
访问次数最多的文件或页面
cat access.log|gawk ‘{print $11}’|sort|uniq -c|sort -nr
通过子域名访问次数,依据referer来计算,稍有不准
cat access.log | awk ‘{print $11}’ | sed -e ‘ s/http://////’ -e ‘ s///.*//’ | sort | uniq -c | sort -rn | head -20
列出传输大小最大的几个文件
cat www.access.log |awk ‘($7~//.php/){print $10 ” ” $1 ” ” $4 ” ” $7}’|sort -nr|head -100
列出输出大于200000byte(约200kb)的页面以及对应页面发生次数
cat www.access.log |awk ‘($10 > 200000 && $7~//.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面
cat www.access.log |awk ‘($7~//.php/){print $NF ” ” $1 ” ” $4 ” ” $7}’|sort -nr|head -100
列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat www.access.log |awk ‘($NF > 60 && $7~//.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
列出传输时间超过 30 秒的文件
cat www.access.log |awk ‘($NF > 30){print $7}’|sort -n|uniq -c|sort -nr|head -20
列出当前服务器每一进程运行的数量,倒序排
ps -ef | awk -F ‘ ‘ ‘{print $8 ” ” $9}’ |sort | uniq -c |sort -nr |head -20
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: