{"accounts":[{"name":null,"id":"4ea060742c76682ab800a807","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea060742c76682ab800a807","email":"skidave32289@gmail.com"},{"name":null,"id":"4ea06b5e2c76682aa6002ac5","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea06b5e2c76682aa6002ac5","email":"skidave32289+20@gmail.com"},{"name":null,"id":"4ea071862c766848c3000055","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea071862c766848c3000055","email":"skidave32289+21@gmail.com"},{"name":null,"id":"4ea075e02c766848c8000ae5","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea075e02c766848c8000ae5","email":"skidave32289+22@gmail.com"}]}
今天在rubyflow上看到一个不错的工具gem: json_formatter, 直接gem install后,就可以在命令行用了:
#curl -H 'EXAMPLE-API-KEY: b60b5400dd6f012eg16c12313b0ecdxc2' "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts?per_page=100" | json_formatter
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 5812 100 5812 0 0 3358 0 0:00:01 0:00:01 --:--:-- 11049
{
"accounts": [
{
"name": null,
"id": "4ea060742c76682ab800a807",
"email": "skidave32289@gmail.com",
"api_url": "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea060742c76682ab800a807"
},
{
"name": null,
"id": "4ea06b5e2c76682aa6002ac5",
"email": "skidave32289+20@gmail.com",
"api_url": "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea06b5e2c76682aa6002ac5"
},
{
"name": null,
"id": "4ea071862c766848c3000055",
"email": "skidave32289+21@gmail.com",
"api_url": "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea071862c766848c3000055"
}
]
}
#也可以直接输入字符串
#json_formatter "{}"
#curl -d "site=www.ccok.me" --data-urlencode "email=li+lei.hand-some2@yottaa.com" -H 'EXAMPLE-API-KEY: b60b5400dd6f012ec57c123112b0ecda2' "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts"
#!/bin/bash
#Parameters
USER=root
HOST=
#Configuration file
#Please check if the file exists
CONFIG_FILE=/Library/Preferences/SystemConfiguration/preferences.plist
SWITCH=0
case $1 in
0|1)
SWITCH=$1
LINE=`grep -n 'SOCKSEnable' $CONFIG_FILE | cut -d: -f1`
sudo awk '{if(NR == "'$LINE'" + 1)print "'$SWITCH' ";else print $0}' $CONFIG_FILE > $CONFIG_FILE.tmp
sudo mv $CONFIG_FILE $CONFIG_FILE.bak
sudo mv $CONFIG_FILE.tmp $CONFIG_FILE
echo "Modify configuration file successfully!"
if [[ $SWITCH == 1 ]]; then
echo "*************"
echo "Starting ssh tunnel.."
ssh -Nf -D 0.0.0.0:8082 $USER@$HOST
echo "Done!"
echo "You are outsite the GFW now:-)"
else
echo "Stopping ssh tunnel.."
kill `ps aux | grep "ssh -Nf" | grep -v grep | awk '{print $2}'` > /dev/null
echo "You are insite the GFW now:-("
fi
;;
*)
echo "need 0|1, exit"
exit 1
esac
sudo ./fuucck_gfw.sh 11是开启,0是关闭,执行完就OK了.
最后, 上面的脚本还不是最完善的, 原因在于, 每次修改完系统的Network配置后会重新载入当前的网络配置, 但是shitou怎么找都没找到在Mac中怎样用命令来reload网络配置的, 所以在你执行完上面的脚本后, 还需要在System Preferences中打开Proxies, 然后做一次SOCKS Proxy的配置改变, 就是点两下前面的单选框,然后点OK, Apply就行了, 有知道怎么在Mac中通过命令来reload网络配置的同学可以告诉我, 这样这个脚本就完善了, 真正的一键凸墙凹墙...
awk不支持多维数组, 在官方的文档中所说的多维数组并不是传统语言所说的多维数组,awk的多维数组是如:
awk '{
if (max_nf < NF)
max_nf = NF
max_nr = NR
for (x = 1; x <= NF; x++)
vector[x, NR] = $x
}
END {
for (x = 1; x <= max_nf; x++) {
for (y = max_nr; y >= 1; --y)
printf("%s ", vector[x, y])
printf("\n")
}
}'
在某些情况下需要使用传统多维数组的方式对数据进行统计,生成例如
arr[key] = [field1, filed2, filed3]
这样的数据结构,虽然awk默认不支持这样的数据结构,但是我们可以自己以另一种方式实现,比如上面的数据结构可以变成这样:
arr[key] = "field1@field2@field3"; split(arr[key], arr2, "@")
就是以字符串分割的方式,然后再用split还原, 下面是一个例子,统计下面文件中第一个field重复行的后面字段进行相加,并添加几个filed实现比例统计, 文件是这样的, file.txt:
1270022377 17 0 0 0 0.00 0.00 0.00 1270022399 9 0 0 0 0.00 0.00 0.00 1270022377 17 0 0 0 0.00 0.00 0.00 1270538893 16 8 2 0 50.00 12.50 0.00 1270022399 9 0 0 0 0.00 0.00 0.00 1270538893 16 8 2 0 50.00 12.50 0.00
shell:
awk 'BEGIN{print("Ad View Hit Reg Pay Hit(%) Reg(%) Pay(%)");} \
1{if($1 in a) { \
split(a[$1], b, "@"); \
a[$1]=sprintf("%s@%s@%s@%s@%s", $1, int($2)+int(b[2]), int($3)+int(b[3]), int($4)+int(b[4]), int($5)+int(b[5])); } \
else { \
a[$1]=sprintf("%s@%s@%s@%s@%s", $1, int($2), int($3), int($4), int($5))} \
}; \
END{for(line in a) { \
split(a[line], c, "@"); \
printf("%s %s %s %s %s %.2f %.2f %.2f\n", c[1], c[2], c[3], c[4], c[5], \
int(c[3])/int(c[2])*100, \
int(c[4])/int(c[2])*100, \
int(c[5])/int(c[2])*100); \
}}' file.txt
结果:
Ad View Hit Reg Pay Hit(%) Reg(%) Pay(%) 1270538893 32 16 4 0 50.00 12.50 0.00 1270022377 34 0 0 0 0.00 0.00 0.00 1270022399 18 0 0 0 0.00 0.00 0.00
#file: get_innodb_db_size.sh
#author: shitou
#date: 09/18/2008
#aim: get mysql db table size, especially for Innodb table
#use: first replace the db username and password,
# #./get_innodb_db_size username db_name
[[ $# == 0 ]] && { echo "need the db name and mysql username"; exit 1; }
mysql -u $1 -p -e "show table status from $2\G" | \
awk '/(Data_length:|Name:)/{print $0}' | \
awk 'BEGIN{i=1;
total=0;
print "DB: '"$2"'";
print "-----------------------------------";};
{if(i%2==0){size=$2;printf "%-30s%d\n", table, size}
else
{table=$2};i++;total+=$2};
END{print "-----------------------------------";
split(i/2, num, ".");
printf "TOTAL TABLE:%25d\n", num[1];
printf "TOTAL SIZE:%25d B\n", total}'
#EOF
有时我们会进入一个很深层次的目录,同时需要进入其他目录,这时来回切换就显得非常繁琐,这时你可以使用:
#cd -
或者history, 然后! 数字 来执行历史命令, 当然也可以用向上箭头翻出历史命令, 不过当你不是一条命令进入上一目录时就用cd - 是最方便的了
最近遇到要处理两个文件的情况, 以前都是用awk处理一个文件的, 两个的还没遇到过,在网上找了下 :
QUOTE:
1、用某一文件的一个域替换另一个文件中的的特定域?
http://bbs.chinaunix.net/forum/viewtopic.php?t=500015
文件passwd:
s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw
文件shadow:
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::
用shadow文件中的密文部分替换passwd中的"x",生一个新passwd文件,如下所示
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw
[Copy to clipboard] [ - ]
CODE:
awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwd
NR==FNR,第一个文件shadow,以$1为下标,将$2的值赋给数组a
NR>FNR,第二个文件passwd,将文件shadow$2的值赋值给文件passwd
其中:
NR是指已经处理的记录数目
FNR是指当前文件已经处理的记录数目
由于共有两个文件,所以当处理第一个文件的时候NR与FNR是相等的
处理第二个文件的时候NR是大于FNR的,此时的NR=文件一的记录数目+FNR
QUOTE:
2、
cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
cat file2:
I0011 11111
I0012 22222
I0014 55555
I0013 66666
规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555
[Copy to clipboard] [ - ]
CODE:
awk 'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a[b]}' file2 file1 >file3
QUOTE:
3、如果文件a中包含文件b,则将文件b的记录打印出来
http://bbs.chinaunix.net/forum/viewtopic.php?t=520411
文件a:
10/05766798607,11/20050325191329,29/0.1,14/05766798607
10/05767158557,11/20050325191329,29/0.08,14/05767158557
文件b:
05766798607
05766798608
05766798609
通过文件a和文件b对比,导出这样的文件出来.
10/05766798607,11/20050325191329,29/0.1,14/05766798607
a
[Copy to clipboard] [ - ]
CODE:
wk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{($2 in a);print $0}' b a
awk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{($2 in a);print $0}' b a
QUOTE:
4、
file1文件内容
1 0.5 100
10 15 36.5
file2文件
50 10 9
3.2 1 5
将两个文件合成一个文件如:
51 10.5 109
13.2 16 41.5
就是对应的字段进行相加以后的数字。
awk '{for (i=1;i<=NF;i++) a=$i
getline <"file2"
for (i=1;i
printf $NF+a[NF] "\n"}' file1
[Copy to clipboard] [ - ]
CODE:
awk '{for (i=1;i<=NF;i++) a[i]=$i;getline <"file2";for (i=1;i
QUOTE:
5、
文件a
1000 北京市 地级 北京市 北京市
1100 天津市 地级 天津市 天津市
1210 石家庄市 地级 石家庄市 河北省
1210 晋州市 县级 石家庄市 河北省
1243 滦县 县级 唐山市 河北省
1244 滦南县 县级 唐山市 河北省
b文件:
110000,北京市
120000,天津市
130000,河北省
130131,平山县
130132,元氏县
这样的字段
a中第二列在b中可能有可能没有,需要把有的匹配起来生成新的一列:要包含a和b的第一列。没有匹配的按照b原来的格式进行输出。
[Copy to clipboard] [ - ]
CODE:
awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' a b
QUOTE:
6、
file1的第一列与file2的第3列相同,
file1的第二列与file2的第4列的3-5位相同,
file1的第三列与file2的最后一列相同,
# cat file1
AAA 001 1000.00
BBB 001 2000.00
DDD 002 4000.00
EEE 002 5000.00
FFF 003 6000.00
# cat file2
01 1111 AAA WW001 $$$$ 1000.00
02 2222 BBB GG001 %%%% 2000.00
03 3333 CCC JJ001 **** 3000.00
04 4444 DDD FF002 &&&& 4000.00
05 5555 EEE RR002 @@@@ 5000.00
06 666 FFF UU003 JJJJ 6000.00
07 777 III II005 PPPP 7000.00
08 8888 TTT TT008 TTTT 8000.00
[Copy to clipboard] [ - ]
CODE:
# awk 'NR<=FNR{a[$1]=$1"x"$2"x"$3}
> NR>FNR{b=substr($4,3);c=$3"x"b"x"$6;if(c==a[$3]) print}' file1 file2
01 1111 AAA WW001 $$$$ 1000.00
02 2222 BBB GG001 %%%% 2000.00
04 4444 DDD FF002 &&&& 4000.00
05 5555 EEE RR002 @@@@ 5000.00
06 666 FFF UU003 JJJJ 6000.00
转载自:http://xb9he.bokee.com/6410534.html
多个文件重命名
$ EXT=`date "+%m%d%y.%H.%M"`
$ find . -type f -name "name" | xargs -i mv {} {}.$EXT
在shell中(), {}的区别可能平时不太注意的,但如果真正理解了他们的区别的话,更有助于理解shell,
()和{}都是用来包含代码块的,()将会重新fork一个子进程,在shell中父进程的变量及资源都会继承到子进程,反过来不行,{}多是用来定义函数时用的,所以就比较好理解了,还是先打开shell动下手:)
$a=1
$echo $a
$1
${ b=1; echo $b; }
$1
$echo $b
$1
$(c=1;echo $c)
$1
$echo $c
$
从上面的执行结果就可以看出来了,最终的echo $c的结果为空,因为c的定义是在()开启的子进程中定义的,不能传递到当前shell(即父进程)的.
理解了上面的,理解exec与source(或者.)的区别就比较简单了,
exec command_or_script 将会开启一个子进程来运行后面的command或者是script, 并且将同时终止当前父进程
source script_name 一般用在调用其他脚本到当前文件环境中来,相当于ruby的require或者php的include, 调用的脚本文件同当前文件位于同一进程
可以试下:
$exec echo "hello" > file
执行后你当前登录的shell将会退出,让你重新登录, 同时hello将会写入file中
摘抄一些不错的shell技巧
网 络新手的经历:按下服务器(运行基于 Redmond 的操作系统)DVD 驱动器上的 Eject 按钮时,它会立即弹出。他然后抱怨说,在大多数企业 Linux 服务器中,如果在那个目录中运行某个进程,弹出就不会发生。作为一名长期的 Linux 管理员,我会重启机器。如果我不清楚正在运行什么,以及为何不释放 DVD 驱动器,我则会弹出磁盘。但这样效率很低。
下面介绍如何找到保持 DVD 驱动器的进程,并轻松弹出 DVD 驱动器:首先进行模拟。在 DVD 驱动器中放入磁盘,打开一个终端,装载 DVD 驱动器:
# mount /media/cdrom
# cd /media/cdrom
# while [ 1 ]; do echo "All your drives are belong to us!"; sleep 30; done
现在打开第二个终端并试着弹出 DVD 驱动器:
# eject
将得到以下消息:
umount: /media/cdrom: device is busy
在释放该设备之前,让我们找出谁在使用它。
# fuser /media/cdrom
进程正在运行,无法弹出磁盘其实是我们的错误。
现在,如果您是根用户,可以随意终止进程:
# fuser -k /media/cdrom
现在终于可以卸载驱动器了:
# eject
fuser 很正常。
尝试以下操作:
# cat /bin/cat
注意!终端就想垃圾一样。输入的所有内容非常零乱。那么该怎么做呢?
输入 reset。但是,输入 reset 与 输入 reboot 或 shutdown 太接近了。吓得手心冒汗了吧 — 特别是在生产机器上执行这个操作时。
放心吧,在进行此操作时,机器不会重启。继续操作:
# reset
现在屏幕恢复正常了。这比关闭窗口后再次登陆好多了,特别是必须经过 5 台机器和 SSH 才能到达这台机器时。
来自产品工程的高级维护用户 David 打电话说:“为什么我不能在您部署的这些新机器上编译 supercode.c”。
您会问他:“您运行的是什么机器?”
David 答道:“ Posh”。(这个虚够的公司将它的 5 台生产服务器以纪念 Spice Girls 的方式命名)。这下您可以大显身手了,另一台机器由 David 操作:
# su - david
转到 posh:
# ssh posh
到达之后,运行以下代码:
# screen -S foo
然后呼叫 David:
“David,在终端运行命令 # screen -x foo”。
这使您和 David 的会话在 Linux shell 中联接在一起。您可以输入,他也可以输入,但彼此可以看到对方所做的事情。这避免了进入其他层次,而且双方都有相同的控制权。这样做的好处是 David 可以观察到您的故障诊断技巧,并能准确了解如何解决问题。
最后大家都能看到问题所在:David 的编译脚本对一个不在此新服务器上的旧目录进行了硬编码。将它装载后再次编译即可解决问题,然后 David 继续工作。您则可以继续之前的娱乐活动。
关于此技巧需要注意的一点是,双方需要以同一用户登录。screen 命令还可以:实现多个窗口和拆分屏幕。请阅读手册页获取更多相关信息。
对于 screen 会话,我还有最后一个技巧。要从中分离并让它打开,请输入 Ctrl-A D (即按住 Ctrl 键并点击 A 键。然后按 D 键)。
然后通过再次运行 screen -x foo 命令可以重新拼接起来。
有很多次,我所在的站点需要某人的远程支持,而他却被公司防火强阻挡在外。很少有人意识到,如果能通过防火墙到达外部,那么也能轻松实现让外部的信息进来。
从本意讲,这称为 “在防火墙上砸一个洞”。我称之为 SSH 后门。为了使用它,必须有一台作为中介的连接到 Internet 的机器。
在本例中,将这样台机器称为 blackbox.example.com。公司防火墙后面的机器称为 ginger。此技术支持的机器称为 tech。图 4 解释了设置过程。
以下是操作步骤:
-R 标记通过 SSH 从 ginger 连接到 blackbox.example.com。假设您是 ginger 上的根用户,tech 需要根用户 ID 来帮助使用系统。使用 -R 标记将 blackbox 上端口 2222 的说明转发到 ginger 的端口 22 上。这就设置了 SSH 通道。注意,只有 SSH 通信可以进入 ginger:您不会将 ginger 放在无保护的 Internet 上。
可以使用以下语法实现此操作:
~# ssh -R 2222:localhost:22 thedude@blackbox.example.com
进入 blackbox 后,只需一直保持登录状态。我总是输入以下命令:
thedude@blackbox:~$ while [ 1 ]; do date; sleep 300; done
使机器保持忙碌状态。然后最小化窗口。
root@tech:~# ssh thedude@blackbox.example.com .
thedude@blackbox:~$: ssh -p 2222 root@localhost
在这个技巧中,我将介绍几个其他方法,用于从需要进行验证、故障诊断或给予远程支持的系统收集重要信息。
首先,收集关于处理器的信息。通过以下命令很容易实现:
# cat /proc/cpuinfo 。
这个命令给出关于处理器的速度、数量和型号的信息。在许多情况下使用 grep 可以得到需要的值。
我经常做的检查是确定系统中处理器的数量。因此,如果我买了一台带双核处理器的四核服务器,我可以运行以下命令:
# cat /proc/cpuinfo | grep processor | wc -l 。
然后我看到值应该是 8。如果不是,我会打电话给供应商,让他们给我派送另一台处理器。
我需要的另一条信息是磁盘信息。可以使用 df 命令获得。我总是添加 -h 标记,以便看到以十亿字节或兆字节为单位的输出。# df -h 还会显示磁盘的分区情况。
列表最后是查看系统固件的方式 —— 一个获取 BIOS 级别和 NIC 上的固件信息的方法。
要检查 BIOS 版本,可以运行 dmidecode 命令。遗憾的是,不能轻易使用 grep 获取信息,所以这不是一个很有效的方法。对于我的 Lenovo T61 laptop,输出如下:
#dmidecode | less
...
BIOS Information
Vendor: LENOVO
Version: 7LET52WW (1.22 )
Release Date: 08/27/2007
...
这比重启机器并查看 POST 输出有效得多。
要检查以太网适配器的驱动程序和固件版本,请运行 ethtool:
# ethtool -i eth0
driver: e1000
version: 7.3.20-k2-NAPI
firmware-version: 0.3-0
另外: ethtool eth0; 可用于管理网卡的双工,速率等工作模式
shell里的数组在平时事情的情况比较少,感觉主要是操作复杂,而且没有方便的函数使用,使用起来比较晦涩,
这里简单写下吧,什么时候用到也说不定:)
#声明一个数组fruit, 也可以不用
declare -a fruit
#赋值,有点像ruby的方式,注意一定不能这样赋值('apple', 'banana', 'pear')
fruit=(apple banana pear)
#也可以指定索引赋值
fruit[10]='other'
#取出第一个值,和其他编程语言一样索引也是从0开始
echo ${fruit[0]}
#数组长度
echo ${#fruit[*]}
遍历数组
length=`expr ${#fruit[*]} - 1`
for i in `seq 0 length`
do
echo ${fruit[i]}
done
也可以这样
for i in `echo ${#fruit[*]}`
do
echo $i
done
#销毁一个数组的方法和销毁函数一样
unset fruit
感觉shell的数组没有awk中的好用,还是awk强大
Rails默认的数据库表都是用的Innodb,MySQL对Innodb表的备份不同于MyISAM表,由于Innodb对事物等特性的支持所以不能用传统备份MyISAM表的方法来备份Innodb数据,MyISAM表数据的备份方式总结下有:
其中直接拷贝数据库目录的方式不适用于Innodb表,而且mysqldump在对Innodb表进行数据备份时也必须加上特殊的参数,所以自己就写了一个shell脚本,用来备份Innodb表,并且压缩
#!/bin/bash
#author: shitou
#date: 08/24/2008 13:52
#aim: backup all innodb database and gzip it, for MySQL5.x
#params
MYSQL_USER='name'
MYSQL_PWD='passwd'
MYSQL_HOST='localhost'
#bin paths
MYSQL='/usr/bin/mysql'
MYSQLDUMP='/usr/bin/mysqldump'
#db to backup, separate by blank
DBS='friends faming shitoublog suzhousage bone'
#output directory
DEST='/root/script/mysql_innodb_backup'
NOW="$(date +%d-%m-%Y)"
[ ! -f $DEST ] && mkdir -p $DEST
TMP='tmp'
if [ -f $DEST/$TMP ]; then
rm -rf $DEST/$TMP
else
mkdir -p $DEST/$TMP
fi
for db in $DBS
do
$MYSQLDUMP -u$MYSQL_USER -p$MYSQL_PWD -h$MYSQL_HOST \
--skip-opt --single-transaction --add-drop-table --create-options --quick \
--extended-insert --set-charset --disable-keys $db > $DEST/$TMP/$db-$NOW.sql
done
cd $DEST && tar zcvf mysql-$NOW.tar.gz $TMP > /dev/null
[ -d $TMP ] && rm -rf $TMP
定制参考脚本中的注释
在网上看到个命令的小总结,发现里面有几个平时还不知道,贴出来吧,回顾用
系统
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量
资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载
磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况
网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息
进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态
用户
# w # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务
服务
# chkconfig --list # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务
程序
# rpm -qa # 查看所有安装的软件包
#!/bin/bash
MyUSER="SET-MYSQL-USER-NAME" # USERNAME
MyPASS="SET-PASSWORD" # PASSWORD
MyHOST="localhost" # Hostname
# Linux bin paths, change this if it can't be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
# Backup Dest directory, change this if you have someother location
DEST="/backup"
# Main directory where backup will be stored
MBD="$DEST/mysql"
# Get hostname
HOST="$(hostname)"
# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"
# File to store current backup file
FILE=""
# Store list of databases
DBS=""
# DO NOT BACKUP these databases
IGGY="test"
[ ! -d $MBD ] && mkdir -p $MBD || :
# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
# Get all database list first
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
for db in $DBS
do
skipdb=-1
if [ "$IGGY" != "" ];
then
for i in $IGGY
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$db.$HOST.$NOW.gz"
# do all inone job in pipe,
# connect to mysql using mysqldump for select mysql database
# and pipe it out to gz file in backup dir :)
$MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
fi
done
