linux命令

ls 列出当前目录下的所有文件和文件夹

~当前用户的主文件夹

exit或者直接叉掉 退出当前终端

位置-计算机(系统里所有目录和文件)

Linux的根目录 / Linux一切皆文件 从根开始所有目录构成一棵树

windows 里的\是转义字符 用\ \表示\ Linux用/避免转译的麻烦 比如:/root/Desktop

centos7用 xfs :64位高性能日志文件系统 擅长处理大文件

centos6用 ext4:第四代扩展文件系统

挂载 /boot /swap 除了boot和swap 其他都挂载到根分区:/

cd / 切换到根目录

/bin目录下存放的是可以直接执行的常用命令

/dev 设备目录

/etc放置系统管理所需要的配置文件

/home 用户的主目录

/opt 可选目录 用来装第三方软件的目录

/media 媒体目录 相当于可移动媒体设备的挂载点

/mnt 移动化存储设备的挂载点

/proc 进程目录

/run 运行目录 放正在执行的执行信息

/srv 和系统服务有关

/sys 系统硬件信息的相关文件

/tmp 临时目录

/var 可变目录

可以作改动的目录: /var /opt /home /root /tmp

改文件的时候 改复制的副本,比如把某个文件复制到桌面上 要先cd到桌面目录改副本

切换语言的快捷键 win+空格 【要先去设置里language 输入源中添加汉语(intelligent pinyin)】

打桌面 可以打一个桌 然后按tab自动进行补全

然后用vim编辑器编辑文件 示例:vim 文件名

vim 有三种模式:一般模式 :复制 粘贴 删除 按 i 可以进入编辑模式:编辑文本 按esc退出回到一般模式

命令模式 按:进入 按esc返回一般模式

要保存 需要进入命令模式 :w w表示写入 按回车即可保存 如果不想更改刚刚写入的数据 按u撤回操作 此时并未保存,还需:w

普通模式 yy 复制光标当前一行 p 粘贴 先敲5再敲p表示粘贴5份

想复制连续的8行 8然后yy

按dd删除一整行 3dd连续删3行

y$(就是y然后shift4)复制此行当前位置之后的内容

y^(就是y然后shift6)复制此行当前位置之前的内容

复制一个词(从光标位置开始 到当前词结束) yw

删除一个词(从光标位置开始 到当前词结束) dw

d$(就是y然后shift4)删除此行当前位置之后的内容

d^(就是y然后shift6)删除此行当前位置之前的内容

x 剪切 一个字符

shift+x 从后往前一个一个删

r 更改当前字符 比如这个字符是a 你先r 然后shift a 就是把a替换成A

shift+r 然后输入asdhkahdk 会用asdhkahdk 依次替换后面的字符

shift+6 光标移到当前行 行头

shift+4 光标移到当前行 行尾

w 光标移到下一个词的词头

e 光标移到下一个词的词尾

b 光标移到上一个词的词头

gg 跳到文档开头 或者shift+h也行

shift+g 移到最后一行的行尾 或者shift+l也行

先5 然后shift+g 跳到第5行行头

:set nu 可以直接显示所有行号 这样可以直接根据行号跳转

:set nonu 不显示行号

i是在当前光标前进行插入 a是在当前光标之后进行插入 o是直接跳到下一行进行插入

shift+i 跳到当前行的行头进行插入

shift+a 跳到当前行最后进行插入

shift+o 跳到当前行之上进行插入

要退出vim :q :w保存 :wq 保存并退出 :q!不保存强制退出

编辑模式必须先esc再:才能跳到命令模式

:wq! 强制把只读文件作保存退出

/ 查找某个关键字 比如/boot 就是查boot 按1、2、3、4。。定位到第几个boot n会顺着向下找 shift+n顺着向上找

:noh 取消高亮显示

😒/boot/booot 把当前光标指向的这一行的第一个boot 替换成booot 前面的表情是:s 不知道有什么毛病哈哈

😒/boot/booot 把当前光标指向的这一行的所有boot 替换成booot

:%s/boot/booot 把带boot 的每行的第一个boot 替换成booot

:%s/boot/booot/g 把这个文档所有boot换成booot

第五章 网络配置和系统管理操作

ping的时候可以用ctrl+c取消

win+r cmd 然后ipconfig 找到以太网ipv4地址 (或者 控制面板--->网络和Internet--->网络和共享中心--->更改适配器设置 右键WLAN、状态、详细信息 就可以看到ipv4地址 ) 复制Ipv4地址到终端里去 ping ctrl+shift+v(就是把刚刚cmd复制的地址粘贴到终端上) 成功说明虚拟机可以接收到主机的信息

主机能否接收到虚拟机的信息? 终端输入命令:ifconfig (inet后面跟的就是虚拟机ip地址) 或者(虚拟机中:应用程序--->系统工具---->设置----->网络------>有线连接右边小齿轮点开 就能看见) ctrl+shift+c 复制 然后去cmd里ping一下

修改静态ip的命令: vim /etc/sysconfig/net 然后可以按tab补齐 vim /etc/sysconfig/network-scripts/ 然后 vim /etc/sysconfig/network-scripts/ifcfg-ens33 【进入后先按 4 然后shift+g 到第四行,然后ww移到第三个词上 然后dw删掉当前词 接着i进入插入模式,写入static 然后esc】

接下来修改静态ip地址 在末尾加上这三行

IP地址

IPADDR=192.168.253.100

网关

GATEWAY=192.168.253.2

域名解析器

DNS1=192.168.253.2

这三个地址里面的253与虚拟机ipv4地址中的第三个字段一致(要和虚拟网络编辑器(在‘编辑’中)中的一致,这台笔记本第三个字段是253,所以我填253) 100就是跟虚拟机主机名字一致 比如hadoop100

复制三面三行 shift+g光标移到末尾 然后o 然后粘贴 然后:wq 保存退出 ifconfig发现ip地址和原来一样

需要重启网络服务 service network restart 再ifconfig 发现修改成功 把ens33中的ip复制到cmd里 ping一下看看能不能连通

复制外网地址(cmd里ipconfig可以查看)在虚拟机里ping一下外网地址发现也可以ping通 ping www.baidu.com 发现也能通

查看虚拟机名字 hostname

vim /etc/hostname 然后修改里面的名字,这种方法需要重启,下面更简单的办法:

hostnamectl set-hostname 名字 然后看一下hostnamectl 发现已经被修改

编辑hosts文件保存主机名与ip之间的映射关系:

vim /etc/hosts 保存下面的映射关系

192.168.253.100 hadoop100
192.168.253.101 hadoop101
192.168.253.102 hadoop102
192.168.253.103 hadoop103
192.168.253.104 hadoop104

接着去修改windows中的hosts文件 路径:C:\Windows\System32\drivers\etc

用记事本把hosts文件打开,粘贴上面的映射关系,另存到桌面,去掉后缀,再替换原先的hosts

文件。(我的笔记本居然可以直接保存,神了) 现在可以直接去cmd ping hadoop100试试

远程登录:进cmd ssh root@hadoop100 (root表示以root用户登录) 可以直接检查 vim /etc/sysconfig/network-scripts/ifcfg-ens33

可以直接 :q 退出 想退出登录 输入exit

使用xshell进行远程登录(前提是打开vmware,不然连个鸡毛) 新建会话 名称填hadoop100 用户身份验证中填 示例(root 和密码) 外观里可以改字体大小和背景颜色 点击连接就可以 弹警告就勾选接受并保存 工具--选项--终端里面 把鼠标向右按钮改成粘贴 把下面 选定文本自动复制勾选上

安装xftp 可以实现文件上传和下载( https://www.xshell.com/zh/free-for-home-school/ )用户名jdamaze邮箱就是qq的

如果xftp里面文件出现乱码,去属性--选项 里把字符集改成UTF-8

service在/usr/sbin/ 目录下

ls /usr/sbin/

ls /usr/sbin/ | grep service grep可以筛选出service

启动后一直存在的进程叫 服务

service 服务管理(centos6 版本-了解就行)

(1)基本语法:service 服务名 start|stop|restart|status

(2) 查看服务的方法: ls /etc/init.d/服务名 发现服务很少 这就需要掌握cencos7的命令

cencos7

(1)语法: systemctl start|stop|restart|status 服务名

(2) 查看服务的方法:ls /usr/lib/systemd/system

centos7兼容centos6的service命令 既可以service network restart)(centos6的办法) 又可以systemctl restart network(centos7的办法)

ping不通的情况下更推荐保留networkmanager服务,关闭network服务

看network状态:systemctl status network systemctl status NetworkManager

systemctl stop network 停掉network结果发现上不了网了(ping 百度不行,主机ping hadoop100也不行)

怎么恢复网络?:systemctl restart NetworkManager

(setup 按tab键可以确定/退出)setup命令可以进入图形化界面查看系统服务 回车进入系统服务,前面带星号的会开机自启动,不带星号的不会开机自启动。 选中network的星号 按下空格,它就不会开机自启动了。

centos7所有的服务都基于systemd这个守护进程

Liunx运行级别【centos6】

Liunx系统有7种运行级别:常用的是级别3和5

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

运行级别2:多用户状态(没有NFS),不支持网络

运行级别3:完全的多用户态(有NFS),登录后进入控制台命令行模式

运行级别4:系统未使用,保留

运行级别5:x11控制台,登录后进入图形GUI模式

运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

centos7的运行级别简化为:

multi-user.target 等价于原运行级别3(多用户有网,无图形界面)

graphical.target 等价于原运行级别5(多用户有网,有图形界面)

systemctl get-default 查看当前运行级别

修改当前运行级别 systemctl set-default TARGET.target (这里TARGET取multi-user或者graphical)

centos6中查看默认的启动级别 vim /etc/inittab

ctrl+alt+F2 切换到运行级别3 切回去 ctrl+alt+F1

init 3也可以切换到运行级别3 输入root和密码 再init 5 又可以切换回来

centos6 查看服务开机是不是自启动 chkconfig --list

用命令关闭所有开机自启动network: chkconfig network off

用命令打开所有开机自启动network: chkconfig network on

关闭对应某个级别的自启动,比如3: chkconfig --level 3 network off

打开对应某个级别的自启动,比如3: chkconfig --level 3 network on

systemctl status NetworkManager 查看Loaded那一行 NetworkManager.service; enabled;表示现在的状态是自启动 vendor preset: enabled 表示默认的状态是自启动

systemctl disable NetworkManager 可以关掉自启动 再次查看 变成 NetworkManager.service; disabled; vendor preset: enabled

systemctl enable NetworkManager 可以再次开启自启动

centos7 查看服务开机是不是自启动 : systemctl list-unit-files 进入之后按pagedown可以大范围往下

static 表示静态,这个服务与其他服务有关,不能直接设定静态还是动态。

centos6的防火墙叫iptables(顾名思义就是限制哪个ip可以进入的一张表)

centos7的防火墙叫firewalld

systemctl status firewalld 查看防火墙状态

systemctl stop firewalld 停掉防火墙 变成inactive

关掉防火墙自启动 systemctl disable firewalld

打开防火墙 systemctl start firewalld

关闭防火墙 systemctl enable firewalld

shutdown 一分钟后关机,想取消 shutdown -c

shutdown now 立刻关机

shutdown 3 三分钟后关机

shutdown 15:28 在15:28关机

sync 把数据立刻从内存同步到硬盘中

为什么shutdown后一分钟才会关机? 因为延迟写 (把数据写入缓冲区,如果一下子关机 数据会丢失,如果shutdown now 也要先sync才行)

halt 立刻停机,关闭系统,但不断电

poweroff 关机,断电

reboot 重启 等同于 shutdown -r now

shutdown -h now (等同于poweroff)

shutdown -r now (等同于reboot)

shutdown [选项] 时间

选项:-H 相当于--halt 停机

​ -h 关机

​ -r -r=reboot 重启

参数 now 立刻关机

​ 时间 等待多久后关机(时间单位是分钟)

实操篇(重点)

筛选带sh的文件,把每个内容的完整信息都用一行列出来

ls -l /bin/ | grep sh

man 获取帮助信息

基本语法

man [命令或配置文件]

man ls 进去之后 一般用空格向下翻页 f向下翻页 b向上翻页 pagedown向下翻页 pageup向上翻页

cd exit history这些是内置命令 ls是外部命令

内置命令要加-f才能查看: man -f cd 可以看见3个cd的解释,如果想看1p解释下的cd: man 1p cd 查看3下面 cd的解释 man 3 cd

man cd 的时候出来的是bash,因为cd是内置进shell中的。

type cd 可以查看cd是什么类型的命令 显示内嵌就是内嵌命令,显示别的就不是。

history 可以查看历史敲过的命令

man man 也行

man打开的命令太多太复杂

help更简洁高效,可以看命令怎么用,但只能获得shell内置命令。

help 命令 help cd

外部命令简洁化方式

命令 --help

比如 ls --help

ctrl+c 停止进程

ctrl+l 清屏 等同于clear 彻底清屏是 reset

擅用tab进行补全

文件目录类命令

直接去xshell输命令

pwd显示当前工作目录的绝对路径

cd /etc/sysconfig/ 然后pwd看看现在的路径

pwd也是内嵌命令 type pwd看看

想从a/b/c/d 跳到a/b/c/e 不可能把前面都输了,要用到相对路径

例如 cd/root/桌面/ cd/root/视频/ 现在想从桌面直接跳到视频 要输入 cd ../视频/ ..表示切回当前目录的上层路径

cd - 可以切换到上一次所在的位置 比如/下面有abcdefg 从a切换到g 现在在g cd - 就回到a 再cd - 又回到g 反复横跳

先cd /root 再cd/etc/sysconfig/ 然后再cd - 就可反复横跳

直接cd 会回到当前目录的主文件夹 如果是用普通用户登录进去 cd /home/didi 直接cd就会回到home 如果用root身份 cd /root/桌面 再cd就会回到root

su可以切换用户 在root下可以直接切回didi: 需要先cd /home/didi/ 然后再su didi 然后pwd看看路径

想切回root可以直接exit

ls -a 把下面所有内容都显示出来(包括隐藏内容:名字前面带.的) ..表示上级菜单 .表示在当前目录 可以cd ./桌面/ 表示在当前目录下进行跳转

ls -l 长数据串列出(包括文件的属性和权限等数据)依次是 类型(前面带-的是文件 带d的是目录)和权限 所有者 用户组 创建的时间 文件名

llls -l是一样的 type ll 看看

ls -al 把隐藏文件的属性列出来

mkdir a 以相对路径 创建一个叫a的文件夹 ls看看

mkdir /b 以绝对路径创建一个叫b的文件夹 ls / 看看

mkdir b c 同时创建b c

mkdir d d/e d/e/f 在d里面创建e 在e里面创建f 然后 ls d/ ls d/e/ 看看 这种办法太麻烦了(因为要创建f的时候,f没有父目录,所以得一个一个套)

mkdir -p g/h/i 如果没有g h 文件,但想要套娃,g里创建h,h里创建i,-p可以把gh这两个没有的文件一次性创建了 ls g/h/ 看看

rmdir a 删除a文件 (前提是a里面没有东西)

rmdir b c 同时删两个(前提 b c 里面没东西)

rmdir d g 会失败 (因为dg里面有文件)

rmdir d/e/f/ d/e/ d/ 嵌套删掉d (太麻烦了)

rmdir -p g/h/i/ (如果删掉i之后,h为空,h也没了,以此类推,g也没了)

touch 创建空文件

touch hello (hello不带后缀,在linux里默认就是文本文件) 会在当前目录下创建

cd /home/didi/ 然后touch hello2 然后ls 再cd - 然后ls看看

touch /home/didi/hello3 可以直接指定路径创建hello3 然后ls /home/didi/

vim hello4 也可以创建文件,但与touch不同之处是,如果vim完直接 :q 然后ls会发现没有hello4这个文件(不保存直接退出就没有这个文件) 但是vim 完 :wq 再ls 就有hello4这个文件

cp 复制文件或目录

cp [选项] source dest (功能描述: 复制source文件到dest)

选项 功能

-r 递归复制整个文件夹

参数 功能

source 源文件

dest 目标文件

cp 文件名 /home/didi/

cp 文件名 /home/didi/hello2 可以直接覆盖hello2中的内容 y确认覆盖 n不覆盖ls /home/didi/看看 然后vim /home/didi/hello2 看看,里面已经有内容了。

\cp 文件名 /home/didi/hello3 可以直接跳过询问,直接覆盖。

\cp是直接使用linux里的原生命令 type cp 发现cp是cp -i的别名 cp --help看看 -i是交互式,要覆盖会给提示

alias 能列出有多少别名的命令

mkdir a 先创建一个a cp 文件名 a/ 再复制一个文件到a 最后 cp -r a/ /home/didi/ cd /home/didi/a 然后ls看看 【一个文件夹下面有多个文件夹】

rm 删除文件或目录

选项 功能

-r 递归删除目录

-f 强制删除文件,不用确认。

-v 显示指令的详细执行过程

rm hello 然后y确认删除

rm -f 文件名 强制删(只能删文件,删不了目录) 不用确认

rm -r 目录名 然后y确认删除 可以把目录删掉

rm -rf a/ 可以不用确认 直接删掉目录a包括里面的所有东西 !!!!小心使用

rm -rf / 是删库跑路的命令 别用!!*

进didi,如果想把didi下的东西全删掉 rm -f ./* ./*表示当前目录下的所有东西

mv 移动文件与目录或重命名

mv 文件名 /home/didi/ ls发现root下面的文件没了跑到didi下面去了 mv 文件名 /root/ 再移回去

mv 文件名 /home/didi/1.cfg 文件会被移到didi下面并重命名成1.cfg(随便找个cfg后缀的文件移一下) mv /home/didi/1.cfg 文件名 可以移回来,弄成原本的名字。

mv 文件名 2.cfg 可以在当前目录重命名(相当于不移动) mv 2.cfg 文件名

cat 查看文件内容

cat 文件名

-n 可以显示行号

cat -n 文件名

more 文件内容分屏查看器

more 可以按页显示

more 文件名

空格可以翻页 回车可以一行一行下翻 f向下翻 b向上翻

= 可以看当前到多少行

shift+:+f 可以显示是哪个文件的多少行

q 可以直接退出

less 分屏显示 比上面的强大 可以动态加载内容 适合看大文档

less 文件名

用xftp8把一个十几M大的txt文档弄到虚拟机里,然后去xshell操作。

空格可以翻页 回车可以一行一行下翻 f向下翻 b向上翻 还可以pageup和pagedown

也可以=看行数

shift+g可以到最底 g回到开头

/字串 可以定位到文字(n向下搜寻 N向上搜寻)

?字串(n向上搜寻,N向下搜寻)

windows上的txt先搞成utf-8格式 不然less完是乱码

q离开less

echo 输出内容到控制台

echo hello world 中间空多少格输出还是一个空格

echo "hello world"双引号可以把里面空格原样输出

echo "hello \ world" 会输出hello \ world

echo "hello\nworld" 会输出hello\nworld

echo -e "hello\nworld" 会输出 hello

​ world

-e转译这些"两条\ 输出\本身 \n 换行符 \t 制表符也就是tab键"

>输出重定向(输出结果直接覆盖一个文件) >>追加

ll > info 会把ll输出的内容覆盖到info这个文件里,没有info会自动创建。 cat info看一下内容

ls > info 内容就被覆盖

echo "hello,linux" >> info 把hello,linux 追加到info中。

echo $然后tab补全 然后y 列出系统环境变量 q退出

示例 echo $PATH

还可以echo $HOSTNAME >> info

head 显示文件头部内容

head 文件 查看文件头10行内容

head -n 5 文件 查看头五行内容

tail 显示文件尾部内容

tail 文件 查看文件尾10行内容

tail -n 5 文件 查看尾五行内容

tail -f 文件 实时追踪文档的所有更新(!重要)

tail -f info 然后xshell再开一个窗口 echo hello >> info 观察到窗口1 info内容已经多了hello

去窗口1 ctrl+s 暂停,窗口2再追加,窗口1就不发生变化了。 但事实上这些追加都会被记录,按ctrl+q继续,info里的内容就变化了。 不想监控直接ctrl+c退出

用vim去修改info的内容,tail -f info 监控不到变化,本质是因为tail -f 利用索引节点进行监控,用vim修改info后,索引节点会变化,相当于文件都变了。

ls -i info 可以查看info的索引节点号

ln -s 软链接 ln不加s是硬链接

软链接(也称符号链接)类似于快捷方式 有自己的数据块,主要存放链接其他文件的路径。

ln -s [原文件或目录] [软连接名] (功能描述:给原文件创建一个软链接)

文件创建一个软链接:

cd /home/didi/ ln -s /root/info myInfo 去目录didi下面,给root里面的info创建一个软链接。 ls -l 可以看出myInfo 是个链接文件(前面带l) cd -回root 然后 ll (前面带-的是文件 带d的是目录) 在root里cat info 和在didi里cat myInfo 发现内容一样

vim myInfo shift+g 然后o去最后一行增加数据666 :wq保存退出 cd - 回root 然后cat info 发现下面多了666

目录创建一个软链接:

先去root里面 mkdir folder 然后 touch folder/file (在folder下创建空文件)

然后去didi下面 ln -s /root/folder/ /home/didi/myFolder 然后ll看看文件类型,前面带l本质上都是链接文件。

在root里 cd folder/ 然后pwd看看路径 然后cd /home/didi/myFolder 然后ls看看 然后pwd看到的是链接路径 pwd -P 看到的是实际路径

cd /root 可以 cd /home/didi/myFolder/ 进入myFolder这个目录 如果想进入/root/folder这个实际路径,可以 cd -P /home/didi/myFolder/ 然后pwd看看

删软链接:先cd /home/didi/ 然后 ls看看 删链接到文件的软链接比较简单 直接rm myInfo 然后y确认删除 再ls看到myInfo不见了 cd -去root 然后ls 看到info还在,因为我们删的只是一个快捷方式。再cd -回到didi,ls看到还剩myFolder 我们 rm -rf myFolder (f不用确认 r把下边子文件子目录全删掉) ls发现软链接没了,cd -回到root 然后ls发现folder还在。

如果用rm -rf 软链接名/ 删除,会把软链接对应的真实目录下内容删掉。

先在didi下恢复一下软链接 ln -s /root/folder/ myFolder ls看看 然后rm -rf myFolder/ 然后ls发现myFolder没被删掉 cd -回到root ls发现folder还在 cd folder/然后ls发现 folder下的file不见了

如果 rm -rf folder/ 再 cd /home/didi/myFolder/ 会提示没有那个目录 cd/home/didi/ 然后ls 发现myFolder是黑的 ll也能看见黑色,这是linux的提示,因为它指向的目录已经不存在了。我们直接rm myFolder就行了

history 查看历史执行过的命令 history 10 查看最近执行过的10条指令

!历史编号 可以重复调用该命令

history -c 可以清空所有历史命令

date 显示当前时间

date +%Y 显示当前年份(这里的+是要打上去的) date +%y 显示年份的后两位

date +%m 显示当前月份

date +%d 显示当前是哪一天

date "+%Y-%m-%d %H:%M:%S" 显示年 月 日 时 分 秒

date +%s 时间戳(1970-1-1 到当前时间的所有秒的计数)

date -d "1 days ago" 显示前一天的时间

date -d "-1 days ago" 显示明天的时间

date -d "-1 hours ago" 显示一小时后的时间

date -s "年-月-日 时:分:秒" 设置系统当前时间

cal 获取当天所在月份的日历

cal -3 获取 这个月 上个月 下个月 的日历

cal -m 可以在日历里把周一放在第一天

cal 2025 可以看到2025年每个月的日历

cal -y 可以看系统时间本年度的信息

用户管理命令

useradd 添加新用户

语法:

useradd 用户名 (添加新用户)

useradd -g 组名 用户名 (添加新用户到某个组)

cd /home/ user add tony 然后ls看看,home下面多了个叫tony的用户。

useradd -d /home/dave david 登录界面名字叫david,david的主文件夹叫dave,ls可以看到dave

passwd tony 给tony设密码(小于8个字符也行,要确认两次)

同样passwd david

可以去xshell里建tony 名称叫hadoop100_tony 主机叫hadoop100 然后设置用户密码,连接就行了,pwd看看路径。

david同理 exit可以登出

id tony 可以看有没有tony这个身份

cat /etc/passwd 查看创建了哪些用户 可以用分屏的方式看 less /etc/passwd q退出

su didi root用户跳到其他用户不用密码 ls 然后cd ~ 再pwd看看 现在在didi下面 su tony发现要密码,ls发现无法打开didi,因为tony和didi是平等的,cd ~跳到tony的主目录,pwd看看。exit 回退到didi ,ls,pwd看看, ls ../tony/发现权限不够,再exit就又回到root,ls什么都能看见,ls tony/ 然后ls didi/ 看看。

跳来跳去不知道在哪 直接 who am i (拆开查看的是最原始进来的用户是谁) 也可以简写whoami(合在一起看的是当前具体会话的身份是谁)

sudo 设置普通用户具有root权限

修改sudoers文件,授予tony使用sudo命令的权限:在root下 vim /etc/sudoers yy复制root开头的那行 直接p粘贴,dw把root删掉,按i插入tony。 esc退出编辑模式,:wq!保存强制退出。 接下来我们 su tony 然后 ls 发现权限不够 ,这个时候再 sudo ls 输入密码就可以看见root下的所有目录。

exit回到root下,删除tony: userdel tony (这里我发现删不掉,报错userdel: user tony is currently used by process 8240 解决办法:叉掉窗口重上,再删)然后去/home 然后ls 发现tony的文件夹还在,id tony ,看见编号都没了,其实tony已经不在了, cat /etc/passwd 也能发现tony不见了。 可以rm -rf tony/把文件夹一起删掉 userdel -r david 可以一步到位把文件夹和用户一起删掉

useradd tony useradd -d /home/dave david 把tony和david添加回去

cd ~ 去root的主目录 su didi 然后ls发现没有权限 sudo ls 居然可以看到root下的目录(视频可以,我的不行,会报告:didi 不在 sudoers 文件中。此事将被报告。 下面wheel组解释了这个问题,大概是视频里一开始就有wheel组,而我的didi需要先添加wheel组才能和视频一样。) cat /etc/group 看用户组相关的信息(视频里要sudo cat /etc/group ,我这边又不一样)

groupadd 新增组

exit回到root下 groupadd meifa 再 cat /etc/group 就能看见meifa

修改用户的组信息

usermod -g meifa tony

usermod -g meifa david 把tony和david加入美发组

id tony id david 看看

修改组名

groupmod -n haircut meifa id tony cat /etc/group看看变化

删除组

groupdel tony

groupdel david

再 cat /etc/group 看看

管理组

usermod -a -G wheel didi 给didi追加wheel这个管理组 (sudoers里有wheel 可以给所有在whell组的用户权限) wheel第三个ALL改成 NOPASSWD: ALL 以后sudo就不用输入密码。

文件属性

ll可以看文件属性 -开头的是文件 d开头的是文件夹 l开头的是链接 c开头的是字符类型的设备文件(鼠标、键盘) b开头的是跨设备文件(硬盘)

文件类型 属主权限 属组权限 其他用户权限

​ 0 1 2 3 4 5 6 7 8 9

d r w x r - x r - x

​ 目录 读 写 执 读 写 执 读 写 执

​ 文件 行 行 行

属组权限(当前文件属于哪个用户组,这个组里除了属主,别的用户拥有什么权限) -表示不能干什么

rwx作用于文件和目录的不同解释

(1)作用到文件:

[r]代表可读(read):可以读取,查看

[w]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前
提条件是对该文件所在的目录有写权限,才能删除该文件.

[x]代表可执行(execute):可以被系统执行

(2)作用到目录:

[r]代表可读(read):可以读取,ls查看目录内容

[w]代表可写(write): 可以修改,目录内创建+删除+重命名目录
[x]代表可执行(execute):可以进入该目录(cd)

在/下可以ll看root的权限

由于在didi下面无法访问root的主目录,所有可以直接把root下面的文件复制到didi,再查看。

在~下ls -al 可以连隐藏文件一起显示 cp ./anaconda-ks.cfg /home/didi/ 然后su didi cd ~ ls ll 然后cat anaconda-ks.cfg 发现权限不够 因为-rw-------. 1 普通用户没有访问权限 1表示有一个硬链接

文件类型与权限 链接数 文件属主 文件属组 文件大小 最近修改时间 文件名字

-rw-------. 1 root root 2761 1月 8 08:49 anaconda-ks.cfg

如果查看的是文件:链接数指的是硬链接个数。

如果查看的是文件夹:链接数指的是子文件夹个数。

exit回退到root的主目录下 ll 看到 公共目录 有两个子文件夹 ls 公共/ 看到什么都没有 ls -al 公共/ 可以看到有两个目录。

chmod 改变权限

把属主权限、属组权限、其他用户权限 分为三组 u g o 用ugo去改权限

第一种方式变更权限

chmod [{ugoa}{+-=}{rwx}] 文件或目录 a代表所有组

在root下cd /home/didi 然后 ll 然后chmod u+x anaconda-ks.cfg 再ll发现u已经有x了

chmod g+w anaconda-ks.cfg 再ll发现g已经有w了

添加可执行权限后文件名字变成了绿色

chmod a=rw anaconda-ks.cfg 所有的权限都指定为rw

第二种方式变更权限

chmod [mode=421] [文件或目录]

u:所有者 g:所有组 0:其他人 a:所有人(u、g、o的总和)
r=4 w=2 x=1
rwx=4+2+1=7 其实就是二进制全1

chmod 777 anaconda-ks.cfg 777就是全1,三个组每个权限都给。

实际运用中经常 chmod 644 anaconda-ks.cfg 就是二进制 110 100 100

chmod -R 777 xiyou/ 修改整个文件夹里所有文件的所有者、所有组、其他用户都具有可读可写可执行权限。

改文件属主

退回root 然后ll看文件属性

chown didi anaconda-ks.cfg 再ll,发现属主变成了didi。

chmod 700 anaconda-ks.cfg cat anaconda-ks.cfg su didi

改所属组

exit 切回root chgrp haircut anaconda-ks.cfg 再ll看看

添加大数据组和测试组 groupadd bigdata groupadd testing

cat /etc/group

useradd -g bigdata xiaoming 然后id xiaoming 看看

useradd -g bigdata xiaoliang 然后id xiaoliang 看看

useradd -g testing xiaohong 然后id xiaohong 看看

useradd -g testing xiaolan 然后id xiaolan 看看

cd /home/ 然后ls

su xiaoming cd ~ ls pwd

vim important_code i敲一个hello world 然后:wq 然后ll看看权限 exit 回到root 再 su xiaoliang 这样就不用输密码 cd ~ 然后cd ../xiaoming/ 发现权限不够 exit cd /home/ ll chmod g+x xiaoming/ 授予属组可执行权限,这样小亮就可以进入小明。 su xiaoliang 然后 cd xiaoming/ 然后 ll 发现权限还是不够,只能进没法读。 exit 回到 root 然后chmod g+r xiaoming/ 再 su xiaoliang 然后 cd xiaoming 就可以 llcat important_code 也能看见内容 但是vim important_code 无法更改 exit 然后 su xiaoming 再 cd ~ 再 ll 看看 给小明的属组加一个写权限 chmod g+w import_code 然后 exit 再进入小亮 su xiaoliang 直接 cd xiaoming/ 然后 vim important_code 改成hello world !然后:wq 现在同组内都可以修改,不同组呢(测试组的小红)? exit 切到小红 su xiaohong ll看到其他组没有任何权限 exit 给小明改一下权限: chmod 755 xiaoming 再 su xiaohong 就可以cd xiaoming/ 然后ll cat important_code 再vim important_code 只能读不能改。

exit 把小蓝从测试组换到大数据组:usermod -g bigdata xiaolan id xiaolan看看

su xiaolan 看看小蓝能不能改文件 cd xiaoming 再ls看看 vim important_code 可以直接修改内容 随便加个abc 再cat important_code

find查找文件或者目录

回到root主目录下ls

find -name info 可以看到有两个info touch 公共/info 公共底下创建一个info 再 find -name info

也可以不省略路径 find /root -name info

还可以限定查公共这条路径 find /root/公共 -name info

*是通配符,可以查后缀一样的文件。 find /root -name "*.cfg" 可以找出root下所有带cfg后缀的文件。

还可以找属主是tony的文件 find /home -user tony

ls -h 可以更人性化显示文件大小

找root下面大小超过10M的文件 find /root -size +10M

locate 快速定位文件路径

locate是在数据库里查文件路径,所以很快。

查找之前先更新数据库 updatedb

locate tmp 能找出所有带tmp的文件夹、文件

定位命令的路径 which ls which locate

查找locate在哪 whereis locate

grep过滤查找及"|"管道符

grep 选项 查找内容 源文件

选项 功能

-n 显示匹配行及行号

grep -n boot anaconda-ks.cfg 可以找出boot在文件里的哪一行

ls | grep .cfg 通过|管道 再用grep筛选 .cfg

cat info 查看内容 wc info 可以统计info的行数、词数、字节数

grep -n boot anaconda-ks.cfg | wc 对筛选文件里含boot的结果进行一个统计 可以统计这个结果的行数、词数、字节数

gzip/gunzip 压缩

语法:

gzip 文件 (把文件压缩成*.gz文件)

gunzip 文件.gz (解压缩文件)

经验技巧
(1)只能压缩文件不能压缩目录
(2)不保留原来的文件
(3)同时多个文件会产生多个压缩包

gzip 捡个校花做老婆.txtls -lh看看文件大小

解压 gunzip 捡个校花做老婆.txt.gzls -lh看看文件大小

zip/unzip 压缩

基本语法

zip [选项] XXX.zip 将要压缩的内容 (压缩文件和目录的命令)

unzip [选项] XXX.zip (解压缩文件)

选项说明

zip选项 功能

-r 压缩目录

unzip选项 功能

-d<目录> 指定解压后文件的存放目录

zip 压缩不影响源文件、源目录

压缩root目录,压缩后命名为myroot.zip zip -r myroot.zip /root 再ls看看

把myroot.zip解压到 tmp 下面 unzip -d /tmp myroot.zip 然后cd /tmp 再 ls 看到了root

cd root 再ls发现和root下主目录内容完全一样 cd ~

tar打包

基本语法 tar [选项] XXX.tar.gz 将要打包进去的内容 (打包目录,压缩后的文件格式 tar.gz)

选项 功能

-c 产生.tar打包文件

-v 显示详细信息

-f 指定压缩后的文件名

-z 打包同时压缩

-x 解包.tar文件

-C 解压到指定目录

cd ~ ls 看看要打包哪几个

tar -zcvf temp.tar.gz anaconda-ks.cfg 捡个校花做老婆.txt info 公共/ 再ls看见有temp.tar.gz 然后ls -lh看大小

解包 tar -zxvf temp.tar.gz -C /tmp 再 cd /tmp/ ls发现有我们打包的文件

用tree查目录下所有的结构

yum install tree 安装tree工具

tree ./

du查看文件和目录占用的磁盘空间

du 目录/文件

du可以把当前目录所有东西列出来,并且统计大小。

选项 功能

-h 以人们较易阅读的 GBytes,MBytes,KBytes等格式自行显示

-a 不仅查看子目录大小,还要包括文件

-c 显示所有的文件和子目录大小后,显示总和

-s 只显示总和

--max-depth=n 指定统计子目录的深度为第n层

du -ah du -ach 比前面多了个总用量,没什么区别

du -sh 只显示大小不显示别的

du --max-depth=1 -ah 只显示下边一级的子目录和子文件

df查看磁盘空间使用情况

df 选项 (功能描述:列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况)

选项 功能

-h 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示

直接 df -h 查看磁盘使用情况

/boot 是第一个分区的挂载点 /dev/sda1 说明第一个分区对应的文件目录下的名称是sda1

sda3是划分的第三个45G的分区

tmpfs表示的是临时文件系统(tmpfs是基于内存的文件系统) 内存和swap使用的都是tmpfs

挂载点shm:所有系统进程共享的(shared memory 共享内存管理)

free -h 查看内存的使用情况

lsblk 查看设备挂载情况

选项 功能

-f 查看详细的设备挂载情况,显示文件系统信息

lsblk

光驱的type是rom 对应的名字是sr0

所有的设备都在dev下 ls /dev/ | grep sr0 (到设备下面找sr0)

ll /dev/ | grep sr0 显示更详细的信息 b开头的是块存储设备 cdrom是光盘光驱,是一个软链接。l开头是链接。

sda1(SATA或者SCSI第一块硬盘的第一个分区 sdb就是第二块,依此类推) hda1(IDE第一块硬盘的第一个分区)

lsblk -f 多一个文件系统类型(xfs swap)

mount/umount 挂载/卸载

mount [-t vfstype] [-o options] device dir (功能描述:挂载设备)

umount 设备文件名或挂载点 (功能描述:卸载设备)

-t vfstype :指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:

光盘或光盘镜像:iso9660

DOS fat16 文件系统:msdos

Windows 9x fat32 文件系统:vfat

Windows NT ntfs 文件系统:ntfs

Mount Windows 文件网络共享:smbfs

UNIX(LINUX) 文件网络共享:nfs

-o options主要用来描述设备或档案的挂接方式。常用的参数有:

loop:用来把一个文件当成硬盘分区挂接上系统

ro:采用只读方式挂接设备

rw:采用读写方式挂接设备

iocharset:指定访问文件系统所用字符集

device 要挂接(mount)的设备

dir 设备在系统上的挂接点(mount point)


挂载前置操作

右键centos 7 64位 进入设置 双击CD 勾选已连接 确定之后桌面多了个光盘 (这个过程是linux自动挂载

现在lsblk就可以看见sr0的挂载点 ls /run/media/root/CentOS\ 7\ x86_64/ 可以看见一堆文件(和直接双击桌面光盘一样)

手动挂载?去桌面右键光盘,弹出。 lsblk发现挂载点不见了 ls /run/media/root/CentOS\ 7\ x86_64/ 发现没有那个文件或目录 sr0、cdrom是设备名

不想挂载到/run/media/下面?

把光盘内容全挂载到cdrom下

mnt下面新建cdrom mkdir /mnt/cdrom 然后 mount /dev/cdrom /mnt/cdrom/ 发现找不到媒体(因为刚刚弹出光盘,又不是连接状态了)

解决办法:

找虚拟机图形界面,点击右上角电源键,点击root,点注销,再右键centos 7 64位 进入设置 双击CD 勾选已连接(这样不会自动挂载) lsblk可以看见没挂载上

mount /dev/cdrom /mnt/cdrom/ 就可以把/dev 下面的cdrom挂载到 /mnt/cdrom/下

ls /mnt/cdrom/ 可以看到东西

想卸载的话 可以umount直接跟设备名称/dev/cdrom 或者 挂载点/mnt/cdrom/

umount /dev/cdrom 直接卸载 再lsblk就可以看到不挂载了

ls /mnt/cdrom/ 可以看见目录还在但是里面什么东西都没有

设置开机自动挂载

vim /etc/fstab 里面的第一列0表示不备份 1表示每天自动备份(没开启kdump 就是0) 第二列0表示文件系统检查的优先级 0不检查 1优先级最高最先检查 2等1检查完了才检查 fsck是检查和修复文件系统的命令 系统默认用fsck做文件系统的检查

粘贴下面这行,开机就能自动挂载。

/dev/cdrom /mnt/cdrom iso9660 defaults 0 0

我们没必要这么设置,直接不保存退出就好了。

fdisk 分区

基本语法

fdisk -l (功能描述:查看磁盘分区详情)

fdisk 硬盘设备名 (功能描述:对新增硬盘进行分区操作)

选项 功能

-l 显示所有硬盘的分区列表

该命令(fdisk)必须在 root 用户下才能使用

直接fdisk -l

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 616447 307200 83 Linux
/dev/sda2 616448 4812799 2098176 82 Linux swap / Solaris
/dev/sda3 4812800 83886079 39536640 83 Linux

boot下面带*说明 /dev/sda1 是引导分区

右键centos 7 64位 进入设置 添加一块硬盘 一直下一步就行了

回到xshell 输入reboot 等虚拟机启动后再双击重上会话(不reboot看不见新硬盘)

lsblk 可以看见sdb 还可以fdisk -l

fdisk /dev/sdb 对sdb分区 输入m获取帮助

n开始分区 p代表主分区,最多4个主分区,四个里面一个可以扩展若干个逻辑分区,扩展分区编号从5~16。

按下p,可以直接输入1或者回车(默认) 下面两个接着回车 再输p看当前分区信息 w保存退出

现在fdisk -l就能看见sdb的分区信息 lsblk也能看见sdb信息,但是lsblk -f 发现sdb没有UUID(系统无法识别)也没有文件系统。

接下来要指定文件系统,对sdb进行格式化

mkfs创建文件系统

mkfs -t xfs /dev/sdb1 再lsblk -f 可以看见文件类型

mount /dev/sdb1 /home/didi/ 把sdb1挂载到didi下面 再lsblk -f 就可以看见挂载点

df -h 查看硬盘占用空间

把东西放到didi下面看看sdb1已用的空间会不会增长 cp 捡个校花做老婆.txt /home/didi/ 看见sdb1使用空间增大

不想再使用sdb1这块硬盘? umount /dev/sdb1 也可以 umount /home/didi 卸载之后 df -h 发现没有sdb1了 lsblk -f看见还有硬盘信息但是已经被卸载掉了,但是已经访问不到didi这个目录了,didi又被划分到sda3。 再 ll /home/didi/ 看不到刚刚复制过去的校花了

执行系统服务的进程称为守护进程 centos7使用systemd这样一个启动进程 进行系统服务的启动

所有的服务放在 ls /usr/lib/systemd/system 里面的.target表示一组服务的集合

筛选后缀为d.service的 ls /usr/lib/systemd/system | grep d.service 出现很多后缀是d.service,这就是所谓的守护进程。

ps 查看当前系统进程状态

直接ps显示的进程有限,一个是xshell交互控制界面bash,一个是刚刚输入的ps,也是个进程。

ps aux | grep xxx (功能描述:查看系统中所有进程)

ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)

a 列出带有终端的所有用户的进程

x 列出当前用户的所有进程,包括没有终端的进程

u 面向用户友好的显示风格

-e 列出所有进程

-u 列出某个用户关联的所有进程

-f 显示完整格式的进程列表

ps aux 直接看系统进程状态

ps aux | less 分屏查看系统进程状态

ps -ef | less

<高优先级 N低优先级

ps aux 显示信息说明

USER:该进程是由哪个用户产生的

PID:进程的 ID 号

%CPU:该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源;

%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;

VSZ:该进程占用虚拟内存的大小,单位 KB;

RSS:该进程占用实际物理内存的大小,单位 KB;

TTY:该进程是在哪个终端中运行的。对于 CentOS 来说,tty1 是图形化终端,

tty2-tty6 是本地的字符界面终端。pts/0-255 代表虚拟终端。

STAT:进程状态。常见的状态有:R:运行状态、S:睡眠状态、T:暂停状态、

Z:僵尸状态、s:包含子进程、l:多线程、+:前台显示

START:该进程的启动时间

TIME:该进程占用 CPU 的运算时间,注意不是系统时间

COMMAND:产生此进程的命令名

ps -ef 显示信息说明

UID:用户 ID

PID:进程 ID

PPID:父进程 ID

C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,

执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高

STIME:进程启动的时间

TTY:完整的终端名称

TIME:CPU 时间

CMD:启动进程所用的命令和参数

如果想查看进程的 CPU 占用率和内存占用率,可以使用 aux;

如果想查看进程的父进程 ID 可以使用 ef;

ps -ef | grep sshd 查看sshd父子关系

查看sshd的状态 systemctl status sshd

xshell多开一个hadoop100窗口,再执行ps -ef | grep sshd 发现多出一条sshd进程

xshell新建一个窗口 hadoop100_didi 连接之后 再执行ps -ef | grep sshd 多出两个sshd

kill 13654 或者 kill 13646 都可以把didi干掉 xshell里面didi窗口灯变红

再执行ps -ef | grep sshd 看到didi两个sshd都没了

kill 13490 可以杀掉第二个窗口 执行ps -ef | grep sshd 看到sshd: root@pts/1被杀掉了 在会话管理器重新登录一个hadoop100,发现sshd: root@pts/1 又出现了

如果杀掉守护进程root 7088 1 0 1月14 ? 00:00:00 /usr/sbin/sshd -D ,到时候再想登用户登不上。 systemctl status sshd 看到状态是dead

再想登用户 就 systemctl start sshd

开3个会话,ps -ef | grep bash 看bash编号,杀掉第二个窗口的bash 我们 kill 8248 然后ps -ef | grep bash 发现没杀掉

kill -l 可以查看信号值

kill -9 8248 强制干掉进程 再ps -ef | grep bash 就能看见被干掉了

谨慎使用:

killall sshd 会干掉所有sshd,包括守护进程,再从xshell登不上,只能回vmvare 打开终端 systemctl start sshd 再回xshell连接就可以了

pstree 查看进程树

pstree

pstree | less 分页显示进程树

pstree -p | less 参数-p显示pid

pstree -u | less 参数 -u 查看用户相关信息

top 实时监控系统进程状态

top

-d 秒数 指定 top 命令每隔几秒更新。默认是 3 秒在 top 命令的交互模式当中可以执行的命令:

-i 使 top 不显示任何闲置或者僵死进程。

-p 通过指定监控进程 ID 来仅仅监控某个进程的状态。

shift + M切到按内存占用降序排列 shift + p切回按cpu占用降序排列 shift+n 按进程号大小排序

top -i 看动态的,找到其中不是深白色亮度的编号 top -p 编号 可以单独查看

一般情况下top -d 1 就行了 想要监控某个用户可以按u 输入用户名 比如输入didi 如果没有的话先去xshell打开didi窗口 按k 输入编号 再按9 可以把didi干掉

sshd:远程登录的进程 bash:控制台界面

netstat 显示网络状态和端口占用信息

netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)

netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)

netstat -anp | less

crontab 系统定时任务

systemctl status crond

crontab [选项]

-e 编辑 crontab 定时任务

-l 查询 crontab 任务

-r 删除当前用户所有的 crontab 任务

crontab -l 看到没有定时任务

crontab -e 编辑 写入 */1 * * * * echo "hello world" >> /root/hello 每隔一分钟,在hello里追加hello world。 :wq保存退出 整分的时候 cat hello 我们 tail -f hello 可以动态看变化 这个时候 crontab -l 能看到任务 ctrl+c 暂停 这个时候 crontab -r 可以把当前用户的定时任务清理掉

RPM包管理工具

RPM 查询命令(rpm -qa)

rpm -qa (功能描述:查询所安装的所有 rpm 软件包)

rpm -qa | grep firefox 只能查firefox安装包文件

rpm -qi firefox 查firefox的详细信息

RPM 卸载命令(rpm -e)

(1)rpm -e RPM软件包

(2) rpm -e --nodeps 软件包

-e 卸载软件包

--nodeps 卸载软件时,不检查依赖。这样的话,那些使用该软件包的软件在此之后可能就不能正常工作了。

rpm -e firefox 卸载浏览器 rpm -qi firefox 看看信息

RPM 安装命令(rpm -ivh)

rpm -ivh RPM 包全名

先把光盘连接上:右键centos7,设置,cd,连接。

lsblk 看挂载点

cd /run/media/root/CentOS\ 7\ x86_64/ 然后 ls 然后 cd Packages/ 再ls

ls | grep firefox

rpm -ivh firefox-60.2.2-1.el7.centos.x86_64.rpm 安装火狐浏览器

rpm -qi firefox 可以查到安装信息

yum list 查看安装的软件

yum list | grep firefox

yum remove firefox 然后y确认 卸载老版本firefox 再 yum list | grep firefox 看一下也可以 rpm -q firefox

yum -y install firefox

现在yum list | grep firefox 后面显示@updates 表示这个是被安装的版本

yum速度太慢,去改配置文件弄成国内的。(其实现在很快,会自动根据地理位置配置,非想改的话去文档里去看)

less /etc/yum.repos.d/CentOS-Base.repo

克隆虚拟机

先把虚拟机关机,右键CentOS7,管理,克隆,选择当前状态,创建完整克隆。名称:hadoop_copy1 位置:D:\vms\hadoop_copy1 克隆后开启这台虚拟机 root 123456

要互相通信,ip和主机名不能相同。 打开终端 ifconfig

修改配置文件vim /etc/sysconfig/network-scripts/ifcfg-ens33

把IP地址改成:

IP地址

IPADDR=192.168.253.101 然后:wq

systemctl stop network 然后 systemctl restart NetworkManager 再ifconfig看到ip已经改变

ping 192.168.253.1 可以通 ping www.baidu.com也能通

cat /etc/hostname 看一下主机名

hostnamectl set-hostname hadoop101 修改主机名 再cat /etc/hostname 看一下主机名

exit 再打开 前面也变成hadoop101了

现在去xshell里构建远程连接 新建会话 hadoop101 账号root 密码123456

为什么可以直接根据名字连上呢?(因为之前在windows里面的hosts文件已经配置过ip和对应的名字)

打开会话hadoop101 然后ls 再touch hello2 再ls 回到虚拟机,位置-计算机-root下能看见hello2。

shell篇

ls -l /bin/ | grep sh

ls -l /bin/ | grep bash

echo $SHELL 找当前的环境变量

less /bin/unix-lpr.sh 看看脚本怎么写

去root ~ 下 mkdir scripts 然后 cd scripts/touch hello.sh 接下来编辑 vim hello.sh

在里面输入:

#!/bin/bash

echo "hello,world"

然后:wq保存退出

bash hello.sh 可以执行脚本 (bash 或 sh+脚本的相对路径或绝对路径)

回到~ 相对路径: bash scripts/hello.sh

绝对路径: bash /root/scripts/hello.sh

sh scripts/hello.sh 也一样

采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)

想不用bash直接执行文件? /root/scripts/hello.sh 发现权限不够 ll scripts/ 看到没有执行权限

chmod +x scripts/hello.sh 给所有用户都加上执行权限

接下来可以直接/root/scripts/hello.sh 看到内容 scripts/hello.sh 也能看到

先 cd scripts/ 再 ./hello.sh 也可以执行

第三种:在脚本的路径前加上“.”或者 source

source hello.

. hello.sh

ps -f 看到有两项 现在直接 bash 再 ps -f 看到多了个bash(子shell) 父亲是 -bash 现在执行 ./hello.sh 其实就是在子shell里执行 现在exit 还是在root状态 因为之前在子shell

source 是直接在当前shell里执行,而前两种是在子shell里执行。

看环境变量

echo $HOME 看家目录的环境变量

env 看所有全局环境变量 env | lessprintenv | less

printenv USER

在scripts下可以 ls $HOME

为什么是全局? 打开一个 bash 然后 ps -f 然后echo $HOME 接着exit

set 可以看到当前目录的所有变量 set | less

a=2 赋值的时候等号左右两边不能加空格

echo $a

可以直接echo 不存在的 再赋值

echo $my_var

my_var=hello

echo $my_var

my_var=Hello

echo $my_var

如果本身想表达里边有空格,要用引号(单引号双引号都可以)引起来。 my_var="hell0, world" echo $my_var

my_var='Hello, world' echo $my_var env | grep my_var 看不到(env是系统定义的局部变量) 再 set | grep my_var 可以看到

bash

ps -f

echo $my_var 发现没有结果

exit 再echo $my_var 发现有结果 子bash里没有结果,说明my_var 是局部变量

export my_var 可以把my_var声明成全局变量 echo $my_var 然后 ps -f 再 bash 再 ps -f 再 echo $my_var 发现可以看到

现在在子bash里可以更改 my_var="hello, Linux" 再 echo $my_var 看到是改之后的内容 exit 然后ps -f 再 echo $my_var 发现还是原来的内容。

子bash里更改内容,不会影响到父shell的内容,再export也没有用。

去脚本里测试

vim hello.sh 加上 echo "hello, world"echo $my_var 再 :wq 保存退出

用不同的方式进行调用,souce是在当前的bash环境执行。 source hello.sh 可以看到内容

在scripts下 ./hello.sh 可以看到内容 因为当前my_var是全局变量

再增加一个局部变量 echo $new_varnew_var="hello, linux"echo $new_var 接下来vim hello.sh 新增 echo $new_var 再 ./hello.sh 可以看见前两行 第三行是局部变量不显示 想要显示第三行内容? . hello.sh 因为就是在当前bash环境执行,这样可以显示。

就想 ./hello.sh 执行 可以 export new_var 然后 ./hello.sh 就可以显示第三行

a=1+5 然后echo $a 显示的内容是 1+5

想要加法输出?

a=$((1+5)) 再 echo $a

也可以 a=$[5+9] 再 echo $a

readonly b=5 定义只读变量 再令 b=10 发现不能更改 echo $b

set | less 可以看到a=14 b=5 这些信息

unset a 撤销a这个变量 再 set | less 看看有没有a

在~下ls 再cd scripts/ 再hello.sh 发现未找到命令

cp hello.sh /bin/ 再执行hello.sh 就可以看到内容 (bin目录下是系统生成的命令,这样不靠谱,还是删掉hello.sh吧)

rm -f /bin/hello.sh

vim hello.sh 删掉2、3两行 加上 echo "hello, $1" 然后:wq 保存退出 在scripts下 ./hello.sh 看不见第二行hello后面的东西 ./hello.sh xiaoming 可以看到hello后面跟着小明

$n

(功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以

上的参数,十以上的参数需要用大括号包含,如${10})

vim parameter.sh

#!/bin/bash

echo '=$n==' 单引号不会把$n认为是变量,可以原封不动输出$n

echo script name: $0

echo 1st parameter: $1

echo 2nd parameter: $2 然后:wq

ll 再给执行权限 chmod +x parameter.sh

然后执行 ./paremeter.sh abc def

$#

(功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及

加强脚本的健壮性)。

vim parameter.sh

echo '=$n'
echo script name: $0
echo 1st parameter: $1
echo 2nd parameter: $2
echo '=$#'
echo parameter numbers: $#

然后 :wq

然后 **./parameter.sh ** 出现parameter numbers: 0

如果后面跟参数 ./parameter.sh abc def 出现parameter numbers: 2

$*

(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

vim parameter.sh

echo '=$n'
echo script name: $0
echo 1st parameter: $1
echo 2nd parameter: $2
echo '=$#'
echo parameter numbers: $#
echo '=$*'
echo $
*
echo '=$@'
echo $@

然后 ./parameter.sh abc def

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一

个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明

上一个命令执行不正确了。)

[root@hadoop100 ~]# echo $?
0
[root@hadoop100 ~]# parameter.sh
bash: parameter.sh: 未找到命令...
[root@hadoop100 ~]# echo $?
127

expr 1 + 2 可以计算 每个字符中间要有空格

expr 5 - 2

expr 5 \ 2* 不能直接* 要用\ 转译 就是 5乘2

上面的乘法太麻烦,可以简化运算:(最推荐的)

echo $[5*2] 或者 echo $((5*2))

常用:

a=$[6+8]

echo $a

也可以像这样 把括号里面得出的值给a

a=$(expr 5 \ 2 )*

echo $a

还可以

a=`expr 5 * 2`

echo $a

计算 (2+3)*4

s=$[(2+3)*4]

echo $s

用脚本计算

cd scripts

vim add.sh

#!/bin/bash

sum=$[$1 + $2]

echo sum=$sum

然后:wq

chmod +x add.sh

./add.sh 25 89 就能看到相加的结果

条件判断

基本语法

(1)test condition

(2)[ condition ](注意 condition 前后要有空格)

注意:条件非空即为 true,[ atguigu ]返回 true,[ ] 返回 false。

测试值是否相等(相等返回0)

a=hello

echo $a

test $a = hello

echo $? 值为0 说明 test $a = hello 通过了

为了进一步验证

test $a = Hello

echo $? 值为1 说明test $a = Hello不成立

a=Hello

[ $a = Hello ] 中括号旁边要有空格

echo $? 结果是0 表示正确

[ $a = hello ] =中间要有空格,不然会被认为是一体,再echo $? 结果就是0

echo $? 结果是1表示错误

[ skdjfhksd ]
echo $? 结果是0

[ ]
echo $? 结果是1

判断是不是不相等

[ $a != hello]

echo $?

[ 2 = 8 ] 只是把2空格和8空格当作字符串来比较了

echo $? 结果是1 表示不等

[ 2 = 2 ] 只是把2空格和2空格当作字符串来比较了

echo $? 结果是0 表示相等

>在Linux里是输出重定向 <在Linux里是输入重定向 不能用作条件判断

真要比较数值

[ 2 -lt 8 ] lt表示less than 小于

echo $? 结果为 0 表示2<8

[ 2 -gt 8 ] gt表示greater than 大于

echo $? 结果为1表示2不大于8

cd scripts 然后 touch test 再 ls 再 ll 看到test没有可执行权限

[ -r hello.sh ] 看看hello.sh有没有可读权限 然后 echo $? 看到结果是0 说明有可读权限

[ -w hello.sh ] 看看hello.sh有没有写入权限 然后 echo $? 看到结果是0 说明有写入权限

[ -x hello.sh ] 看看hello.sh有没有执行权限 然后 echo $? 看到结果是0 说明有执行权限

[ -r test ] 看看test有没有可读权限 然后 echo $? 看到结果是0 说明有可读权限

[ -w test ] 看看test有没有可写权限 然后 echo $? 看到结果是0 说明有可写权限

[ -x test ] 看看test有没有可执行权限 然后echo $?看到结果是1 说明没有可执行权限

[ -e /home/didi/info ] 可以看这个目录下是否有info

echo $? 看到是1 说明下面没有info文件

ls /home/didi/ 没看到info 说明真的没有info

[ -e /home/didi/anaconda-ks.cfg ]

echo $? 看到结果是0 说明有这个文件

在 scripts 下 [ -f add.sh ] 然后 echo $? 判断是不是一个文件(1不是 0是)

在 scripts 下 [ -d add.sh ] 然后 echo $? 判断是不是一个目录(1不是 0是)

[ -d /home/didi ] echo $? 结果是0 说明有didi这个目录

a=15

[ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20" 结果显示 15 < 20

a=27

[ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20" 结果显示 27 >= 20

cd /home/didi/; ls -l 分号可以分别执行两条命令 ls -l 看到的是didi下的内容

流程控制

if判断

a=25

if [ $a -gt 18 ]; then echo OK; fi 会输出OK,说明25>18。

a=15

if [ $a -gt 18 ]; then echo OK; fi 什么都没输出

cd scripts/

vim if_test.sh

#!/bin/bash

if [ ''$1"x = "didi"x ] 加个x可以保证字符串为空的时候不出错 大括号和等号旁边都要留空格

then

echo "welcome, didi" echo和后面的句子也要留空格

fi

chmod +x if_test.sh 给个执行权限

现在到外面测一下

./if_test.sh 不会出错

./if_test.sh xiaoming 什么也不显示

./if_test.sh didi 就有结果了

判断年龄

a=15

if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi 什么都没有输出

a=30

if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi 输出OK

两个中括号可以合并 改写成

if [ $a -gt 18 -a $a -lt 35 ]; then echo OK; fi -a表示and -o表示or

vim if_test.sh

# 输入第二个参数,表示年龄,判断属于哪个年龄段

if [ $2 -lt 18 ]

then

echo "未成年人"

else

echo "成年人"

fi

然后 :wq

./if_test.sh didi 15

会输出:

welcome, didi
未成年人

多分支: 修改刚刚的

if [ $2 -lt 18 ]

then

echo "未成年人"

elif [ $2 -lt 35 ]

then

echo "青年人"

elif [ $2 -lt 60 ]

then

echo "中年人"

else

echo "老年人"

fi

然后:wq 分别测试以下句子

./if_test.sh didi 15

./if_test.sh didi 22

./if_test.sh didi 39

./if_test.sh didi 66

分叉树

vim case_test.sh

#!/bin/bash

case $1 in
1)
echo "one"
;;
2)
echo "two"
;;

3)

echo "three"
;;
*)
echo "number else"
;;
esac

然后 :wq

chmod +x case_test.sh

分别测试以下句子:

./case_test.sh 2

./case_test.sh 1

./case_test.sh 6

for循环

累加算法

vim sum_to.sh

#!/bin/bash

for (( i=1; i <= $1; i++ )) 双小括号中可以用<= 之类的数学符号

do

sum=$[ $sum + $i ]

done

echo $sum

然后 chmod +x sum_to.sh

./sum_to.sh 100 结果是 5050

a=3

**if (($a > 2)); then echo OK; else echo notOK; fi ** 双小括号中可以用<= 之类的数学符号

遍历输出:

for os in linux windows macos; do echo $os; done


vim parameter_for_test.sh

#!/bin/bash

echo '=$*==' 可以y5y 然后p 粘贴到下面改
for para in $*
do
echo $para
done

echo '=$@=='
for para in $@
do
echo $para
done

然后:wq

[root@hadoop100 scripts]# ./parameter_for_test.sh a b c d e
=$*==
a
b
c
d
e
=$@==
a
b
c
d
e

输出结果好像没有任何区别

!/bin/bash

echo '=$*=='
for para in "$*" 用""括起来就有区别了
do
echo $para
done

echo '=$@=='
for para in "$@"
do
echo $para
done

输出结果:

[root@hadoop100 scripts]# ./parameter_for_test.sh a b c d e
=$*== $*把所有数据当作一个整体,输出一行。
a b c d e
=$@== $@分别输出
a
b
c
d
e


vim sum_to.sh

用while做一个实现

a=1

while [ $a -le $1 ]

do

sum2=$[ $sum2 + $a ]

a=$[ $a + 1]

done

echo $sum2

写完之后 :wq 然后 ./sum_to.sh 100 测试一下

另一种更简单的写法:(可以使用#注释掉代码段)

a=1

while [ $a -le $1 ]

do

let sum2+=a

let a++

done

echo $sum2


vim read_test.sh

#!/bin/bash

read -t 10 -p "请输入您的芳名:" name
echo "welcome, $name"

然后 :wq 再 chmod +x read_test.sh

./read_test.sh 之后再随便输入一个名字就可以了

如果十秒内不输入东西,就会自动退出。


date 显示日期

date +%s 显示时间戳

vim cmd_test.sh

!/bin/bash

filename="$1"log$(date +%s)
echo $filename

然后:wq

chmod +x cmd_test.sh

./cmd_test.sh didi


basename /root/scripts/parameter.sh 可以截取最后一个反斜杠之后的内容parameter.sh

basename /root/screi/dkwjedl 同样可以截取dkwjedl

basename /root/scripts/parameter.sh .sh 在最后面加上参数(.sh) 就是后缀 可以直接不显示后缀 只显示 parameter.sh


vim parameter.sh

把script name那行改为echo script name:$(basename $0 .sh)

然后:wq保存退出

现在 ./parameter.sh a b

只显示脚本名,也不带后缀了。

用绝对路径也只显示脚本名了: /root/scripts/parameter.sh a b


dirname /root/scripts/parameter.sh 输出/root/scripts/

dirname ../scripts/parameter.sh 输出../scripts

dirname /edws/werfw/sss 只会截取最后一个斜杠之前的东西


vim parameter.sh

在script name下面插入:

echo script path: $(cd $(dirname $0); pwd) cd $(direname $0)是先进入$0所在的路径 pwd获取绝对路径

然后 :wq 再 ./parameter.sh a b 可以看到 script path: /root/scripts 这条路径

cd /home/didi/ 然后 ../../root/scripts/parameter.sh a b 也能看到绝对路径

posted @ 2025-04-25 22:55  JDamaze  阅读(63)  评论(0)    收藏  举报