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的是目录)和权限 所有者 用户组 创建的时间 文件名
ll 和 ls -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 就可以 ll 了 cat 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 捡个校花做老婆.txt 再ls -lh看看文件大小
解压 gunzip 捡个校花做老婆.txt.gz 再ls -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 | less 和 printenv | 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_var 令 new_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 也能看到绝对路径
浙公网安备 33010602011771号