解释:
[root@linux01 Desktop]#
root 用户,是超级用户
linux01 主机(主机名:linux01.hadoop.com)
Desktop 用户所在目录(工作目录)# 超级用户($ 代表普通用户)
常用操作
历史命令(使用 ↑ ↓ , 获取历史命令)
tab 补全(输入文件名补全或提示)
clear (ctrl+l)
pwd (print name of current/working directory)
查看当前位置
家目录 root 用户 /root
普通用户 hadoop /home/hadoop
man 命令 按 q 退出
命令 -help
1. ls (list directory contents)
2. cd
./ 当前目录
../ 上一级目录
cd ~
cd 回到家目录
3. mkdir:创建目录
多级目录 -p
mkdir -p a/b/c
4. touch:改变文件属性
5. rmdir 删除空目录
rmdir test
6. rm 删除文件或目录
-r 迭代
-f 强制:不要问我直接删
7. cp:复制
-r:递归复制目录
8. mv(移动剪切、重命名)9. cat(查看较少内容)10. more
分页向下查看(空格)
逐行向下查看(回车)
按 q 或者 Ctrl+ C 终止退出查看的状态
11. less
12. head
13. tail -3 文件
查看文件后三行
-f 动态查看,跟文件描述符
-F 动态查看,跟随文件名
14. 关机
shutdown -h now
init 0
15. 重启
reboot
init 6
- 命令模式
ndd 删除当前行开始的 n 行
nyy 复制当前行开始的 n 行
p 粘贴到当前行后面
u 撤销
- 插入模式
在命令行模式,按 a, i, o
a:光标够
i:光标位置
o:光标下一行插入
- 底行模式
在命令行模式下
键入: 进入底行模式
w 保存,q 退出,! 强制
wq 保存并退出
q! 强制退出,不保存修改
su - 切换为超级用户
1) 主机名不能以数字,. 开头, 包含特殊字符(*@$)
hostname 查看主机名
hostname centos01 临时修改主机名, 重启失效
vi /etc/sysconfig/network 永久修改, 重启生效
2) 修改 ip
1) 界面修改
2) # vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes // 开机自动连接网络
BOOTPROTO=static // 设置为静态 dhcp 为动态, none 为不指定
# service network restart
3) 修改主机映射虚拟机
# vi /etc/hosts
192.168.247.110 centos01
Windows
C:\Windows\System32\drivers\etc\hosts
windows ping 服务器
ping ip
ping 主机名
服务器 ping 网关
用户组: 方便管理用户, 举例: 学校为了方便管理学生, 对学生进行分班
root :x:0:0:root:/root:/bin/bash
root 用户名
x 密码
0 用户 id
0 用户组 id
root 用户描述
/root 用户家目录
/bin/bash 用户所用的 shell
当创建一个用户,系统会默认创建一个和用户名相同的用户组
- root 用户, 超级用户, 最高权限, 在实际的生产环境中, 尽量不要使用 root 用户
用户 UID 0
- 普通用户
用户 UID 500 开始
- 伪用户 系统给一些进程, 分配 ID 号, 这部分为伪用户, 不能真正的登录, 也没有家目录
UID 在 1~499
- 创建用户
# useradd xiefei
# passwd 密码 设置或修改密码
-
删除用户
# userdel -r xiefei 彻底删除用户
- r 递归删除用户家目录
#groupadd 用户组
#su – 切换为 root 用户
#su – hadoop 切换为 hadoop
su 和 su – 的区别: 前者切换用户, 后者切换用户及用户环境
# exit 退出用户
drwxr-x–x
d 代表目录
– 代表文件
rwx 所属用户(u) 的权限
r-x 所属用户组(g) 的权限
–x 其他用户(o) 的权限
(用户是学生, 所属组是班级, 其他学生 举例分析)
r 可读
w 可写
x 可执行
rwx 可读可写可执行
r-x 可读可执行
rwx 也可以表示为 111 7
rw- 110 6
r-x 101 5
r– 100 4
- 修改权限
# chmod 764 test.c 修改为可读可写可执行
# chmod u+x test.c 为所属用户添加执行权限
# chmod g+w test.c 为所属用户组添加写权限
# chmod o-x test 删除其他用户的执行权限
# chomd 777 -R test/ 递归修改 test 的所有文件权限
- 修改所属用户
# chown hadoop msg.txt 把 msg.txt 修改为 hadoop 所有
- 修改所属用户组
# chgrp hadoop msg.txt
- 修改所属用户及所属用户组
# chown hadoop:hadoop -R hadoop/
-
向用户组添加用户及删除用户, 查看用户所属用户组
# gpasswd -a hadoop mygroup
# gpasswd -d hadoop mygroup
# groups hadoop
- 管道符 |
把前一个命令的输出结果传递给后面的命令处理
# cat /etc/passwd | more
- 使用 grep 过滤
# cat /etc/passwd | grep ‘root’
- 过滤条件
# ll /etc/ | grep ‘sysconfig’
# ifconfig | grep ‘inet’ 查看 ip
- 添加 >>, 覆盖 >
# ll > test.txt
# ll >> test.txt
- wc (word count)
-l 统计行
-w 统计 word
# wc -l /etc/passwd
# wc -w test.c
- 统计文件或目录大小
# du -sh /lib
- 显示当前系统进程
# ps -ef
# ps -ef | grep ‘java’
语法格式:
find 范围 条件
- 按文件名
# find / -name init
模糊查询带有关键字的:$ find /etc/ -name *work
查找关键字开头的文件:$ find /etc/ -name init*
匹配单个字符 $ find /etc/ -name ???work
不区分大小写匹配 $ find /etc/ -iname ???work
- 按文件大小
选项:-size
指定方式:+ 大于,- 小于,不加符号表示等于
$ # find /etc/ -size +2M
- 按所属用户, 用户组
# find /root -user hadoop
# find /root -group hadoop
- 按文件类型
# find /etc/ -name *work -type f 文件
# find /etc/ -name *s -type d 目录
root ALL=(ALL) ALL
user01 ALL=(root) NOPASSWD: ALL
第一个 ALL 是指网络中的主机,它指明 user01 用户可以在此主机上执行后面的命令。
第二个括号里的 ALL 是指目标用户,也就是以谁的身份去执行命令。
最后一个 ALL 是指命令。
windows 常见: .rar .zip
linux 常见: .tar .tar.gz .gz
- 压缩解压为.tar
tar cvf content.tar Main.java msg.txt 将 Main.java msg.txt 压缩为 context.tar
tar xvf content.tar -C test 将 content 解压到 test 文件夹下
- 压缩解压为 .tar.gz
# tar -zcvf test.tar.gz ./ 将当前目录压缩
# tar -zxvf test.tar.gz -C ./ 压缩文件加压到当前目录
- 压缩解压:.gz 不保留源文件
压缩
$ gzip hello.mp4
解压
$ gunzip hello.mp4.gz
选项:
-z, –gzip, –gunzip, –ungzip filter the archive through gzip
-c, –create create a new archive
-x, –extract, –get extract files from an archive
-v, –verbose verbosely list files processed
-f, –file=ARCHIVE use archive file or device ARCHIVE
f 后面必须跟上要处理的文件名
- 查看安装软件
$ rpm -qa | grep jdk
查看某个文件属于哪个 rpm 包安装的
# rpm -qf /etc/ntp.conf
- 安装卸载
a) 安装:
# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm
用法:rpm -ivh 软件名(.rpm)
选项:-i install 代表安装
-vh 显示详细的进度
# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm
b) 卸载
选项:-e 代表卸载 –erase
用法:rpm -e 软件名(.rpm) –nodeps (不验证依赖卸载)
# rpm -e tree-1.5.3-3.el6.x86_64 –nodeps
c) 卸载自带 jdk
$ sudo rpm -e java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64 –nodeps
$ sudo rpm -e java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64 –nodeps
// 重新生效
$ source /etc/profile
-
安装 jdk
- 创建两个目录
$ sudo mkdir /opt/software // 安装包的存放目录
$ sudo mkdir /opt/modules // 解压安装的目录
2. 修改目录的所属用户及所属用户组
$ sudo chown user01:user01 /opt/software/ /opt/modules/
3. 上传并解压 jdk
$ tar -zxf jdk-7u67-linux-x64.tar.gz -C ../modules/
4. 配置环境变量
# vi /etc/profile
末尾添加
#JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.7.0_67
export PATH=$PATH:$JAVA_HOME/bin
5. 使生效
#source /etc/profile
6. 检查是否成功
java -version
- 前提是必须连接外网
- 用来解决 rpm 依赖性问题
- 方便、快捷、自动解析依赖
- 查询
# yum list // 查看 yum 源上拥有的软件
# yum list installed | more // 查看系统中已经安装好的 rpm 包 等同于 rpm -qa
$ sudo yum list installed | grep tree
- 安装
# yum install httpd-devel.x86_64
选项:install 后缀不需要加.rpm 可以直接使用命令
选项:-y , 表示直接自动确认
# yum -y install httpd-devel.x86_64
$ sudo yum install tree
- 卸载
# yum -y remove httpd-devel.x86_64
$ sudo rpm -qa | grep tree
- 常见问题
不通外网, 网络质量不佳
- top 查看系统资源 –> 相当于任务管理器
每隔 3 秒更新一次
按 q 退出浏览状态
- free 查看内存信息 –》yuan 可能会用到
选项:-m, 就是以 MB 格式显示
- df -l 查看硬盘分区信息
- ps -ef 查看系统进程
ps -ef | grep crond
jps 查看系统正在运行的 java 进程
- kill 杀死正在进行的进程 -》结合 jps 一起使用
选项:-9
kill -9【pid】
- ifconfig
- ping 检测网络质量和网络连接
ping 主机名
ip 地址
域名
- netstat 查看网络端口
选项:
-t #监控 tcp 协议的进程
-l #listenning
-n #显示端口号信息
-p # 显示进程的 PID
netstat -antp
- jps 查看正在运行的 java 进程
- vmstat 2 5
可以展现给定时间间隔的服务器的状态值, 包括服务器的 CPU 使用率,内存使用,虚拟内存交换情况,IO 读写情况
2 表示间隔时间
5 表示采集次数
–》在联机应用(分布式)中,一般会关闭防火墙。防火墙默认情况下,出于安全考虑会限制一些应用的网络访问(比如 rpc 通信端口),为了保证多机通信的稳定,可以选择关闭防火墙
- 关闭防火墙并且不开机启动 (/etc/inittab 启动级别)
1. 关闭 Linux 防火墙
# service iptables stop ## 关闭防火墙
# service iptables status ## 查看防火墙状态
iptables: Firewall is not running.
2. 设置不开机启动防火墙
# chkconfig iptables off ## 不随机启动 设置开机启动使用 on
3. 查看防火墙的开机启动设置
$ sudo chkconfig --list | grep iptables
- 关闭安全子系统
# vi /etc/sysconfig/selinux
修改下面 SELINUX=enforcing 为 SELINUX=disabled
- 第一行:#!/bin/sh 开头 或 #!/bin/bash 开头
声明是什么类型的 shell
- 注释:#
- shell 脚本以.sh 结尾
- 执行 shell 基本的两种方式:
1)sh hello.sh #执行 shell 脚本
2)./hello.sh #这种方式要求这个脚本拥有执行权限
shell 的变量 num=123;str=”hello world”
定义变量没有数据类型
引用变量需要在变量前面添加 $ 符号
保存系统运行时使用的变量
》用户变量
.bash_profile 每个用户主目录下都有这么这个文件,用来保存每个用户的环境变量
》系统变量
/etc/profile: 系统全局生效的配置文件
将传递给脚本的参数保存在位置变量中
以便于在脚本中引用这些变量
Bash 定义 9 个位置变量:$1 … $9
$0: 代表的是当前脚本的名称
#! /bin/sh
echo "这是第一个变量 $1"
echo "这是第一个变量 $2"
echo "这是第一个变量 $3"
echo "这是第一个变量 $4"
echo "这是第一个变量 $9"
$0:脚本名称
$!: 后台运行的最后一个进程的 PID 号
$$: 当前进程的 ID 号
$#: 当前 shell 的参数个数
$* 显示所有的参数内容(整体)
$@: 显示所有的参数内容(逐个读取)
$?: 判断,表示程序退出的代表(返回 0 代表成功,非 0 代表失败)
#! /bin/sh
echo "脚本名称: $0"
echo "当前进程的 ID 号: $$"
echo "当前 shell 的参数个数:$#"
echo "显示所有的参数内容(逐个读取:$@"
aaaaa
# 这里会打印一个非 0 的值,表示前一行命令执行出错
echo $?
- 语法格式:
name=value
等号两边不能有空格
变量对大小写敏感
调用变量的值 $name
- 变量的赋值
1. 直接赋值 tag1=112
2. tag2=$tag1
3. szie=ls ~/
将命令赋值给变量 飘号或者反引号
shell 的字符串 / 命令(echo):
#! /bin/sh
# 赋值号前后不能有空格
# 变量没有类型
numOfPerson=100;
echo $numOfPerson
# 取变量 numOfPerson 赋值给 n
n=$numOfPerson
echo "n=$numOfPerson"
# 将 ls -l /etc 执行的内容赋值给 str
str=`ls /etc`
echo 可以不加引号 #可以正常输出的输出变量
echo 加单引号 #单引号内容原样输出, 单引号将剥夺其中的所有字符的特殊含义
str=’hello $num’
echo 加双引号 #双引号可以输出变量, 输出 ” 等, 需转义
str=”hello $num”
shell 的字符串拼接
str=”hadoop”
a=” 你好 $str”
a="你好"\$str
- 算术
第一种写法 $(())
第二种写法 $[]
第三种写法 expr 表达式 只能接受数值,expr 本身是 shell 命令,输出的时使用反引号
a=6;b=5
echo $((a+b))
echo $(($a * $b))
echo $[a+b]
echo $[$a * $b]
expr $a - $b
expr $a \* $b
- 逻辑运算
-》&& 逻辑与(命令控制符)
cmd1 && cmd2 // 前面的命令执行成功才会执行后面的命令
-》|| 逻辑或
cmd1 || cmd2 // 前面的命令执行失败才会执行后面的命令
-》;无逻辑符号
cmd1;cmd2
- 两种写法
a=6
b=9
#第一种 变量和比较符之间空格可省略
if test 6 -gt 9
then
echo bigger
fi
#第二种 变量和比较符之间的空格必须
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 或 [] 进行测试的时候,必须要有空格
test $1 -gt 60* **-a** *$1 -lt 70 同一个条件内使用
[ $1 -ge 70* **-a** *$1 -lt 80 ]
elif [$1 -ge 60] && [$1 -lt 70]
$ [“990” -le “995”] && [“123” -gt “33”] 这里要用 &&
- 字符串的比较
= 等于
!= 不等于
-z $str 长度为 0 则为真
-n “$str” 长度不为 0 则为真
$str 字符串不为空则为真
#!/bin/sh
str1="abc"
str2="abc"
str3="cde"
str4=
if [$str1 = $str2]
then
echo str1 和 str2 相等
fi
if [$str1 != $str3]
then
echo str1 和 str3 不相等
fi
if [-z $str1]
then
echo str1 长度为 0
fi
if [-n "$str3"]
then
echo str3 长度不为 0
fi
if [$str1]
then
echo str1 不为空
fi
if [$str4]
then
echo str4 不为空
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
if 条件判断
then
command
elif 条件判断
then
command
elif 条件判断
then
command
…
else
command
fi
#!/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
#!/bin/sh
# read socre and choose level
# read 相当于 Java 中的 scanner 是一种交互式命令,读取设备的输入
echo "请输入学生成绩 score:"
read score
if test $score -ge 90;
then
echo level A;
elif [$score -ge 80 -a $score -lt 90]
then
echo "level B";
elif test $score -ge 70 -a $score -lt 80
then
echo "level C";
elif [$score -ge 60] && [$score -lt 70]
then
echo "level D";
else
echo 不及格;
fi
- 循环语句
1)for 循环
I)
for((初始化变量值; 结束循环条件; 循环控制语句))
do
循环体
done
#!/bin/sh
sum=0
for ((i=0;i<10;i++))
do
echo $i
sum=$[$sum + i]
done
echo $sum
2)第二种语法格式:
for 变量 in 值 1 值 2 … 值 N
do
循环体
done
#!/bin/sh
for MONTH in Jan Feb Mar Apr May Jun July Aug Sep Oct Nov Dec
do
echo $MONTH
done
#!/bin/sh
for file in `/bin/ls $1`;
do
echo $file;
done
- while 循环
1.
while [condition #循环条件]
do
#statements
#【循环体】
#【循环控制】
done
#!/bin/sh
i=1
while [$i -le 10]
do
sum=$((sum+i))
i=$[i + 1]
done
echo $sum
#!/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
#!/bin/sh
#Read /ect/sysconfig/network-scripts/ifcfg-eh0 and print out
FILE=/etc/sysconfig/network-scripts/ifcfg-eh0
while read -r line
do
echo $line
done < $FILE
read 中
参数 -r 屏蔽,
如果没有该选项,则作为一个转义字符,有的话 就是个正常的字符了。
command < file 将输入重定向到 file。
- case 类似于 java 中的 swich case
第一种语法格式:
#!/bin/sh
echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' r'm;; 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 脚本的调用(在一个脚本中去调用另外一脚本)
which touch # 查看 shell 位置
#!/bin/sh
source /home/hadoop/shell/hello.sh
- 显示系统时间
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:%S’
2017-05-02 11:20:10
选项:-s
用法:# date -s “2016-12-08 10:43:00”
ntpdate 命令
用法:# ntpdate 网络时间服务器(182.92.12.11)
sudo ntpdate ntp.api.bz
- )–> 周期性执行计划任务
- 选项使用:
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 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * *
分钟 小时 天(of 月)月(of 年)星期(of 周)
特殊字符
““ 代表所有的取值范围内的数字,如月份字段为,则表示 1 到 12 个月;
“/” 代表每一定时间间隔的意思,如分钟字段为 */10,表示每 10 分钟执行 1 次。
“-“ 代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中 0 -23/ 2 表示在 0~23 点范围内每 2 个小时执行一次。
“,” 分散的数字(不一定连续),如 1,2,3,4,7,9。
注:由于各个地方每周第一天不一样,因此 Sunday=0(第一天)或 Sunday=7(最后 1 天)。
实例)
每一分钟执行一次 command(因 cron 默认每 1 分钟扫描一次,因此全为 * 即可)*/1 * * * * /bin/date >> /root/Desktop/date.txt
每小时的第 3 和第 15 分钟执行 command
3,15 * * * * /bin/cp /root/Desktop/date.txt /root/date.log
每天上午 8 -11 点的第 3 和 15 分钟执行 command:3,15 8-11 * * * command
每隔 2 天的上午 8 -11 点的第 3 和 15 分钟执行 command:3,15 8-11 */2 * * command
每个星期一的上午 8 点到 11 点的第 3 和第 15 分钟执行 command
3,15 8-11 * * 1 command
每晚的 21:30 执行 command:30 21 * * * command
每天晚上 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
右击虚拟机 -> 快照 -> 拍摄快照
从快照中克隆
从虚拟机中克隆
管理 -> 克隆 -> 选择从快照(虚拟机当前状态)-> 完整克隆
克隆出来的虚拟机 要修改主机名, 映射, 还有 ip 地址,关键是要修改网卡信息
1) 修改主机名
# vi /etc/sysconfig/network #修改主机名
2) 修改映射
# vi /etc/hosts #修改主机映射(linux,windows 都要改)
3) 修改 网卡
# vi /etc/udev/rules.d/70-persistent-net.rules # 网卡的信息(mac 地址 HWADD)
删除原来的网卡信息(通过 mac 地址来区分)
并将新的网卡的 name 信息改为 eth0
修改后内容
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?“, ATTR{address}==”00:0c:29:b6:46:5d”, ATTR{type}==”1″, KERNEL==”eth“, NAME=”eth0”
4) 修改 ip
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
删除 uuid, 修改 mac 地址,IPADDR,ONBOOT,BOOTPROTO
ONBOOT=yes
BOOTPROTO=static
HWADDR=00:0c:29:b6:46:5d
IPADDR=192.168.239.201
PREFIX=24
GATEWAY=192.168.239.2
DNS1=192.168.239.2
NAME=”System eth0″
# reboot 重启虚拟机(因为修改了主机名)