# linux终端
# 命令有它就够GitHub-Linux-command
# 脚本编写
# 常用命令ls、unzip、ps
# linux中的>、>>、<、<<、2>、2>>、2>&1、&>、&<,总归要面对的
简单了解一下标准输入输出,执行一个shell命令行时通常会自动打开三个标准文件
- (1) 、标准输入文件(stdin):通常对应终端的键盘。
- (2)、标准输出文件(stdout)。
- (3)、标准错误输出文件(stderr)。
(2)和(3)这两个文件都对应终端的屏幕。
进程将从标准输入文件中得到输入数据。
将正常输出数据输出到标准输出文件[显示器]。
将错误信息送到标准错误文件中[显示器]。
# 重定向:改变标准输入/输出的方向
- 1、重定向标准输出,包括两种。
- (1)、
>(覆盖),等价1>:将命令执行的结果输出到指定文件,非显示器。 - (2)、
>>(追加),等价1>>:将命令执行的结果追加到指定文件,非显示器。
- (1)、
- 2、 重定向标准输入,包括两种。
- (1)、
<:将命令中接收的输入途径,由键盘改为指定文件。 - (2)、
<<[Here Document]:命令序列传递到一个交互程序或者命令中。
- (1)、
- 3、 重定向标准错误,包括两种。
- (1)、
2>(覆盖):将命令执行的结果输出到指定文件。 - (2)、
2>>(追加):将命令执行的结果追加到指定文件。
- (1)、
# 补充
- 1、重定向标准输出和重定向标准错误到同一个文件中
- 有以下的几种方式
- (1) 、
2>&1 - (2) 、
>& - (3) 、
&>
- (1) 、
- 有以下的几种方式
- 2、 两个特殊文件
- (1) 、
/dev/null:过滤标准错误信息,意思就是不想显示结果就输出到这里面。 - (2) 、
/dev/zero:创建指定长度的文件
- (1) 、
# 案例
echo "使用>输出到文件shellFile">shellFile.txt
echo "使用>>追加内容到shellFile">>shellFile.txt
echo "使用>覆盖全部内容">shellFile.txt
//清空文件
>shellFile.txt
2
3
4
5
# 7个shell脚本实例
# 文件以日期命名,并写入磁盘使用情况
#!/bin/bash
#################################################
#文件以日期命名,并写入磁盘使用情况
#################################################
d=`date +%Y-%m-%d` ##获取日期
logfile=$d.log ##定义日志文件名
df -h > $logfile ##向文件写入磁盘使用情况
2
3
4
5
6
7
# 统计日志文件中各个IP的访问量
#!/bin/bash
#################################################
##取文件IP|排序|去重并统计各个IP重复数量|排序
#################################################
awk '{print $1}' 1.txt |sort -n |uniq -c |sort -n
2
3
4
5
# 计算Linux系统所有进程占用内存之和
#!/bin/bash
#################################################
#计算Linux系统所有进程占用内存之和
#################################################
sum=0
#利用for循环调取每一项进程所使用的内存,并依次求和
for mem in `ps aux |awk '{print $6}' |grep -v 'RSS'`
do
sum=$[$sum+$mem] ##内存求和
done
echo "the usered mem $sum" ##输出结果
2
3
4
5
6
7
8
9
10
11
# 监控远程机器的存活,发现宕机示警
#!/bin/bash
#################################################
#监控远程机器的存活,发现宕机示警
#################################################
#假设远程机器IP为114.114.114.114
ip=114.114.114.114
d=`date +%Y-%m-%d` ##获取日期
#while循环做循环监控,"while :"为死循环
while :
do
#使用ping命令,取丢包率的数值作为存活的判断依据
n=`ping -c2 $ip 2> /dev/null |grep 'received' |awk -F 'received, |%' '{print $2}'`
n1=`echo $n |sed 's/[0-9]//g'`
#判断取值是否为空
if [ -z "$n" ]
then
echo "error"
exit
#判断取值是否为数字
elif [ -n "$n1" ]
then
echo "error"
exit
#若丢包率不低于20%,则发送告警
elif [ $n -ge 20 ]
then
#这里也可做外发邮件告警
echo "more loss"
else
echo "$d : $ip is OK" > ip_monitor.log
fi
#监控间隔为30秒
sleep 30
done
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
# 批量修改指定目录下文件名、打包并还原文件名
#!/bin/bash
#################################################
#批量修改指定目录下文件名、打包并还原文件名
#################################################
#将目标文件夹下的所有指定类型文件的文件名查找存在指定文件中
find /home/scripts -type f -name "*.txt" > /home/scripts/txt.list
#通过for循环遍历所有文件,并依次改名
for f in `cat /home/scripts/txt.list`
do
mv $f $f.bak
done
#定义一个时间命名的目录作为打包文件的目录
d=`date +%F`
mkdir /home/scripts/txt_$d
#将所有改名文件依次拷贝到打包文件的目录下
for f in `cat /home/scripts/txt.list`
do
cp $f.bak /home/scripts/txt_$d
done
#进入指定目录下进行打包
cd /home/scripts
tar -czvf txt.tar.gz txt_$d
#还原文件名
for f in `cat /home/scripts/txt.list`
do
mv $f.bak $f
done
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
注:虽然打包的文件多了一层文件名,但是对于还原文件名变得十分容易
# 判断本机80端口是否监听,如果不存在,则重启服务并发送邮件告警
#!/bin/bash
###########################################################
#判断本机80端口是否监听,如果不存在,则重启服务并发送邮件告警
###########################################################
#判断本机80端口是否监听,并执行相应动作(使用命令行作为判断条件时,命令行正确执行即满足if条件,且用于判定的命令行不需要加反引号)
if netstat -ntpl |grep -q ':80 '
then
exit
else
#这里也可做外发邮件告警
echo "error"
#service nginx restart
fi
#判断是否启动成功,如未成功,则将错误信息通过邮件进行告警
n=`pgrep -l httpd |wc -l` #列出所有httpd进程的pid
if [ $n -eq 0 ]
then
touch /tmp/nginx_start.err
/usr/local/nginx/sbin/nginx start 2> /tmp/nginx_start.err
fi
if [ -s apache_start.err ] #if -s 选项,文件大小非0时为真
then
#这里也可做外发邮件告警
echo "error"
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
注:持续监控可以采用任务计划或while循环
# 多地备份数据库(本地保留一周、远程保留一月)
#!/bin/bash
###########################################################
#多地备份数据库(本地保留一周、远程保留一月)
#date +%Y # 年份(四位) eg: 2018
#date +%y # 年份后两位 eg: 18
#date +%m # 月 eg: 07
#date +%d # 日 eg: 10
#date +%H # 24小时 eg: 11
#date +%M # 分 eg: 37
#date +%S # 秒 eg: 24
#date +%w # 星期(0-6) 0 表示周日
#date +%F # 完整日期 =%Y-%m-%d
#date +%T # =%H:%M:%S 时间 eg: 10:46:45
###########################################################
d1=date +%w
d2=date +%y-%m-d
bakdir='/backup'
r_bakdir='远程备份的IP地址':'远程备份的目录' #通过ssh同步
rs_bakdir='远程备份的IP地址'::'模块名称' #通过服务同步
#定义接下来的命令涉及到的所有的正确输出记录在正确日志的目录下,所有的错误输出记录在错误日志的目录下
exec 1> '正确日志的目录' 2>'错误日志的目录'
echo "mysql backup begin at `date +"%F %T"`"
#备份到本地机器的文件以星期命名,周期为7天,超出7天后,同名的旧文件会被新文件覆盖
mysqldump -u'指定的用户' -p'指定的密码' '指定的数据库' > $bakdir/$d1.sql
#备份到远程机器的文件以日期命名,周期为31天,超出31天后,同名的旧文件会被新文件覆盖
rsync -az $bakdir/$d1.sql $r_bakdir/$d2.sql
echo "mysql backup end at `date +"%F %T"`"
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
# 19个强大有趣好玩又装B的命令
# 1.sl 命令
你会看到一辆火车从屏幕右边开往左边……
sudo apt-get install sl
sl
2
命令有 -a l F e 几个选项,
-a An accident seems to happen. You'll feel pity for people who cry for help.
-l shows little one.
-F It flies.
-e Allow interrupt by Ctrl+C.
2
3
4
可以给别人来个恶作剧,他一敲ls,不知道的肯定很有效果
$alias ls=sl
# fortune 命令
输出一句话,有笑话,名言什么的 (还有唐诗宋词sudo apt-get install fortune-zh)
$sudo apt-get install fortune
$fortune
2
# 3.cowsay 命令
用ASCII字符打印牛,羊等动物,还有个cowthink,这个是奶牛想,那个是奶牛说,哈哈,差不多
$sudo apt-get install cowsay
$cowsay "I am not a cow, hahaha"
2
$cowsay -l查看其它动物的名字,然后 -f 跟上动物名,如
$cowsay -f tux "坑爹啊"
还可以让cowsay说出fortune的内容,就像这样:
$fortune | cowsay
# 4.cmatrix 命令
这个很酷!《黑客帝国》那种矩阵风格的动画效果
$ sudo apt-get install cmatrix
$cmatrix
2
# 5.figlet 、toilet命令
艺术字生成器,由ASCII字符组成,把文本显示成标题栏。此外还有banner这个命令
$sudo apt-get install figlet
$sudo apt-get install toilet
$figlet fuck you !
$toilet i love you
2
3
4
5
toilet 还可以添加颜色,里面的选项请自己 man 一下
$toilet -f mono12 -F gay a girl
# 6.oneko 命令
桌面上出现一直喵星人,跟着你的鼠标跑,你不动了它就睡觉。哈哈,这个挺不错
$sudo apt-get install oneko
$oneko
2
要关掉这家伙,按ctrl+c 结束
# 7.xeyes 命令
在屏幕上出现一双眼睛,盯着你的鼠标指针
安装运行同上——oneko命令
# 8.yes 命令
输出无穷无尽的字符,按ctrl+c结束,如
$yes 我很NB
# 9.cal 9 1752
cal是打印日历,不过这个是很奇葩的一个月,
# 10.shred
覆盖搞乱文件,就是文档粉碎,哈哈,要把你私藏的大片种子和电影销毁,不被恢复出来,就靠它了
# 11.factor
分解因数,这个……小学生可以用一下
factor 60
# 13、高大上仪表盘blessed-contrib——假装自己指点江山,纵横捭阖
sudo apt-get install npm
sudo apt install nodejs-legacy
git clone https://github.com/yaronn/blessed-contrib.git
cd blessed-contrib
npm install
node ./examples/dashboard.js
2
3
4
5
6
# 16、ASCII艺术框:box命令
sudo apt-get install boxes
echo "Tongji Univerisity" | boxes
echo "Tongji Univerisity" | boxes -d dog
fortune | boxes -d cat | lolcat
2
3
4
# 17、燃起字符串大火aafire在命令行界面输入
sudo apt-get install libaa-bin
aafire
2
# 18、图片转字符串
这条命令在树莓派上运行会出问题,建议在云主机或虚拟机上运行。
sudo apt-get install aview imagemagick
wget http://labfile.oss.aliyuncs.com/courses/1/Linus.png
asciiview Linus.png
2
3
# 19、从删库到跑路 sudo rm -rf /*
sudo rm -rf /-
sudo:获取root管理员权限
rm:remove,即删除
-rf:r表示递归删除,即删除所有的子目录,f表示不需要再进行确认
/:根目录
*:所有文件
# 修改hostname和serverid
# 长久
vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=yourname
2
3
4
# 临时
vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 yourname localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
2
3
4
5