Linux高级命令(扩展)二

一、Linux下用户管理

1、用户概念以及基本作用

用户:指的是==Linux操作系统中==用于管理系统或者服务的==人==

一问:管理系统到底在管理什么

答:Linux下一切皆文件,所以用户管理的是相应的==文件==

二问:如何管理文件呢?

答:

  1. 文件==基本管理==,比如文件的创建、删除、复制、查找、打包压缩等;文件的权限增加、减少等;

  2. 文件==高级管理==,比如程序文件的安装、卸载、配置等。终极目的是对外提供稳定的服务。

2、用户的类别

① root超级管理员,==在Linux系统中拥有至高无上的权力==。

② 系统用户,CentOS6=> 1 ~ 499,CentOS7=> 1 ~ 999,系统账号==默认不允许登录==

# useradd -s /sbin/nologin 系统用户

③ 普通用户,大部分是由root管理员创建的,UID的取值范围:CentOS6=> 500 ~ 60000,CentOS7=> 1000 ~ 60000,==对系统进行有限的管理维护操作==

总结

① 用户指的是操作系统上==管理系统或服务==的==人==,是人,就有相关的==属性信息==

② 用户的属性信息包括但不限于,如:==家目录、唯一身份标识(UID)、所属组(GID)==等

③ 今天我们讨论的用户指的是==普通用户==,即由管理员创建的用户

3、用户管理

与用户管理相关的几个单词 => user(用户)、add(添加)、mod(修改)、del(删除)

① 用户添加 useradd

② 用户修改 usermod

③ 用户删除 userdel

☆ useradd用户添加

基本语法:

# useradd [选项 选项的值] 新用户名称
-u    指定用户uid,唯一标识,必须唯一
-g    指定用户的默认组(主组)
-G    指定用户附加组(一个用户可以加入多个组,但是默认组只有一个)
-d    指定用户家目录(每个用户都有一个自己的家,并且默认在/home/xxx)
-s    指定用户默认shell,常见/bin/bash或/sbin/nologin扩展:
-r  指定用户为系统用户,如创建一个系统账号mysql

案例:在Linux系统中创建一个账号zhangsan

# useradd zhangsan

问题:一个用户创建成功后,如何判断是否添加到系统?

答:第一种方案我们可以通过tail命令查看/etc/passwd文件

第二种方案我们可以使用id命令查看zhangsan信息

案例:在Linux系统中创建一个账号lisi,指定用户的家目录为/rhome/lisi

# mkdir /rhome
# useradd -d /rhome/lisi lisi

当我们为用户自定义家目录时,其上级目录必须是真实存在的,如/rhome

案例:在Linux系统中创建一个mysql账号,要求真实存在的,但是其不允许登录操作系统

# useradd -s /sbin/nologin mysql

案例:在Linux系统中创建一个mysql系统账号,要求真实存在,但是不允许登录操作系统

# userdel -r mysql
# useradd -r -s /sbin/nologin mysql

☆ 与用户相关的文件

Linux中一切皆文件,所以保存用户的信息的也是一个文件 => /etc/passwd

# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
​
第1列:用户名称
第2列:用户密码,使用一个x占位符,真实密码存储在/etc/shadow文件中
第3列:用户的编号UID,0,1-999,1000 ~ 60000
第4列:用户的主组编号GID
第5列:用户的备注信息(扩展,可以使用-c进行指定) useradd -c "mysql" mysql
第6列:用户的家目录,/root,超级管理员的家/home,普通账号的家
第7列:用户的Shell文件,常见/bin/bash或/sbin/nologin=>/bin/false

☆ usermod用户修改

基本语法:

# usermod [选项 选项的值] 用户名称
-u  指定用户uid,唯一标识,必须唯一   
-g  指定用户的默认组(主组)
-G  指定用户附加组(一个用户可以加入多个组,但是默认组只有一个)
-d  指定用户家目录(每个用户都有一个自己的家,并且默认在/home/xxx)
-s  指定用户默认shell

案例:修改zhangsan账号的主组为itheima组(只能指定一个)

① 可以获取itheima组的编号信息GID

② 使用usermod -g GID编号修改某个用户的主组信息

其实在usermod修改用户的主组中,usermod -g 可以使用GID编号也可以使用组名称

# cat /etc/group |grep itheima
# usermod -g 1000 zhangsan

# usermod -g itheima zhangsan

案例:修改lisi账号的附加组,将其添加到itheima中

# usermod -G 1000 lisi

# usermod -G itheima lisi

案例:创建一个itcast组,在创建一个wangwu的账号,修改wangwu的附加组为itcast与itheima

# groupadd itcast
# useradd wangwu
# usermod -G itcast,itheima wangwu

问题:如果一个用户同时拥有多个附属组,怎么查看呢?

答:使用id命令即可

案例:修改用户zhangsan的家目录为/rhome/zhangsan(默认/home/zhangsan)

# mkdir /rhome/zhangsan
# usermod -d /rhome/zhangsan zhangsan
# su - zhangsan
-bash-4.2$
出现以上问题的主要原因在于:我们迁移用户的家目录时,没有迁移家目录中的配置文件"家具"
​
解决方案:
① 家目录已经迁移,我们把/etc/skel中的文件,copy到新家中
# cp -a /etc/skel/. /rhome/zhangsan/
选项说明:
-a :all所有,复制时,保留文件的原有属性
② 家目录还没有迁移,准备迁移时,使用usermod -md /rhome/zhangsan 用户名
-m :move,迁移家目录时,把"家具"一起迁移到新的家目录
# usermod -md /rhome/zhangsan zhangsan

注:要求/rhome/zhangsan必须是真实存在的!

案例:当我们创建了某个账号,但是不希望这个账号登录操作系统

# usermod -s /sbin/nologin 用户名称

☆ userdel用户的删除

# userdel [选项] 用户名称
选项说明:
-r :删除用户的同时,删除用户的家目录
-f :强制删除用户(即使用户处于登录状态)

案例:删除zhangsan这个账号

# userdel zhangsan

案例:删除zhangsan这个账号,同时删除这个账号的家

# userdel -r zhangsan

案例:删除某个正在使用的账号(强制删除)

# userdel -f zhangsan

4、用户密码

☆ passwd修改用户密码

# passwd [用户名称]
​
说明:
1.管理员root可以给任何用户修改密码
2.普通用户可以自己给自己修改密码,但是密码复杂度要符合规范(大小写、特殊字符、长度)

案例:使用root账号给itheima用户修改密码,新密码为123456

# su - root
# passwd itheima
Changing password for user itheima.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

案例:切换到itheima这个账号,自己给自己修改密码(密码规范)

# su - itheima
# passwd
Changing password for user itheima.
Changing password for itheima.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

☆ --stdin修改用户密码

--stdin :标准输入

# echo 123 |passwd --stdin itheima
# history -c                        =>                   清除history历史记录

注意:以上方式操作非常简单,但是以上命令会留在history历史命令中!

5、chage更改用户的账号信息

背景:很多公司运维工程师刚入职,都会默认得到一个服务器的管理账号,密码默认,如123456,我们有没有办法让运维工程师在第一次登陆操作系统后,强制要求其更新密码。

# chage --help
-l:列出用户的详细密码状态;
-d 日期:修改 /etc/shadow 文件中指定用户密码信息的第3个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD;
-m 天数:修改密码最短保留的天数,也就是 /etc/shadow 文件中的第4个字段;
注:几天后才能修改一次密码
-M 天数:修改密码的有效期,也就是 /etc/shadow 文件中的第5个字段;
注:每隔多少天更新一次密码
-W 天数:修改密码到期前的警告天数,也就是 /etc/shadow 文件中的第6个字段;
-i 天数:修改密码过期后的宽限天数,也就是 /etc/shadow 文件中的第7个字段;
注:过期后还可以使用的天数,达到这个天数后,账号失效
​
-E 日期:修改账号失效日期,格式为 YYYY-MM-DD,也就是 /etc/shadow 文件中的第8个字段;

==案例:新创建一个账号lamp,设置初始化密码为123456。要求用户第一次登陆后必须强制修改用户的密码。==

解决思路:把密码的最后修改时间重置为0(回到1970年1月1日)

# useradd lamp
# echo 123456 |passwd --stdin lamp
​
# chage -d 0 lamp

运行效果:

案例:设置lamp账号的过期时间为2010-04-10

# chage -E "2020-04-10" lamp

案例:设置lamp账号的10天后过期(延伸)

# chage -E $(date +%F -d '+10 days') lamp
%F:YYYY-mm-dd,格式2020-04-01
-d:多少天以后的日期

案例:设置mysql用户60天后密码过期,至少7天后才能修改密码,密码过期前7天开始收到告警信息

# useradd mysql
# echo 123456 |passwd --stdin mysql
​
# chage -M 60 -m 7 -W 7 mysql

☆ ==练习题==:

创建3个普通用户stu1~stu3,要求如下:

  1. stu1默认创建,密码为123

  2. stu2的家目录为/rhome/redhat/stu2,密码为123

  3. stu3用户不能登录操作系统,密码为123

6、用户组管理

☆ 用户和组的关系

                                                           总部 头头

核心:==组的目的是为了方便管理用户==

  • 用户是操作系统上管理维护系统或服务的人

  • 组是用户的一个==属性信息==

  • 任何一个用户==默认都会有==一个==主组==(默认组)

  • 一个用户除了主组也==可以有多个其他组==(附加组)

一问:用户的主组和附加组到底有啥关系呢?

答:用户的主组和附加组==半毛钱关系都木有==

二问:那要这个主组或者附加组有啥用呢?

答:肯定是有用的,组的目的是方便管理用户,用户的目的是管理==操作文件==,文件就有==权限==这个属性。

  1. 用户要操作一些文件,文件是由用户创建,不同用户创建的文件的==属性信息==也就不一样

  2. 文件的属性都有啥呢?比如,文件的==创建者==,文件==属于哪个组==,文件大小,文件时间等

  3. 其中,不同用户所创建的==文件的属组==就是==该用户的主组==(默认组)

  4. A用户附加组也有可能是其他用户的主组,道理同上(权限章节再细细体会组的作用)

☆ 用户组管理

group组,添加add,修改mod,删除del

groupadd 添加用户组

groupmod 修改用户组

groupdel 删除用户组

☆ 添加用户组

# groupadd [选项 选项的值] 用户组名称
选项说明:
-g :创建用户组时指定用户组编号GID,0代表超级管理员root组,1-999代表系统用户组,
1000以后代表普通用户组

案例:在系统中创建一个admin组

# groupadd admin

案例:在系统中创建一个itcast组,并指定用户组的编号为1200

# groupadd -g 1200 itcast

问题:用户组创建完成后,如何判断是否创建成功?

# tail -1 /etc/group

☆ 与用户组相关的文件

在Linux系统中,与用户组相关的文件 => /etc/group

# vim /etc/group
root:x:0:
第1列:代表用户组的组名称
第2列:代表用户组的组密码,使用一个x占位符(基本已经不使用了)
第3列:代表用户的组ID编号GID的值
第4列:代表用户组内的用户信息

☆ 修改用户组

# groupmod [选项 选项的值] 用户组名称
选项说明:
-g :gid缩写,代表修改用户所属组的ID编号
-n :name缩写,代表修改用户组的名称

案例:更改itcast用户的GID编号(从1200 => 1005)

# groupmod -g 1005 itcast

☆ 删除用户组

# groupdel 用户组的名称

注意:在Linux操作系统中,如果想删除某个用户组,必须要保证这个组不能是某个用户的主组。

案例:删除itcast用户组

# groupdel itcast

案例:删除admin用户组

# groupdel admin

7、附属组管理

基本语法:

# gpasswd [选项 选项的值] 用户组的名称
-a :添加用户到组,append追加
-d :从组中删除成员,delete移除
-A :指定管理员,Admin管理员
-M :指定组成员,可以批量添加用户到组中
​
问题解析:-a与-M到底有啥区别?
-a一次只能追加一个用户到附属组中(-a,append,追加的形式,原有用户不覆盖)
-M一次可以追加多个用户到附属组中(覆盖追加,先把原有用户删除,然后添加我们的用户)

案例:创建3个用户user01~user03,将user01添加到sysadmin组里(附属组)

# useradd user01
# useradd user02
# useradd user03
# groupadd sysadmin
​
① 方案1
# usermod -G sysadmin user01
② 方案2
# gpasswd -a user01 sysadmin

案例:把user02、user03添加到sysadmin组中

① 方案1
# gpasswd -a user02 sysadmin
# gpasswd -a user03 sysadmin
​
② 方案2
# gpasswd -M user02,user03 sysadmin

案例:从附属组中移除某个账号

# gpasswd -d 移除的用户名称 附属组名称
# gpasswd -d user03 sysadmin
Removing user user03 from group sysadmin

☆ ==练习题==:

1、创建一个admin组,组id为900

2、创建一个用户tom,并且admin组作为tom用户的附加组(要求在建立用户的时候就完成),密码为123

3、创建一个用户jack,要求在建立用户之后使用gpasswd把jack加入到admin组,密码为123

4、给admin组设定一个默认密码为123 (gpasswd命令)

# gpasswd admin组名称

移除gpasswd -r admin组名称,代表移除组密码

5、把tom用户设定为admin组的组管理员

gpasswd -A tom admin

☆ ==作业1==

  1. 创建一个公司itcast,3个部门财务(cw),人事(rs),市场(sc)

    说明:==实际是创建4个组==,分别为itcast、cw、rs、sc,没有包含的关系

  2. 每个部门创建2个用户,如 cw01 cw02,rs01,rs02,sc01,sc02;boss01管理公司所有部门;说明:boss01管理所有部门说明,boss01的附加组为财务、人事和市场部门

  3. 所有用户账号有效期3个月<90天>,第一次登录强制修改密码,每隔15天更新一次密码;默认密码为123456

☆ ==作业2==

  1. 添加3个用户,用户harry,natasha,sarsh,要求harry,natasha用户的附加组为admin组,sarsh用户的登录shell为非交互式shell。密码均为redhat

  2. 修改harry用户的家目录为/home/heima/redhat/harry

  3. 修改natasha,sarsh用户的主组为heima,并且可以登录系统

二、文件权限管理

1、什么是权限

权限:在计算机==系统中==,权限是指某个==计算机用户==具有==使用软件资源的权利==。

2、权限的目的

文件权限的设置目的:==是想让某个用户有权利操作文件==

3、权限的分类

  • 普通权限rwx

    用户正常情况去操作文件所具有的权限

  • 高级权限st

    用户对某个文件操作有特殊需求,而普通权限不能满足,需要给文件设置高级权限

  • 默认权限umask

    用户在系统中创建一个文件,该文件默认都会有一个权限,该权限是默认有的

注意:

权限是==设置在文件上==的,而不是用户

4、普通权限rwx(重点)

☆ read读权限

  • 针对==目录==

    一个目录拥有r权限,说明可以查看该==目录里的内容==(ls命令列出)

  • 针对==普通文件==

    一个普通文件拥有r权限,说明可以查看该==文件的内容==(cat/head/tail/less/more等命令查看)

  • 读权限==r==(read)用数字表示是==4==

☆ write写权限

  • 针对==目录==

    一个目录拥有w权限,说明可以在该目录里==创建、删除、重命名==等操作(mkdir/touch/mv/rm等)

  • 针对==普通文件==

    一个普通文件拥有w权限,说明可以==修改==该==文件的内容==(vi/vim编辑器编辑文件)

  • 写权限==w==(write)用数字表示是==2==

☆ execute执行权限

  • 针对==目录==

    一个目录拥有x权限,说明可以==进入或切换到==该目录里(cd命令)

  • 针对==普通文件==

    一个普通文件拥有x权限,说明可以==执行==该文件(一般程序文件、脚本文件、命令都需要执行权限)

  • 执行权限==x==(execute)用数字表示是==1==

rwx = 读写执行 = 4 + 2 + 1

☆ -没有权限

没有任何权限用横杠==-==表示,数字表示是==0==

5、理解UGO

UGO,指的是==用户身份==,每个字母代表==不同的==用户身份。

  • U(the user who owns it)

    文件的==拥有者==(owner)或者==创建者==

  • G(other users in the file’s ==g==roup)

    在文件的所属组(默认是创建文件的用户的主组)里的用户

  • O(==o==ther users ==not in== the file’s group)

    既不是文件的创建者,也不在文件属组里的用户,称为其他人

注意:

除了上面ugo以外,还有一个字母==a==(all users),表示==所有用户==,包含ugo

6、查看文件的权限

# ls -l 文件名称
或
# ll 文件名称

注:如果查看一个文件夹的权限,建议使用-d

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/180091.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—110.平衡二叉树【简单】

2023每日刷题&#xff08;十九&#xff09; Leetcode—110.平衡二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int preFunc(struct TreeNode* root) {if(root…

Telnet/ssh/Serial远程工具WindTerm

Telnet/ssh/Serial远程工具WindTerm 一、WindTerm 概述二、WindTerm 下载 一、WindTerm 概述 在远程终端工具中&#xff0c;secureCrt 和 XShell 是两款比较有名的远程工具&#xff0c;但收费。上一篇文章就介绍了一款免费软件MobaXterm&#xff0c;但菜单都是英文的&#xff0…

mediasoup webrtc音视频会议搭建

环境ubuntu22.10 nvm --version 0.33.11 node -v v16.20.2 npm -v 8.19.4 node-gyp -v v10.0.1 python3 --version Python 3.10.7 python with pip: sudo apt install python3-pip gcc&g version 12.2.0 (Ubuntu 12.2.0-3ubuntu1) Make 4.2.1 npm install mediasoup3 sudo …

存储器(详解)

概念 存储器&#xff08;Memory&#xff09;是计算机系统中用于存储和检索数据的硬件设备或组件。它在计算机中扮演着重要的角色&#xff0c;允许计算机暂时或永久地存储程序、数据和中间结果。 存储器是许多存储单元的集合&#xff0c;按单元号顺序排列。每个单元由若干二进制…

java后端响应结果Result

目录 一、Result1-1、响应代码1-2、调用响应1-3、在前端vue页面使用方法 一、Result 1-1、响应代码 package com.aaa.common;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public cla…

【Linux】 ps 命令使用

ps &#xff08;英文全拼&#xff1a;process status&#xff09;命令用于显示当前进程的状态&#xff0c;类似于 windows 的任务管理器。 语法 ps [选项] ps命令 -Linux手册页 著者 ps最初由布兰科兰克斯特撰写<lankestefwi.uva.nl>。迈克尔K约翰逊<johnsonmred…

服装手机壳抱枕diy来图定制小程序开发

服装手机壳抱枕diy来图定制小程序开发 一、我们的定位与特色 首先&#xff0c;我们是一个多元化商品定制商城。与其他商城不同的是&#xff0c;我们致力于提供全方位的定制服务&#xff0c;包括手机壳、抱枕、服装、水杯贴图等各类商品。 此外&#xff0c;我们还提供冲洗照片…

记一次并发问题 Synchronized 失效

记一次并发问题 Synchronized 失效 场景&#xff1a;为避免信息提交重复&#xff0c;给事务方法增加了synchronized修饰符&#xff0c;实际场景中仍然无法完全避免重复&#xff0c;原因是因为在第一个线程执行完synchronized代码段后&#xff0c;此时spring还未完成事务提交&a…

LeetCode算法题解(回溯)|LeetCode216. 组合总和 III、LeetCode17. 电话号码的字母组合

一、|LeetCode216. 组合总和 III 题目链接&#xff1a;216. 组合总和 III 题目描述&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同…

如何使用ps制作ico图标文件

如何使用ps制作ico图标文件 Chapter1 如何使用ps制作ico图标文件Chapter2 ICOFormat.8bi&#xff08;Photoshop Ico、Cur插件&#xff09;的下载使用1. ICOFormat.8bi的作用2. ICOFormat.8bi使用 Chapter3 ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程步骤 01 制…

吴恩达《机器学习》4-6->4-7:正规方程

一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法&#xff0c;它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差&#xff0c;通常采用均方误差。 二、步骤 准备数据集&#xff0c;包括特征矩阵 X 和目标…

使用JMeter进行接口压力测试

1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试&#xff0c;结果反馈如下图

IIS中间件漏洞----DotNetScan 工具

用DotNetScan 工具把目标网站IP&#xff0c;端口填写下。找到IIS的网站后就可进行操作上传。 也可以使用IISPutScanner工具 上传文件 利用解析漏洞 利用漏洞的前提条件&#xff1a;网站根目录可写入

「图像 cv2.seamlessClone」无中生有制造数据

上一篇博客【「图像 merge」无中生有制造数据 】写的是图片直接融合&#xff0c;此方法生成的图片相对而言比较生硬&#xff0c;虽然目标图片已经透明化处理过了&#xff0c;但是生成的图片依旧很假 除了上述上述的图片叠加融合之外&#xff0c;还有一种更加自然的融合方法&…

Leetcode—100.相同的树【简单】

2023每日刷题&#xff08;十八&#xff09; Leetcode—100.相同的树 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSameTree(struct TreeNode* p, struc…

基于STM32设计的室内环境监测系统(华为云IOT)_2023

一、设计需求 基于STM32+华为云物联网平台设计一个室内环境监测系统,以STM32系列单片机为主控器件,采集室内温湿度、空气质量、光照强度等环境参数,将采集的数据结果在本地通过LCD屏幕显示,同时上传到华为云平台并将上传的数据在Android移动端能够实时显示、查看。 【1…

【el-cascader-panel】组件el-cascader-panel使用踩坑

需求背景&#xff1a;角色管理资源&#xff0c;资源返回树形结构数据&#xff0c;左侧树形展示列表可查询&#xff0c;右侧勾选资源权限平铺。 本身组件不支持全选&#xff0c;所以增加了全选按钮。覆写了级联面板宽度。可传只勾选code或者顺序当前节点二维数组列表。 效果 因…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

groovy下载与安装

Groovy是一种基于JVM&#xff08;Java虚拟机&#xff09;的敏捷开发语言&#xff0c;它结合了Python、Ruby和Smalltalk的许多强大的特性&#xff0c;Groovy 代码能够与 Java 代码很好地结合&#xff0c;也能用于扩展现有代码。由于其运行在 JVM 上的特性&#xff0c;Groovy也可…

降低存储网络55% 延迟!阿里云存储论文入选计算机顶会

近日&#xff0c;计算机系统领域的国际顶级学术会议USENIX ATC 2023在美国波士顿市举行。凭借在规模化部署和应用模型上的创新&#xff0c;阿里云存储团队发表的技术论文《Deploying User-space TCP at Cloud Scale with LUNA》被顶会收录&#xff0c;这是继NSDI 21、SIGCOMM 2…