linux三

来源:互联网 发布:电脑看片有什么软件 编辑:程序博客网 时间:2024/06/05 12:01
Day03-0921
回顾
    1.用户管理(用户创建,用户切换,设置或修改密码,删除)
        1).超级用户 root  0
        2).普通用户     500
        3).伪用户      1~499
        4).新增用户:# useradd  [username]
        5).设置或修改密码
            第一种:# passwd   [username]
            第二种:# echo '12346' | passwd --stdin [username]
        6).删除用户:# userdel  -r   [username]

    2.用户文件目录权限
        1)用户文件的目录权限
        修改权限命令: chmod
        --> # chmod  u+x test
        --> # chmod  u+x,g+w,o+r test
        --> # chmod  u-x   test

        --> # chmod  764  file5
                    选项: -R,  递归修改
                    用法: # chmod  777 -R test/
        2)修改所有者的命令:# chown user01:user01   test/

    3、管道符、追加/覆盖符号
        1) |   grep  表示将前一个命令的输出结果传递给后面的命令处理,两边都是命令
        2)>>   echo "今天时星期四" 1 >> /dev/null
        3) >
        4) \

    4.sudo 权限
        user01        ALL=(root)        NOPASSWD:ALL
    
        # visudo

    5.压缩和解压缩
        .gz
        .tar
        .tar.gz

        gzip gunzip
        tar

        tar -zxf xx.tar.gz -C yy/
    6.软件包管理(.rpm)
        rpm  -ivh(安装) -qa | grep (查看) -e --nodeps (卸载)
        yum  list installed | grep    -y install  -y  remove

    7. 综合练习
        java 环境变量  /etc/profile(系统变量)  .bash_profile(用户变量)

一、关闭防火墙和安全子系统 (Hadoop HBase这样的分布式集群应用需要)

    --》在联机应用(分布式)中,一般会关闭防火墙。防火墙默认情况下,出于安全考虑会限制一些应用的网络访问(比如rpc通信端口),为了保证多机通信的稳定,可以选择关闭防火墙

1.关闭防火墙并且不开机启动
    1).关闭Linux 防火墙
    # service iptables status   ##查看防火墙状态
      iptables: Firewall is not running.
    # service iptables stop     ##关闭防火墙
    
    2).设置不开机启动防火墙
    #  chkconfig iptables off   ##不随机启动

    3).查看防火墙的开机启动设置
    $ sudo chkconfig --list | grep iptables

2.关闭安全子系统
      # vi /etc/sysconfig/selinux
      SELINUX=disabled


二、[服务器类型]:
    一)、物理机
    塔式服务器:   CPU( E3  E5  E7 “至强”)
    机架式服务器: 机柜(55U) 1U - 4U    电源(双电源) 双网卡(千M)  4-12 块   1T -4T  raid 磁盘矩阵
        内存:32G内存     64G     128G    256G
    刀片式服务器(扩展型号):  支持热插拔

    二)、云计算(云主机)
    阿里云 腾讯云  京东云

二、shell 编程   (自动化运维 )
第一部分:
        shell脚本的规范
        1.第一行:#!/bin/sh开头 或 #!/bin/bash开头
        2.注释:#
        3.shell脚本以.sh结尾
        4.执行shell基本的两种方式:
            1).sh hello.sh    #执行shell脚本
            2)./hello.sh      #这种方式要求这个脚本拥有执行权限

第二部分
    shell的变量
    定义变量没有数据类型
    引用变量需要在变量前面添加$符号

    1.shell变量类型
        -》环境变量
        保存系统运行时使用的变量
            -》用户变量
            .bash_profile 每个用户主目录下都有这么这个文件,用来保存每个用户的环境变量

            -》系统变量
            /etc/profile:系统全局生效的配置文件

        -》位置变量
            将传递给脚本的参数保存在位置变量中
            以便于在脚本中引用这些变量
            Bash 定义9个位置变量:$1  ... $9
            $0:代表的是当前脚本的名称

            #!/bin/sh
                echo $2
                echo $1
                echo $3
            执行shell脚本传递参数时,每个参数要以空格隔开

            public  static void  fun1(String str1,int a){

            }

        -》预定义变量
            $0:脚本名称
            $!:后台运行的最后一个进程的PID号
            $$:当前进程的ID号
            $#:当前shell的参数个数
            $*显示所有的参数内容(整体)
            $@:显示所有的参数内容(逐个读取)
            $?:判断,表示程序退出的代表(返回0代表成功,非0代表失败)
#!/bin/sh
echo $0
echo $#
echo $*
echo $@
echo $?

        -》自定义变量
            语法格式:
                tagname=[vlaue]
            等号两边不能有空格
            变量对大小写敏感
            定义以后使用/引用($变量名),调用变量的值
                $name

            变量的赋值
            分三种情况
                1.直接赋值  tag1=112
                2.将变量值赋值给另一个变量 tag2=$tag1
                3.将命令赋值给变量 szie=`ls ~/ `  飘号或者反引号 在键盘1 2 左边的那个按键

                shell的字符串/命令(echo ):
    echo 可以不加引号    #可以正常输出的输出变量
    echo 加单引号       #可以将单引号中的内容原样输出
    echo 加双引号       #可在双引号中输出变量或者使用转义符“\”

value=100
$ echo the value  is $value
the value is 100

$ echo the value  is "$value"
the value is 100

$ echo the value  is '$value'
the value is $value

$ echo  the valeu is "'#value'"
the valeu is "#value"

$ echo  the valeu is "\"#value"\"
the valeu is "#value"

    shell的字符串拼接
        字符串拼接不能使用+号;把要添加的字符串变量添加{},并且需要把$放到外面。

第三部分:shell运算
        第一种写法 $(( ))
        第二种写法 $[]
        第三种写法 expr  

expr 3 + 5  注意:在expr表达式中,必须添加空格
        如果:expr3+5 则报错
        如果:expr 3+5   则直接输出3+5
    注意:因为expr本身是一个shell命令,所以在输出的时候需要使用反引号(~,1,2,键的左边)    

    1.算术运算
        echo $((a+b))
        echo $(($a*$b))
 a=10
 b=15
  echo $((a+b))
  echo $(($a+$b))
  echo $((3+5))

        echo $[ a + b ]
        echo $[ $a * $b ]
        echo $[ 10 + 15 ]

echo `expr $a + $b`
echo `expr $a - $b`
echo `expr 9 \* 3`
echo `expr 9 / 3`
echo `expr 9 * 3`   -》expr: syntax error   乘法运算符需要加转义
echo `expr a - b`   -》expr: non-numeric argument  非数值参数  
注:expr 表达式只能接受数值

    
        2.逻辑运算
        -》 && 逻辑与 (命令控制符)
        cmd1 && cmd2  //前面的命令执行成功才会执行后面的命令
        -》 || 逻辑或
        cmd1 || cmd2   //前面的命令执行失败才会执行后面的命令
        -》 ; 无逻辑符号
        cmd1 ; cmd2

第四部分:内置测试判断
        分两种:
        第一种:test 测试表达式
                
                if test 6 -gt 9
                then
                    echo bigger
                fi


        第二种:[测试表达式]
            
            a=6
            b=9
            if [ $a -lt $b ]
            then
                echo smaller
            fi

        ->第一种比较:数值比较
            -eq        #equal    等于        
            -ne        #not equal    不等于
            -gt        #greater than 大于
            -ge        #greater equal    大于等于
            -lt        #little than    小于
            -le        #little equal    小于等于
        注意:在数值的比较中,不能使用”>“ "<"等符号来进行比较
            在test 或 [] 进行测试的时候,必须要有空格

    


            -》第二种比较:字符串的比较
                分为5种比较方式
            =    等于
            !=    不等于
            -z    长度为0则为true(返回0) 不为0为false(返回非0)
            -n    长度不为0则为true
            $string    字符串不为空则为true(返回0)

#!/bin/sh
str1=abc
str2=abc
str3=def
str4=
if test $str1 = $str2
then
   echo $str1和$str2相等;
fi

if [ $str1 != $str3 ]
then
  echo $str1和$str3不想等;
fi

if test -z $str1
then
  echo $str1长度为0;
fi

if [ -n $str3 ]
then
 echo $str3长度不为0;
fi

if test $str4
then
  echo $str4不为空;
fi

if [ $str2 ]
then
  echo $str2不为空;
fi

         》第三种:文件的测试或比较
            -d    (directory)    如果是目录则为true
            -f      (file)    如果是文件则为true
            -r        如果是可读则为true
            -w        如果是可写则为true
            -x        exec 如果是可执行则为true
            注意:可读可写可执行是针对于执行脚本的用户而言的权限

        #!/bin/sh
if [ -d $1  ]
then
    echo 是目录
fi
if [ -f $1  ]
then
        echo 是文件
fi
if [ -r $1  ]
then
        echo 是可读的
fi
if [ -w $1  ]
then
        echo 是可写的
fi
if [ -x $1  ]
then
        echo 是可执行
fi


逻辑表达式:
        三种:
        1.非 !
        2.与 -a
         3.或 -o
if [ -f  $1 -a $2 -gt 5]
then
    echo  \$2  is $2
     echo  "\$2 is bigger than 5 "
 fi

if [ ! 2 -lt 5 ]
then
    echo 2小于等于5;
fi

    可以用逻辑操作符将两个测试表达式结合起来。仅需要用到一对方括号,而不能用两个, 否则将返回错误信息“too many arguments”。
     [ "990" -le "995" ] -a  [ "123" -gt "33"  ]
-bash: [: too many arguments

第五部分 流程控制
    1.if
        第一种语法格式:
        if  条件判断
            then
                    command
        fi
eg.
#!/bin/sh
if test 3 -eq 3
then
    echo Yes
fi

    第二种语法格式:
        if  条件判断
        then
            command
        esle
            command
        fi

eg.
#!/bin/sh
if [ -d /home/user01/demo  ]
then
        ls  /home/user01/demo
else
        mkdir  /home/user01/demo
        echo 目录创建成功!!
fi

    第三种语法格式:
        if 条件判断
        then  
            command
        elif 条件判断
        then
            command
        elif 条件判断
        then
            command
        ...
        else
            command
        fi

e.g.1
#!/bin/sh
echo please type age
read age
if  test $age -ge 0 -a $age -lt 3
then
    echo  baby
elif [ $age -ge 3  -a $age -lt 7 ]
then
    echo child
elif [ $age -ge 7 ] && [ $age -lt 18 ]
then
    echo teenager
elif test $age -ge 18 && test $age -lt 40
then
    echo youth
elif test $age -ge 40 && [ $age -lt 60  ]
then
    echo man
else
    echo older
fi

e.g.2
#!/bi/sh
# read socre  and choose level
# read 相当于Java中的scanner 是一种交互式命令,读取设备的输入
echo "请输入学生成绩score:"
read score
if test $score -ge 90 -a $score -le 100
then
   echo  level  A;
elif [ $score -ge 80 -a $score -lt 90 ]
then
   echo  level  B;
elif [ $score -ge 70 ] && [ $score -lt 80 ]
then
   echo  level C;
elif test $score -ge 60 && test  $score -le 70
then
   echo  level D;
else
   echo  不及格;
fi

    2. 循环语句
        1)for 循环

第一种语法格式:
    for((初始化变量值;结束循环条件;循环控制语句))
        do
            循环体
        done
eg.
#!/bin/sh
sum=0
for ((i=0;i<10;i++))
do
    echo $i
    sum=$[ $sum + i ]
done
echo $sum


第二种语法格式:
    for 变量 in 值1 值2 ...值N
    do
        循环体
    done

    eg1.
#!/bin/sh
for MONTH in Jan Feb Mar Apr May Jun July Aug Sep Oct Nov Dec
do
    echo $MONTH
done

    eg2.
#!/bin/sh
for file in `/bin/ls ~`;
do  
     echo $file;
done
     eg3
for File  in `ls /home/hadoop/shell`
do
  chmod u+x $File
done

    2)while 循环
第一种语法格式:
    while [ condition  #循环条件 ]
    do
        #statements
        #【循环体】
        #【循环控制】
    done

    eg1.
#!/bin/sh
i=1
while [ $i -le 10 ]
do
    sum=$((sum+i))
    i=$[ i + 1 ]
done
echo $sum

    eg2.
#!/bin/sh
i=1
sum=0
while test $i -le 10
do
    sum=$[ $sum + $i ]
    i=`expr $i + 1`
done
echo $sum

第二种语法格式:
    while  read -r line
    do
    #【循环体】
    done

eg.
#!/bin/sh
#Read /ect/sysconfig/network-scripts/ifcfg-eh0 and print out
FILE=/ect/sysconfig/network-scripts/ifcfg-eh0
while read -r line
do
    echo $line
done < $FILE



    3)case  类似于java中的 swich case
    第一种语法格式:
#!/bin/sh
echo "input from: one two three"
read input
case $input in
    one) echo "your input is one"
    ;;
    two) echo "your input is two"
    ;;
    three) echo "your input is three"
    ;;
    *) echo your input is $input
esac
    
    第二种语法格式:
#!/bin/sh
echo "input from :one two three ....."
read input
case $input in
    one | two) echo "your input is one or two"
    ;;
    three | four) echo "your input is three or four "
    ;;
    five) echo "your input is five"
    ;;
    *) echo your input is $input
esac

shell脚本的调用(在一个脚本中去调用另外一脚本)
eg.
#!/bin/sh
source /home/hadoop/shell/hello.sh


三、date 命令
    一)显示系统时间
    1.date   CST中央标准时间
    Mon Jun  5 15:11:44 CST 2017

    2.date -R  带时区的时间
    Mon, 05 Jun 2017 15:14:44 +0800

    二)格式化日期
    $ date  '+%Y-%m-%d %H:%M'
    2017-05-02 11:20

    $ date  '+%Y/%m/%d %H:%M'
    2017/05/02 11:20
    
    $ date  '+%Y%m%d %H:%M'
    20170502 11:20

    # date "+%y%m% d%:H%:M"
    # date +%Y-%m-%d

    回到2天前:
    $ date -d '2 day ago' '+%Y/%m/%d/ %H-%M'
    $ date -d '3 hour ago' '+%Y/%m/%d %H:%M:%S'

    三)设置时间
    选项:-s  set
    用法:# date -s "2016-12-08 10:43:00"
        
    ntpdate 命令
    用法:# ntpdate 网络时间服务器
    sudo ntpdate ntp.api.bz

    国内常用NTP服务器地址及IP
https://www.douban.com/note/171309770/

四、Crontab计划任务
    -->周期性执行计划任务

    选项使用:
    crontab -l   (list )   #查看目前的计划任务列表
    crontab -r   (remove)  #删除计划任务
    crontab -e   (eidt)    #编辑周期性计划任务

    进程名称是crond
    ps -ef | grep crond $查看此进程是否开启
    默认进程是开启的,如果没有开启,可以使用命令手动开启
    # service crond status
    # service crond start
    # service crond stop
    # service crond restart

# Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name command to be executed
     *    *      *            *             *
    分钟 小时  天(of月)  月(of年)  星期(of周)

每天晚上18:00执行一次拷贝/home/uer01/2.log文件到/opt/software的任务
0 18 * * * /bin/cp /home/uer01/2.log /opt/software
15 18 * * * /bin/cp /home/uer01/2.log /opt/software

每天晚上6点到第二天早上6点 每15分钟记录一次时间到/home/uer01/2.log文件中
*/15  18-23,0-6 * * * /bin/date  >> /home/user01/2.log
0,15,30,45  18-23,0-6 * * * /bin/date  -R >> /home/user01/2.log

注意:如果是离散的值,使用“,”进行分割
      如果是连续的值,使用“-”进行连接


0 6-12/2  * * 7 /bin/sh /home/user01/datelog.sh

datelog.sh
#!/bin/sh
/bin/echo "当前时间是:" >> /home/user01/2.log
/bin/date -R >> /home/user01/2.log

五、 vi编辑器 高级特性
vi快捷方式
        显示行号: set nu,进入最后行模式使用
        光标快速移动到第一行,小写gg, 命令模式使用
        光标快速移动到最后一行,大写G, 命令模式使用
        光标快速移动到行首,Home, 命令模式使用
        光标快速移动到行末,End, 命令模式使用
        删除一行,小写dd,(带有剪切功能)命令模式使用
        粘贴一行,小写p,命令模式使用
        删除多行,小写dd,加上数字,比如三行就是3dd,命令模式使用
        撤销上一步的操作,小写u,命令行模式使用

        删除、拷贝命令
            在命令模式下
            dd   剪切一行
            ndd   剪切光标下方n行
            yy      复制一行
            nyy   复制光标下方n行
            p     粘贴
        
        替换内容
            在最后行模式下使用
        1,$s/nologin/88888/g
                    ->1表示第一行
                    ->$表示最后一行
                    (1,$)表示的是一个范围,比如(5,$)
                    ->/nologin/88888/表示替换和被替换
                    -g表示通行
        34s/user01/user02

        搜索命令
        在命令模式下,搜索一个字符串string
        /string
        n   继续搜索下一个
        N   搜索上一个出现的位置

六、系统管理命令
    1.top 查看系统资源    -->相当于任务管理器
        每隔3秒更新一次
        按q退出浏览状态

    2.free 查看内存信息    --》  可能会用到
        选项:-m, 就是以MB格式显示

    3.df -l 查看硬盘分区的使用信息

    4.ps -ef 查看系统进程
        ps -ef | grep crond
        jps 查看系统正在运行的java进程

    5.kill 杀死正在进行的进程     -》结合jps一起使用
        选项:-9
        kill -9  【pid】

    6.ifconfig 查看系统所有网卡的IP mac信息

    7.ping  检测网络质量和网络连接 检测当前主机与目标主机之间的网络连接状态和连接质量
        ping   主机名
                ip地址
                域名

    8、netstat  查看网络端口 net status
        选项:
            -t     #监控tcp协议的进程
            -l        #listenning
            -n     #显示端口号信息
            -p     # 显示进程的PID

            netstat -antp | grep  
     hive  --metastore   9083
           --hiveserver2   10000

    9、jps 查看正在运行的java进程
    3815 Jps
    pid(process id) J(java) ps(process)
    pid是系统自动分配的进程id号 进程重启 id号自动变化


七、克隆虚拟机 快照 VMware
    1.关闭Linux系统  关机:init 0 ; poweroff ; halt; shutdown  重启:init 6 ; reboot
    2. 虚拟机--》快照管理器--克隆
       虚拟机--》管理 --》克隆
        选择完整克隆而非克隆链接

    3.克隆出来的虚拟机 要修改主机名还有ip地址,关键是要修改网卡信息

    4.# vi /etc/hosts
    修改主机映射:个人的配置为:
    192.168.7.11 Linux03

     # vi /etc/sysconfig/network
     修改主机名 个人的配置为:apache(原)--》apche clone(克隆)

    5.网卡的信息(mac地址HWADD)
         # vi /etc/udev/rules.d/70-persistent-net.rules
         删除原来的网卡信息通过mac地址来区分,删除原来的信息
         并将新的网卡的name信息改为eth0
    
    6.重命名网卡配置名称
         # mv /etc/sysconfig/network-scripts/ifcfg-Auto_eth1 /etc/sysconfig/network-scripts/ifcfg-eth0         

         # vi /etc/sysconfig/network-scripts/ifcfg-eth0
         BOOTPROTO=static

         # service network restart

    7.修改网卡名称:将Auto_eth1 修改为System eth0

    

# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:8f:24:b5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

    8.# reboot   重启虚拟机(因为修改了主机名)
     同时修改windows中主机映射,增加:
     C:\Windows\System32\drivers\etc\hosts
     192.168.7.55 java.apache.com


八、搭建Hadoop集群的3台虚拟机的要求:
    主机名            ip地址         username   password
1   hadoop1       192.168.x.4       xxx            123456
2   hadoop2          192.168.x.5       xxx            123456
3   hadoop3          192.168.x.6       xxx            123456

所有节点上的主机映射都一样,都包含所有的节点洗信息
192.168.x.4 hadoop1
192.168.x.5 hadoop2
192.168.x.6 hadoop3

所有节点检查以下内容:
1.关闭防火墙
$  sudo  service iptables status
iptables: Firewall is not running.
2.不随机启动防火墙
$ sudo chkconfig --list | grep iptables
iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off
3.关闭安全子系统
$ cat /etc/sysconfig/selinux
SELINUX=disabled
4.安装jdk
$ java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
原创粉丝点击