Linux 学习笔记 #3 用户跟用户组管理

作者: 分类: linux 时间: 2019-08-23 评论: 暂无评论

1.用户管理
① 增加用户
useradd 选项 用户名
参数说明:
选项:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

[root@localhost ~]# useradd -c '测试账号' -d /home/test -g test -G root -s /bin/sh test
[root@localhost ~]# groups test
test : test root

添加用户 备注:测试账号,主目录 /home/test,属于test,附属root组,/bin/sh启动,用户名test

② 删除用户
userdel [-r] 用户名 -r把用户目录也一起删除
③ 修改账号
usermod 选项 用户名
选项为 -c -g 这些,类似useradd 格式
④ 修改密码
passwd 选项 用户名
用户名默认为当前登录用户
可使用的选项:

-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。

[root@localhost ~]# passwd test
更改用户 test 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

2.用户组管理
① 新增用户组

groupadd 选项 用户组
groupadd test

可以使用的选项有:
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

② 删除

groupdel test

③ 修改用户组

常用的选项有:

-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n新用户组 将用户组的名字改为新名字

groupmod -n test2 test

④ 切换组
如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。
用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
newgrp root

3.用户组相关文件
① /etc/passwd
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...
test:x:1000:1000:测试账号:/home/test:/bin/sh

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

系统中有一类用户称为伪用户(psuedo users)。
这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

常见的伪用户如下所示:

伪 用 户 含 义
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lp lp或lpd子系统使用
nobody NFS使用

② /etc/shadow
由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

[root@localhost ~]# cat /etc/shadow
root:$6$AkeZV0UL$D0QWVXNowem4tyIuaJmpt6ESymhcNRZHExBF9TKLWAqtkViJfujJDSB1gxXOlUVNhTRtpvI1QzcBKgLgwzu3O1:18131:0:99999:7:::
bin:*:17834:0:99999:7:::
...
test:$6$RAH5kntR$LfnowfXg41YhWXbaNn9XkVS.gDrVcWNnqsuw9hFiR0Fc9rNhGSrY8IAfKPYBAJIlk5KGhgrvwJQanAVM9iD1A.:18131:0:99999:7:::

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

③ /etc/group
用户组的所有信息
root:x:0:test
bin:x:1:
daemon:x:2:
sys:x:3:
...
test:x:1000:

组名:口令:组标识号:组内用户列表

查看用户所属用户组
groups 用户组名 
[root@localhost ~]# groups test
test : test root

Linux 学习笔记 #2 文件权限

作者: 分类: php,linux 时间: 2019-08-23 评论: 暂无评论

1.Linux 文件基本属性
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
Linux中我们可以使用 ll 或者 ls –l

[root@localhost /]# ll
总用量 16
lrwxrwxrwx.   1 root root    7 8月  21 02:17 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 8月  21 02:38 boot
drwxr-xr-x.   2 root root    6 4月  11 2018 home

在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。

当为[ d ]则是目录
当为[ - ]则是文件;
若是[ l ]则表示为链接文档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

每个文件的属性由左边第一部分的10个字符来确定。类型+主+组+其它(如下图)。
363003_1227493859FdXT.png

2.Linux文件属主和属组
对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。
同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。
文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。

3.更改文件属性
① 变更文件或目录的所属群组 chgrp [-R] 所属组 文件名(目录名)

[root@localhost ~]# ll
-rw-r--r--. 1 root root    0 8月  23 19:19 test.txt
[root@localhost ~]# groupadd test
[root@localhost ~]# chgrp test test.txt
[root@localhost ~]# ll
-rw-r--r--. 1 root test    0 8月  23 19:19 test.txt

② chown:更改文件属主,也可以同时更改文件属组

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

[root@localhost ~]# chown root:root test.txt
[root@localhost ~]# ll
-rw-r--r--. 1 root root    0 8月  23 19:19 test.txt

③ chmod:更改权限
chmod [-R] xyz 文件或目录
xyz 是3位数数字,分别代表 属主 属组 其它 权限
比如:

属主是 rwx => 二进制 111=>十进制 4+2+1=7 => x=7
属组是 r-x => 二进制 100=>十进制 4+0+1=5 => y=5
其它是 r-x->  二进制 001=>十进制 4+0+1=1 => z=>5 

得到权限应该是 755

  root@localhost ~]# chmod 755 test.txt
  [root@localhost ~]# ll
  -rwxr-xr-x. 1 root test    0 8月  23 19:19 test.txt

还有一种写法:
chmod u|g|o|a[r|w|x] 文件
u|g|o|a (1)user (2)group (3)others(4)all 所有人 4种身份
+|-|= 增加 减去 设定
r|w|x 读,写,执行

[root@localhost ~]# ll
-rwxr-xr-x. 1 root test    0 8月  23 19:19 test.txt

[root@localhost ~]# chmod a=w test.txt
[root@localhost ~]# ll
--w--w--w-. 1 root test    0 8月  23 19:19 test.txt

[root@localhost ~]# chmod u=rwx,g=rx,o=x test.txt
[root@localhost ~]# ll
-rwxr-x--x. 1 root test    0 8月  23 19:19 test.txt

Linux 学习笔记 #1 启动过程与目录结构

作者: 分类: linux 时间: 2019-08-22 评论: 暂无评论

前言:
该系列来至https://www.w3cschool.cn/linux/
1.linux 启动过程

①读入 /boot 目录下的内核文件
②运行init(配置文件 /etc/inittab)
③运行级别(启动守护进程,它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon))
④系统初始化

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit,它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务

2.目录结构
以下目录使用频率较高
/bin:
bin是Binary的缩写, 这个目录存放着最经常使用的命令。

/boot:
这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev :
dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc:
这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home:
用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

/root:
该目录为系统管理员,也称作超级权限者的用户主目录。

/lib:
这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/media linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/usr:
这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。

/usr/bin:
系统用户使用的应用程序。

/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。

/usr/src:内核源代码默认的放置目录。

/var:
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

以下目录使用频率较少

/sbin:
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/selinux:
这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv:
该目录存放一些服务启动之后需要提取的数据。

/sys:
这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
该文件系统是内核设备树的一个直观反映。

当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:
这个目录是用来存放一些临时文件的。

/opt:
这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

/proc:
这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Python学习笔记 #5 函数

作者: 分类: python 时间: 2019-08-22 评论: 暂无评论

1,定义

 def 函数名(参数列表):
    函数体

2.传值
传递的是可变类型,值将被改变
传递的是不可变类型,值被复制了一份传入函数,原有值不变

def change(a):
    a += 1
    return a


b = 10
change(b)
print(b)  # 输出10

def change2(list):
    list.append(33)
    list.append(44)


list = [11, 22]
change2(list)
print(list)  # [11, 22, 33, 44]

3.参数

关键字参数 ,允许函数调用使用关键字参数来确定传入的参数值

def printinfo(name, age):
    "打印任何传入的字符串"
    print("名字: ", name)
    print("年龄: ", age)
    return


# 调用printinfo函数
printinfo(age=50, name="runoob")
'''
名字:  runoob
年龄:  50
'''

不定长参数

#加了1个星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
# 可写函数说明
def printinfo(arg1, *vartuple):
    "打印任何传入的参数"
    print("输出: ")
    print(arg1)
    print(vartuple)

# 调用printinfo 函数
printinfo(70, 60, 50)
'''
70
(60, 50)
'''

#加了两个星号 ** 的参数会以字典的形式导入。
def printinfo(arg1, **vardict):
    "打印任何传入的参数"
    print("输出: ")
    print(arg1)
    print(vardict)
# 调用printinfo 函数
printinfo(1, a=2, b=3)
'''
输出: 
1
{'a': 2, 'b': 3}
'''

#参数中星号 * 可以单独出现,调用的时候必须传入关键字
def f(a,b,*,c):
    return a+b+c
print(f(1,2,c=10))

# global,nonlocal关键字

a, b, c = 0, 0, 0  # 这是一个全局变量


global 和 nonlocal关键字
def sum():
    # 返回2个参数的和."
    global b  # 声明变量
    a = 1
    b = 1
    c = 1

    def kk():
        nonlocal c  # 声明变量 外部变量
        c = 2

    kk()
    print(c)  # 2


sum()
print(a)  # 0
print(b)  # 1

Python学习笔记 #4 迭代器与生成器

作者: 分类: php 时间: 2019-08-22 评论: 暂无评论

1.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

import sys;
list = [2, 3, 4, 'kkk']
it=iter(list);
for item in it:
    print(item)
# 或者

it=iter(list);
while True:
    try:
        print(next(it))
    except StopIteration:  #next完成的时候,会触发StopIteration异常
        sys.exit()

2.把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__()

class MyNumber:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if (self.a <=2):
            x = self.a
            self.a += 1
            return x
        else:
            return StopIteration


my = MyNumber()
my_it = iter(my)
print(next(my_it))
print(next(my_it))
print(next(my_it))

'''
结果:
1
2
<class 'StopIteration'>
'''

3.生成器
使用了 yield 的函数被称为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。

import sys


def fibonacci(n):  # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a  # 返回了a值,暂停,并保留了 a, b, counter,第二次从这里执行,有点像步进机
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f 是一个迭代器,由生成器返回生成
print(f)  # 并不是数组,而是一个 generator [ˈdʒenəreɪtə(r)]对象

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

'''
<generator object fibonacci at 0x00FE4DF0>
0 test 2 
'''