月份:2017年11月


shell习题-自动挂载磁盘


我们使用的云主机,购买一块云盘后,默认并不是挂载状态的,用shell写一个脚本,只要把盘符和挂载点以参数的形式提供给脚本,该脚本就可以自动格式化、挂载。

要求:

1 不用分区,直接格式化

2 格式化为ext4文件系统类型

 

参考答案:

#!/bin/bash

echo "Useage $0 盘符 挂载点, 如: $0 /dev/xvdb /data"

if [ $# -ne 2 ]
then
    exit
fi

if [ ! -b $1 ]
then 
    echo "你提供的盘符不正确,请检查后再操作"
    exit 1
fi

mkfs -t ext4 $1

if [ ! -d $2 ] ;then
        mkdir -p $2
fi

n=`egrep " $2 " /etc/fstab|wc -l`
if [ $n -eq 0 ]
then
    echo "$1              $2                      ext4   defaults  0  0" >> /etc/fstab
    mount -a
else
    mount $1 $2
    echo "配置文件/etc/fstab中已经存在挂载点$2,请检查一下."
fi

shell习题-自动封/解封ip


需求背景:

discuz论坛,每天有很多注册机注册的用户,然后发垃圾广告帖子。虽然使用了一些插件但没有效果。分析访问日志,发现有几个ip访问量特别大,所以想到可以写个shell脚本,通过分析访问日志,把访问量大的ip直接封掉。

但是这个脚本很有可能误伤,所以还需要考虑到自动解封这些ip。

思路:

1 可以每分钟分析1次访问日志,设定一个阈值,把访问量大的ip用iptables封掉80端口

2 每20分钟检测一次已经被封ip的请求数据包数量,设定阈值,把没有请求的或者请求量很小的解封

 

参考答案:

#! /bin/bash

## To block the ip of bad requesting.
## Writen by aming 2017-11-18.

log="/data/logs/www.xxx.com.log"
tmpdir="/tmp/badip"
#白名单ip,不应该被封
goodip="27.133.28.101"

[ -d $tmpdir ] || mkdir -p $tmpdir

t=`date -d "-1 min"  +%Y:%H:%M`

#截取一分钟以前的日志
grep "$t:" $log > $tmpdir/last_min.log

#把一分钟内日志条数大于120的标记为不正常的请求
awk '{print $1}' $tmpdir/last_min.log |sort -n |uniq -c |sort -n |tail |awk '$1>120 {print $2}'|grep -v "$good_ip"> $tmpdir/bad.ip

d3=`date +%M`

#每隔20分钟解封一次ip
if [ $d3 -eq "20" ] || [ $d3 -eq "40" ] || [ $d3 -eq "00" ]
then
        /sbin/iptables -nvL INPUT|grep 'DROP' |awk '$1<10 {print $8}'>$tmpdir/good.ip
        if [ -s $tmpdir/good.ip ]
        then
        for ip in `cat $tmpdir/good.ip`
        do
                /sbin/iptables -D INPUT -p tcp --dport 80 -s $ip -j DROP
                d4=`date +%Y%m%d-%H:%M`
                echo "$d4 $ip unblock" >>$tmpdir/unblock.ip
        done
        fi

        #解封后,再把iptables的计数器清零
        /sbin/iptables -Z INPUT
fi

if [ -s $tmpdir/bad.ip ]
then
    for ip in `cat $tmpdir/bad.ip`
    do
        /sbin/iptables -A INPUT -p tcp --dport 80 -s $ip -j DROP
        d4=`date +%Y%m%d-%H:%M`
        echo "$d4 $ip block" >>$tmpdir/block.ip
    done
fi

shell习题-安装samba


写个shell脚本,能够实现一键安装并配置samba服务,执行该脚本时需要带一个参数,为共享的目录,目录可以不存在,若不存在,需要脚本自动创建。

 

参考答案:

#!/bin/bash

is_samba_installed=`rpm -qa|grep samba|wc -l`
if [ $is_samba_installed != 0 ]
then
    echo "You had already installed Samba."
    exit 0
fi

echo "It will install Samba."
sleep 1
cnfdir="/etc/samba/smb.conf"

chkok(){
    if [ $? != 0 ]
    then
        echo "Error, Please try again."
        exit 1
    fi
}

yum install -y samba
chkok

sed -i 's/MYGROUP/WORKGROUP/' $cnfdir
sed -i 's/user/share/' $cnfdir
sed -i '$a\[fish]' $cnfdir
if [ -d $1 ]
then
    cd $1
    echo "test" > test.txt
    sed -i '$a\[fish]\n\tcomment = Share All\n\tpath = "'$1'"\n\tbrowseable = yes\n\tpublic = yes\n\twritable = no' $cnfdir
else
    mkdir $1
    cd $1
    echo "test" > test.txt
    sed -i '$a\[fish]\n\tcomment = Share All\n\tpath = "'$1'"\n\tbrowseable = yes\n\tpublic = yes\n\twritable = no' $cnfdir
fi
/etc/init.d/smb start
chkok
echo "Please input [\\sambaIP\sharename] to access the share dir."

吃糠咽菜一年,华丽转“生”


说明: 此文来自20期的小伙伴。

我是20期学员,今年6月毕业,去年9月大四,感觉时间很紧迫,自己也没有一技之长,找工作的压力让自己感觉很焦虑,无意间在网上看到铭哥的课程培训,试听了几节,觉得铭哥讲得挺好,然后就报了班。就这样学习了一部分基础命令,就去找了一份实习。

实习公司是一家医疗软件公司,我们主要是负责部署医疗系统。算是运维实施,刀片服务器大概在5-8台左右。期间一边实习,一边学习。在去年4月份辞去了这份工作。但是linux方面的基础打得比较牢固。

 

6月毕业之后,通过外包进入四川某一银行总行信息中心做虚拟化,主要是vmwawre esxi平台。部门属于x86小组,整个小组就6个人,负责整个银行系统虚拟化和linux方面的工作,还好之前的基础打得比较牢,大部分工作都能够很好的完成,时间也比较充足,在工作中有自学了python,也参与了自动化运维平台的一些简单开发。主要是和vmwawre虚拟化相结合,做了几个小功能,很方便,减轻了部分巡检和虚拟化错误检查方面的工作。

虽然时间比较短,刚好5个月的时间,但是这5个月,晚上8点到12点以及整个周末几乎没有娱乐,练习虚拟化,python方面的东西,进步神速,再也不偷懒了,虽然辛苦一些,但是回报也不错。

 

今天接到了北京一家公司的offer,是外派到vmware做python开发(11K*13+每年一次免费培训机会),虽然是外派,但是对我来说也是一个非常不错的机会。

面试过程分为三次:

第一次是hr简单的聊了一下,现在的工作,和换工作的原因。

第二次是vmare的技术经理面试:通过电话的方式,第一个问题就是如何查看linux负载情况,我说了top,后面他又问出了top还有那些,我说是w,uptime(简直就是送分题,然后又说了一下vmstat)。后面主管又问了一些linux基础知识(基础要打牢啊),剩余是vmware esxi方面的东西。

第三次是,在线编程面试,vmware经理出了几个题目,主要涉及python 正则方面的,有些不会,自己就赶紧百度,虽然代码写的不是很好,但是能够达到效果。个人感觉子里面还是主要考察自己处理问题的思维方式,有解决的想法

最后问题都能解决。编程语言只是工具,重要还是思维啊。

上面的口水话说了很多,总之运维没有捷径,都需要好好去练习。虽然工作在一年间换了2个,但是每份工作都是承接起来的,经验加成,这样有利于自身的发展。撸起袖子加油干,争取三年之内,能够在公司里独当一面,在这里感谢铭哥的指导,一路有你,真好!

shell习题-管理容器


用shell写一个脚本,实现一键管理docker容器,比如启动/关闭/删除容器等操作。

要求:

1 脚本支持启动全部容器、关闭全部容器、删除全部容器

2 需要提示用户如何使用该脚本,需给出范例

 

参考答案:

说明,本脚本为端亚同学提供。

#! /bin/bash

##start,restart,delete the docker containers
##written by zhdya_20171114
list=`docker ps -a |awk '{print $2}'| grep -v 'ID'`
echo "======================================="
echo -e "pls check the follow list of container: \n$list"
read -p "pls choose an action which you want!<1.start 2.stop 3.rm > " act
echo "======================================"
echo -e "stop\nstart\nrm\nrmi" > /tmp/docker.txt 
##judge if input the words or not!

if [ -z $act ]
then
        echo "you type was wrong,pls just input "start"."stop"."rm"."rmi"."
        exit
fi

##judge if input a wrong words!!
if grep -wq $act /tmp/docker.txt
then
        case $act in
        start)
                docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
                echo "already start all of container,pls checking it.."
        ;;

        stop)
                docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
                echo "already restart all of container,pls checking it.."
        ;;

        rm)
                docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
                echo "already rm all of container,pls checking it.."
        ;;

        *)
                docker rmi $(docker images | awk '{print $3}' |tail -n +2)
                echo "already rm all of container,pls checking it.."
        esac
else
        echo "you type was wrong,pls just input "start"."stop"."rm"."rmi"."
fi

shell习题-部署mysql主从


用shell脚本实现,部署mysql主从架构。

思路是这样的:

1)master.sh脚本用来安装master的mysql

2)然后通过expect脚本+rsync工具把slave.sh脚本、/etc/my.cnf、 /etc/init.d/mysqld 还有mysqldump下来的all.sql,以及在master下载下来的mysql二进制安装包传到slave上

3)通过expect脚本来运行slave.sh的脚本来安装,并且配置好主从,期间,用slave.tmp来记录master机子的binlog的状态,以便于传到slave后用命令添加进去。

 

参考答案:

cp_slave.expect

#!/usr/bin/expect

set user [lindex $argv 0]

set host [lindex $argv 1]

set passwd [lindex $argv 2]

set file [lindex $argv 3]

spawn rsync -avzP $file $user@$host:/tmp

set timeout 600

expect {

“yes/no” { send “yes\r”}

“password:” { send “$passwd\r” }

}

expect eof

ins_rsync.expect

#!/usr/bin/expect

set user [lindex $argv 0]

set host [lindex $argv 1]

set passwd [lindex $argv 2]

spawn ssh $user@$host

expect {

“yes/no” { send “yes\r”;exp_continue}

“password:” { send “$passwd\r” }

}

expect “]*”

send “yum install -y rsync\rexit\r”

interact

slave.expect

#!/usr/bin/expect

set host [lindex $argv 0]

set passwd [lindex $argv 1]

set cm [lindex $argv 2]

spawn ssh root@$host

expect {

“yes/no” { send “yes\r”}

“password:” { send “$passwd\r” }

}

expect “]*”

send “$cm\rexit\r”

interact

slave.sh

#!/bin/bash

####this is for building slave script

##by lv.

####master ip address

mas_ip=192.168.47.24

###mysql password conf

my_passwd=hd8832508

####replication user and password

rp_user=hd

rp_passwd=hd8832508

###check ok

check(){

if [ $? != 0 ]

then

echo “error,please check log.”

exit 1

fi

}

##close seliux

sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config

selinux_s=`getenforce`

if [ $selinux_s == “Enforcing”  -o $selinux_s == “enforcing” ]

then

setenforce 0

fi

##close iptables

iptables-save > /etc/sysconfig/iptables_`date +%s`

iptables -F

service iptables save

##install the mirror.aliyun.com

cd /etc/yum.repos.d/

if rpm -qa |grep epel-release >/dev/null

then

rpm -e epel-release

fi

if [ -f epel.repo ]

then

/bin/mv epel.repo epel.repo.bak

fi

yum install -y wget

if [ -f CentOS-Base.repo ]

then

/bin/mv CentOS-Base.repo CentOS-Base.repo.bak

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

wget http://mirrors.aliyun.com/repo/epel-6.repo -O /etc/yum.repos.d/epel.repo

fi

yum clean all

yum makecache

#first to update datetime

[ `rpm -qa |grep ntpdate|wc -l` -eq 1 ] || yum install -y ntpdate

ntpdate 0.openwrt.pool.ntp.org 2>&1 >/dev/null;clock -w

###install lib software

syum(){

if ! rpm -qa|grep -q $1

then

yum install -y $1

check

else

echo “$1 is already installed”

fi

}

## install some packges for the first on setup.

for p in gcc perl perl-devel libaio libaio-devel pcre-devel zlib-devel cmake glibc pcre compat-libstdc++-33

do

syum $p

done

###check file is already in tmp

if [ ! -f /tmp/my.cnf ] && [ ! -f /tmp/mysqld ] && [ ! -f /tmp/mysql-* ] && [ ! -f /tmp/slave.tmp ]

then

echo “error,please try to sync again”

exit 1

fi

mysql=`ls /tmp |grep tar.gz`

version=`echo /tmp/$mysql|awk -F – ‘{print $2}’|cut -d. -f2`

######install mysql

cd /tmp

tar -zxf $mysql

mv `echo $mysql|sed ‘s/.tar.gz//g’` /usr/local/mysql

cd /usr/local/mysql

if ! grep “^mysql:” /etc/passwd

then

useradd -s /sbin/nologin -M mysql

check

fi

[ -d /data/mysql ] && /bin/mv /data/mysql /data/mysql_`date +%s`

mkdir -p /data/mysql

chown -R mysql:mysql /data/mysql

###initialize

case $version in

1)

/usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql

check

sed -i ‘/^server-id/’d /tmp/my.cnf

check

sed -i ‘/\[mysqld\]/a\server-id=2’ /tmp/my.cnf

check

;;

6)

/usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql

check

sed -i ‘/^server_id/’d /tmp/my.cnf

check

sed -i ‘/\[mysqld\]/a\server_id = 2’ /tmp/my.cnf

check

;;

7)

pswd5_7=`/usr/local/mysql/bin/mysqld –user=mysql –datadir=/data/mysql –initialize 2>&1 |sed -r -n ‘/localhost: /p’|sed ‘s/.* //g’`

/usr/local/mysql/bin/mysql_ssl_rsa_setup –datadir=/data/mysql

check

sed -i ‘/^server_id/’d /tmp/my.cnf

check

sed -i ‘/\[mysqld\]/a\server_id = 2’ /tmp/my.cnf

check

;;

esac

###cp conf file

/bin/cp -rf /tmp/my.cnf /etc/my.cnf

check

/bin/cp -rf /tmp/mysqld /etc/init.d/

check

chmod 755 /etc/init.d/mysqld

chkconfig –add mysqld

chkconfig mysqld on

service mysqld start

check

####change mysql password

if [ $version -eq 7 ]

then

/usr/local/mysql/bin/mysql -uroot -p$pswd5_7 –connect-expired-password -e “set password=password(‘$my_passwd’);”

check

else

/usr/local/mysql/bin/mysql -uroot -e “set password=password(‘$my_passwd’);”

check

fi

###input date

if [ -f /tmp/all.sql ]

then

/usr/local/mysql/bin/mysql -uroot -p$my_passwd < /tmp/all.sql

check

else

echo “date error.”

exit 1

fi

######binlog

slave_bin=`grep “mysql-bin” /tmp/slave.tmp`

slave_pos=`grep ‘^[0-9]’ /tmp/slave.tmp`

###stop slave

/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “stop slave;”

check

###configure slave

/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “change master to master_host=’$mas_ip’,master_port=3306,master_user=’$rp_user’,master_password=’$rp_passwd’,master_log_file=’$slave_bin’,master_log_pos=$slave_pos;”

check

###start slave

/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “start slave;”

check

###check repecation status

show=`/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “show slave status\G;”|grep ‘Slave_IO_Running:’`

slaveIO=`echo $show|awk -F’:’ ‘{print $2}’`

Slave_SQL=`echo $show|awk -F’:’ ‘{print $2}’`

if [ $slaveIO == Yes ] && [$Slave_SQL == Yes ]

then

echo “mysql repliation is start”

/bin/rm -rf /tmp/all.sql /tmp/$mysql /tmp/mysqld /tmp/my.cnf /tmp/slave.tmp

else

echo “error,please check the log.”

fi

master.sh

#!/bin/bash

#####this is building mysql replication###

##by lv.

ml=`pwd`

ar=`arch`

###mysql password conf

my_passwd=hd8832508

####replication user and password

rp_user=hd

rp_passwd=hd8832508

###slave conf

s_user=root

s_host=192.168.47.25

s_passwd=hd8832508

###check ok

check(){

if [ $? != 0 ]

then

echo “error,please check log.”

exit 1

fi

}

####check the file is exist

for wj in $ml/cp_slave.expect $ml/ins_rsync.expect $ml/slave.expect $ml/slave.sh

do

if [ ! -f $wj ]

then

echo “error,your miss $wj file.”

exit 1

else

/bin/chmod +x $wj

check

fi

done

##close seliux

sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config

selinux_s=`getenforce`

if [ $selinux_s == “Enforcing”  -o $selinux_s == “enforcing” ]

then

setenforce 0

fi

##close iptables

iptables-save > /etc/sysconfig/iptables_`date +%s`

iptables -F

service iptables save

##install the mirror.aliyun.com

aliyun(){

cd /etc/yum.repos.d/

if rpm -qa |grep epel-release >/dev/null

then

rpm -e epel-release

fi

if [ -f epel.repo ]

then

/bin/mv epel.repo epel.repo.bak

fi

yum install -y wget

if [ -f CentOS-Base.repo ]

then

/bin/mv CentOS-Base.repo CentOS-Base.repo.bak

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

wget http://mirrors.aliyun.com/repo/epel-6.repo -O /etc/yum.repos.d/epel.repo

fi

yum clean all

yum makecache

}

if [ `grep “aliyun.com” /etc/yum.repos.d/CentOS-Base.repo|wc -l` -eq 0 ]

then

aliyun

else

echo “aliyun epel is already installed.”

fi

#first to update datetime

[ `rpm -qa |grep ntpdate|wc -l` -eq 1 ] || yum install -y ntpdate

ntpdate 0.openwrt.pool.ntp.org 2>&1 >/dev/null;clock -w

###install lib software

syum(){

if ! rpm -qa|grep -q $1

then

yum install -y $1

check

else

echo “$1 is already installed”

fi

}

## install some packges for the first on setup.

for p in gcc perl perl-devel libaio libaio-devel pcre-devel zlib-devel cmake glibc pcre compat-libstdc++-33

do

syum $p

done

###variables,fuctions

mysql_5_1=http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-$ar-glibc23.tar.gz

mysql_5_6=http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.31-linux-glibc2.5-$ar.tar.gz

mysql_5_7=http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.12-linux-glibc2.5-$ar.tar.gz

#######################################

conf_mysql(){

cd /usr/local/mysql

if ! grep “^mysql:” /etc/passwd

then

useradd -s /sbin/nologin -M mysql

check

fi

[ -d /data/mysql ] && /bin/mv /data/mysql /data/mysql_`date +%s`

mkdir -p /data/mysql

chown -R mysql:mysql /data/mysql

###initialize

case $version in

5.1)

./scripts/mysql_install_db –user=mysql –datadir=/data/mysql

check

;;

5.6)

./scripts/mysql_install_db –user=mysql –datadir=/data/mysql

check

;;

5.7)

pswd5_7=`./bin/mysqld –user=mysql –datadir=/data/mysql –initialize 2>&1 |sed -r -n ‘/localhost: /p’|sed ‘s/.* //g’`

./bin/mysql_ssl_rsa_setup –datadir=/data/mysql

check

;;

esac

}

cp_mysql(){

###my.cnf

if [ -f  /usr/local/mysql/support-files/my-huge.cnf ]

then

/bin/cp -rf support-files/my-huge.cnf /etc/my.cnf

check

sed -i ‘/^\[mysqld\]$/a\datadir = /data/mysql’ /etc/my.cnf

check

else

/bin/cp -rf support-files/my-default.cnf /etc/my.cnf

check

sed -i ‘/^\[mysqld\]$/a\socket = /tmp/mysql.sock’ /etc/my.cnf

sed -i ‘/^\[mysqld\]$/a\port = 3306’ /etc/my.cnf

sed -i ‘/^\[mysqld\]$/a\datadir = /data/mysql’ /etc/my.cnf

check

sed -i ‘/^\[mysqld\]$/a\basedir = /usr/local/mysql’ /etc/my.cnf

fi

####/etc/init.d/mysqld

if [ $version == 5.7 ]

then

/bin/cp support-files/mysql.server /etc/init.d/mysqld

check

sed -i ‘s#^datadir=#datadir=/data/mysql#’ /etc/init.d/mysqld

sed -i ‘s#^basedir=#basedir=/usr/local/mysql#’ /etc/init.d/mysqld

check

chmod 755 /etc/init.d/mysqld

chkconfig –add mysqld

chkconfig mysqld on

service mysqld start

check

else

/bin/cp support-files/mysql.server /etc/init.d/mysqld

sed -i ‘s#^datadir=#datadir=/data/mysql#’ /etc/init.d/mysqld

chmod 755 /etc/init.d/mysqld

chkconfig –add mysqld

chkconfig mysqld on

service mysqld start

check

fi

}

###install mysql

insall_mysql(){

echo “Chose the version of mysql.”

select mysql_v in 5.1 5.6 5.7

do

case $mysql_v in

5.1)

cd /usr/local/src

[ -f ${mysql_5_1##*/} ] || wget $mysql_5_1

tar zxf ${mysql_5_1##*/}

check_ok

[ -d /usr/local/mysql ] && /bin/mv /usr/local/mysql /usr/local/mysql_`date +%s`

mv `echo ${mysql_5_1##*/}|sed ‘s/.tar.gz//g’` /usr/local/mysql

check_ok

version=5.1

conf_mysql

cp_mysql

break

;;

5.6)

cd /usr/local/src

[ -f ${mysql_5_6##*/} ] || wget $mysql_5_6

tar zxf ${mysql_5_6##*/}

check_ok

[ -d /usr/local/mysql ] && /bin/mv /usr/local/mysql /usr/local/mysql_bak

mv `echo ${mysql_5_6##*/}|sed ‘s/.tar.gz//g’` /usr/local/mysql

check_ok

version=5.6

conf_mysql

cp_mysql

break

;;

5.7)

cd /usr/local/src

[ -f ${mysql_5_7##*/} ] || wget $mysql_5_7

tar zxf ${mysql_5_7##*/}

check_ok

[ -d /usr/local/mysql ] && /bin/mv /usr/local/mysql /usr/local/mysql_bak

mv `echo ${mysql_5_7##*/}|sed ‘s/.tar.gz//g’` /usr/local/mysql

check_ok

version=5.7

conf_mysql

cp_mysql

break

;;

*)

echo “only 1(5.1) 2(5.6) or 3(5.7) ”

exit 1

;;

esac

done

}

####change mysql password

passwd_mysql(){

if [ $version == 5.7 ]

then

/usr/local/mysql/bin/mysql -uroot -p$pswd5_7 –connect-expired-password -e “set password=password(‘$my_passwd’);”

check

else

/usr/local/mysql/bin/mysql -uroot -e “set password=password(‘$my_passwd’);”

check

fi

}

######

if [ `ps aux|grep mysql|wc -l` -gt 1 ]

then

echo “mysql is already start”

else

insall_mysql

passwd_mysql

fi

####start install slave

echo “#############################”

echo “##                         ##”

echo “##      slave install      ##”

echo “##                         ##”

echo “#############################”

##first check master tool

if ! rpm -qa|grep -q rsync

then

yum install -y rsync

fi

if ! rpm -qa|grep -q expect

then

yum install -y expect

fi

###replication building for master first

if [ `ps aux|grep mysql|wc -l` -gt 1 ] && [ `grep “log_bin = mysql-bin” /etc/my.cnf|wc -l` -eq 0 ] && [ `grep “log-bin=mysql-bin” /etc/my.cnf|wc -l` -eq 0 ]

then

/etc/init.d/mysqld stop

check

sed -i ‘/^\[mysqld\]$/a\server_id = 1’ /etc/my.cnf

sed -i ‘/^\[mysqld\]$/a\log_bin = mysql-bin’ /etc/my.cnf

sed -i ‘/^\[mysqld\]$/a\binlog_format = “MIXED”‘ /etc/my.cnf

check

/etc/init.d/mysqld start

check

fi

master_bin=`/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “show master status \G;”|grep File|awk ‘{print $2}’`

master_pos=`/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “show master status \G;”|grep Position|awk ‘{print $2}’`

echo $master_bin >>/tmp/slave.tmp

echo $master_pos >>/tmp/slave.tmp

/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “grant replication slave on *.* to $rp_user@’$s_host’ identified by ‘$rp_passwd’;”

check

/usr/local/mysql/bin/mysql -uroot -p$my_passwd -e “flush privileges;”

check

###dump date

/usr/local/mysql/bin/mysqldump -uroot -p$my_passwd –single-transaction -A > /tmp/all.sql

check

####cp file to slave

if [ `pwd` != $ml ]

then

cd $ml

fi

./ins_rsync.expect $s_user $s_host $s_passwd

for file in /usr/local/src/mysql-* /etc/my.cnf /etc/init.d/mysqld ./slave.sh /tmp/slave.tmp /tmp/all.sql

do

./cp_slave.expect $s_user $s_host $s_passwd $file

done

./slave.expect $s_host $s_passwd /tmp/slave.sh

感觉计算机技术很牛逼才能装X


说明,本文是24期学生的一篇阶段学习总结。

1 背景

毕业一年的大专生

年龄:24

漂泊地:suzhou

目前在一家公司里做SEO和SEM方面的工作,面试进来是美工,然后转自媒体编辑,再到现在的工作职责。其实到现在就是打酱油,小半天就没事了,可以做一些自己的事情(只能偷偷的哦!)

 2 动机

一直感觉要学一门技术在手(技术在手,天下我走),但一直在彷徨学习什么,从毕业的实习到进这家公司,就想着往计算机方面靠拢,毕竟高薪!高薪!!高薪!!! (重要的事说三遍),而且感觉计算机技术很牛逼,很能装X,你们懂的。

在今年六月的时候,我的小伙伴跟我说linux很牛逼,而且加班少,(我的小伙伴是在高中那会就加了阿铭老师为好友,每次都看见阿明老师发的高薪,还有学费一直涨价~~~)

然后我和他决定去学linux,并深深的爱上了它,发现并不是自己想的那么遥远,但先自学了一段时间,发现干啃的效果很差,而且很多知识点都是老的,这时就决定去报名培训班学习,当然是选择了猿课,因为从高中就知道了猿课和阿铭老师~~~ 阿铭老师的上课视频,简单易懂!一级棒!!!

3 过程

因为感觉自学了一段时间,自认为有一定的基础,就跟阿铭老师说想跟23期2班的课程,但刚接触的时候,学习方式有点不适应,加上课程任务较紧张,自己一度想放弃~~~但选择了,就坚持下去。一直到第一阶段学习结束(那时真的到临界点了,而且大部分实验很少做,导致很多方面知道知识,却不懂,一味的追赶学习任务。

ps:这种学习是最烂的效果,要多做实验,多复习,笔记要详细,当你复习的时候就知道了笔记的重要性!!!),阿铭老师说24期开课了,我果断选择了回炉重造。

这时候,就发现当前当时跟着一段学习的效果和学习方法就体现了,(真的在猿课最大的收获就是学习方法和知识的积累!!!),很多知识点过一遍,多敲实验加深记忆和理解。

笔记!实验!这些都会是我们复习和理解的宝贵财富。

4 时间安排

周一到周六上班,六点半起床(大概看一会笔记,把昨天的知识点复习下,在玩玩手机,看看新闻)

 

上班时间,干完活就是我的自己时间啦!!!哈哈哈~~~下班后,磨蹭到七八点,然后听课,记笔记,做实验(自己很磨蹭,容易发呆,玩手机),但一直记着阿铭老师的一句话,当日事当日毕!!!每天的任务必须搞完,一旦拖拉,会造成时间不充裕,二是形成懒惰的习惯。千万要杜绝……

 

周日嘛,先睡大大的懒觉,一觉到11点左右,下午看看电影,然后出去走走,散散心。收拾收拾心,继续新的前进~~~

5 体会

学习linux一旦时间长了,就会枯燥,乏味,毕竟这不是彩色的图片、不是王者荣耀哈,所以就需要我们去调整自己的心态,心态真的很重要!因为学习,就是为了自己,你想想未来是想拿着几千,过着安逸的当下, 然后看着别人旅游、潇洒,还是成为别人眼中的那个“它”。另外,笔记 和 实验 真的很重要!很重要!!很重要!!!

6 总结

学习,最重要的就是笔记和实验!(好记性不如烂笔头,或许你当时什么都记着,但一个月,六个月,一年后。。。会还是那么清晰的记得呢!)或许在一开始会很不知道怎么记笔记,但是在摸索中掌握了自己的学习方法和记笔记的习惯,真的会发现效率提高N倍!

认识猿课,选择猿课,会是我一辈子中走的最对的道路!

shell习题-自动增加公钥


写一个shell脚本,当我们执行时,提示要输入对方的ip和root密码,然后可以自动把本机的公钥增加到对方机器上,从而实现密钥认证。

 

参考答案:

#!/bin/bash

read -p "Input IP: " ip
ping $ip -w 2 -c 2 >> /dev/null

## 查看ip是否可用
while [ $? -ne 0 ]
do
    read -p "your ip may not useable, Please Input your IP: " ip
    ping $ip -w 2 -c 2 >> /dev/null
done
read -p "Input root\'s password of this host: " password

## 检查命令子函数

check_ok() {
if [ $? != 0 ]
then
    echo "Error!."
    exit 1
fi
}

## yum需要用到的包
myyum() {
if ! rpm -qa |grep -q "$1"
then
    yum install -y $1
    check_ok
else
    echo $1  already installed
fi
}

for p in openssh-clients openssh expect
do
    myyum $p
done

## 在主机A上创建密钥对

if [ ! -f ~/.ssh/id_rsa ] || [ ! -f ~/.ssh/id_rsa.pub ]
then
    if [ -d ~/.ssh ]
    then
        mv ~/.ssh/  ~/.ssh_old
    fi
    echo -e "\n" | ssh-keygen -t rsa -P ''
    check_ok
fi

## 传私钥给主机B

if [ ! -d /usr/local/sbin/rsync_keys ]
then
    mkdir /usr/local/sbin/rsync_keys
fi
cd /usr/local/sbin/rsync_keys
if [ -f rsync.expect ]
then
    d=`date +%F-%T`
    mv rsync.expect $d.expect
fi

#创建远程同步的expect文件

cat >  rsync.expect <<EOF
#!/usr/bin/expect
set host [lindex \$argv 0]
#主机B的密码
set passwd [lindex \$argv 1]
spawn rsync -av /root/.ssh/id_rsa.pub root@\$host:/tmp/tmp.txt
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "\$passwd\r" }
}
expect eof
spawn ssh root@\$host
expect {
"password:" { send "\$passwd\r" }
}
expect "]*"                         
send "\[ -f /root/.ssh/authorized_keys \] && cat /tmp/tmp.txt >>/root/.ssh/authorized_keys \r"
expect "]*"
send "\[ -f /root/.ssh/authorized_keys \] || mkdir -p /root/.ssh/ \r"            
send "\[ -f /root/.ssh/authorized_keys \] || mv /tmp/tmp.txt /root/.ssh/authorized_keys\r"            
expect "]*"
send "chmod 700 /root/.ssh; chmod 600 /root/.ssh/authorized_keys\r"
expect "]*"
send "exit\r"
EOF

check_ok
/usr/bin/expect /usr/local/sbin/rsync_keys/rsync.expect $ip $password
echo "OK,this script is successful. ssh $ip  to test it"

shell习题-域名到期提醒


写一个shell脚本,查询指定域名的过期时间,并在到期前一周,每天发一封提醒邮件。

思路: 大家可以在linux下使用命令“whois 域名”,如”whois apelearn.com”,来获取该域名的一些信息。

提示: whois命令,需要安装jwhois包

 

参考答案:

#!/bin/bash

t1=`date +%s`
is_install_whois()
{
    which whois >/dev/null 2>/dev/null
    if [ $? -ne 0 ]
    then
        yum install -y jwhois
    fi
}

notify()
{
    e_d=`whois $1|grep 'Expiry Date'|awk '{print $4}'|cut -d 'T' -f 1`
    e_t=`date -d "$e_d" +%s`
    n=`echo "86400*7"|bc`
    e_t1=$[$e_t-$n]
    if [ $t1 -ge $e_t1 ] && [ $t1 -lt $e_t ]
    then
        /usr/local/sbin/mail.py aming_test@163.com "Domain $1 will be expire." "Domain $1 expire date is $e_d."
    fi
}

is_install_whois
notify aminglinux.com

小白成长之路


说明:本文为23期同学所写。

先自己我介绍一下吧,阿dai,23期学员,土木工程专业毕业,绝对的小白。学习Linux是的原因之一——挣钱(感觉有这一个原因就很充分了)!至于如何结识的阿铭我就不多说了,总之选择跟阿铭学Linux是没错的。

路漫漫其修远兮……

终于有了一个新的开始……

经过一个月的折腾,终于安定下来。先说大家最关心的问题:薪资——7k+1k(季度考核,正常3000,优秀5000)。步入正题,之前看过很多师兄的帖子,感觉他们写的都很“骚”,我没有他们的文笔,就把自己的学习、复习、面试……经历写一写。

先上图:

先说学习,其实就是两个字——笔记! 相信不管哪期的学生,铭哥第一堂课都有讲笔记的重要性,所以不用我强调,在把老王同学分享链接贴出来供大家享用(http://ask.apelearn.com/question/16773 )。

学习方法其实很多很多,这短时间一直有人问我是怎么安排自己的学习时间的,大概讲一下吧,看书+看书+看视频+记笔记+看书+看书。我其实没有什么好的学习方法,世界上没有两片相同的树叶,所以去找一种最适合自己的学习方法就是最好的,其次就是坚持、坚持、再坚持。

然后说说自己是怎么复习的,这里还要说一下笔记的问题,其实笔记是复习的最好工具,所以前期认真做笔记的同学后期复习肯定会轻松很多。好,开讲复习,我不建议各位一复习就开始一遍遍翻笔记,毕竟内容太多了,而且是电子版(我个人很不喜欢),我复习的过程如下:课本+面试宝典+笔记(扩展项)+视频(部分)。

之所以选择看书,是因为(书中自有颜如玉,书中自有黄金屋。。。玩笑)看书会让你有更多的时间去消化,学了那么多内容,只有消化掉才能成为自己的东西;看面试宝典的作用不是记里面的题和答案(当然有些东西需要记),重要的是通过看面试宝典熟悉面试环境,养成一个思考方式,也可以说是一种高度(回答问题时有一个清晰的思路,在此我有一个感受:玩技术,思路决定高度),面试宝典一共300+页,如果你能全部记住,我会献上自己的膝盖;

至于看视频,有这么几方面:每章理论部分、第二版课程扩展的部分(friends)、还有好多第三阶段的课程(在第二版中选择性学习,只求了解不求深度掌握,因为很多公司暂时用不到这些内容)。关于复习就说这些吧——是在太多不知道怎么写。。。自己根据实际情况找到适合自己的方法。

其次是面试,在此强调两个字——心态!心态真的很重要,面试肯定不是一件特别轻松的事,从大学到现在,我是第一次用心去准备面试。首先是简历,不求多华丽,但是要尽量清晰(简历会分享),而且简历的内容要根据自己所学的技术去写。然后是自我介绍0s、1min、3min,如果可以尽量都准备一份,而且要背熟(避免临场紧张忘词)。

再者就是控场了,经过几次面试,我感觉最紧张的其实并不是和面试官聊,而是在等待面试官的那几分钟,内心各种打鼓,这个时候需要你学会转移注意力,放松、放松、放松……至于面试过程,起初是担心,后来却成了我最喜欢的时间了,因为经过一次次面试和不断的总结,思路越来越清晰(在此想到铭哥说过的一句话,其实并不是你不会,你只是不知道怎么说,所以建议大家复习的时候把理论巩固、巩固、巩固),当你思路清晰的时候,聊天会让你放松,面试状态会渐入佳境,而且你会变得很享受那个过程。

心里想了好多东西,但是不知道该怎么讲了,暂时就先码到这里了,之后大家可以在帖子下面提问,持续更新……

相信自己,祝大家早日找到工作!