linux 完整学习资料:第二章 vi   vim emacs   gedit




vi   vim      emacs    gedit



--由两个不同的软件包所提供

[root@li /]# rpm -qf `which vi`

vim-minimal-7.0.109-6.el5

[root@li /]# rpm -qf `which vim`

vim-enhanced-7.0.109-6.el5


# which vi |xargs rpm -qf

vim-minimal-7.0.109-6.el5



vi    vim (增强版vi,现在基本各种linux版本都带有vim)


cp /etc/passwd /tmp/

vim /tmp/passwd--现在打开,没有颜色,因为passwd不是在它应该在的路径,vim是可以区分出来的



vi   有三种模式:


1,一般普通模式:

2,编辑模式:i I o O a A r R

3,命令行模式:   : /  ?





移动相关:

--ctrl+b 向上翻页  = page up

--ctrl+f 向下翻页  = page down

ctrl+d 向下移动半页

ctrl+u 向上移动半页

--G移动到页末 =shift +g

--gg移动到页头

--0移动到行头 = home

--$移动到行末  = end

n(代表数字)+回车   向下移动N行  




删除,复制,粘贴

x向后删除一个字符 = delete

X往前删除一个字符 = backspace

--dd直接删除光标所在行ndd  (n代表数字,删除n行)

--yy复制光标所在行nyy(n代表数字,复制n行)

--p粘贴

--u回退上一次操作     按一次u只能回退一次

ctrl+r重做上一次操作



进入编辑模式:

--i当前insert

I行头insert

a向后一个字符insert

A行末insert

--o下一行insert

O上一行insert

r替换光标所在的字符

R从光标处向后一直替换

--ESC从编辑模式回退到一般模式



查找与替换:

-- /word查找单词      n  向下查找   N 向上查找

-- :1,$s/old/new/g从第一行到最后一行都用new替换old,g表示行里所有匹配的都替换

-- :%s/old/new/g从第一行到最后一行都用new替换old

-- :n1,n2s/old/new/g     从n1行到n2行用new替换old

-- :1,$s/old/new/gc从第一行到最后一行都用new替换old,多加了一个c就可以要求用户确认哪些换哪些不换



--:set number    或者 : set nu   把每一行都加上行号

--:set nonumber  或者 : set nonu去掉每一行前的行号



# vim /etc/vimrc

set number--在一个空白的地方加上(不要加到代码段里去了),以后使用vim打开任意文件,都会自动显示行号





http://10.1.1.35/li@user1~/abc

http://10.1.1.35/li@user1~/abc

http://10.1.1.35/li@user1~/abc

http://10.1.1.35/li@user1~/abc

把上面四行替换成下面这行内容

file:///172.19.1.120/abc


:1,$s/http\:\/\/10.1.1.35\/li@user1\~\/abc/file\:\/\/\/172.19.1.120\/abc/g




--:w保存 (write)

--:q退出(quit)

--:wq保存并退出    =shift+zz   = :x

--+!表示强制保存或者退出


:split横分布局

:vsplit竖分布局



--当两个终端同时打开的话,会产生一个.swap文件

如:你打开/tmp/passwd文件,会产生/tmp/.passwd.swap

解决方法是:直接删除掉它就可以了

rm /tmp/.passwd.swp




=========================================


bash 的一些技巧补充


history

!748--直接执行histroy里显示的第748条命令


ctrl+shift+r  

(reverse-i-search)`': 匹配模式


!$--代表上一条命令的后面部分



history -c--清除历史记录



多用TAB键




==============================================================


vmware虚拟机8.0  64位虚拟机


安装方法

# ./VMware-Workstation-Full-8.0.0-471780.x86_64.bundle



安装完后,启动虚拟机

# vmware &



虚拟机注册

MV4YN-0L38Q-2ZK60-XUA7K-AAZ18





===================================





用户管理


操作系统的分类:

单用户单任务操作系统:DOS

单用户多任务操作系统:windows 95  windows 98  windows 2000

多用户多任务操作系统:windows 2003 server windows 2008 server

linuxunix





基于多用户的基础上,引出的用户的分类:

管理员    root    uid=0

系统帐号  uid 1-499   65534 --不用于登录,用于跑守护进程,服务进程,便于权限控制的

普通用户帐号 uid  500-65535(2.6.xxx的内核支持的uid数量为 2^32-1个)





# bc

2^32-1

4294967295


[root@web ~]# echo $[2**32-1]

4294967295

[root@web ~]# echo $((2**32-1))

4294967295



[root@li ~]# id--查看当前登录用户的相关信息

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)


[root@li ~]# id apache

uid=48(apache) gid=48(apache) groups=48(apache)




/etc/passwd--用户

/etc/shadow--用户密码和使用限制规则

/etc/group--组

/etc/gshadow--组密码



--vim /etc/passwd

root:x:0:0:root:/root:/bin/bash

第一列: 用户名

第二列:密码   老版本这里放的就是密码,为了安全性考虑,密码放到了/etc/shadow的第二列

x代表/etc/shadow的第二列生效,去掉x就表示此用户登录的时候没有密码

第三列:uid     用户识别ID值,系统是通过这个值来确认是哪个用户

第四列:gid组识别ID值

第五列:描述项comment

第六列:家目录

第七个:bash   当前用户使用的bash




实验1:useradd user1

然后把user1的uid改为0,然后用user1登录

# su - user1

# id

uid=0(root) gid=515(user1) groups=515(user1)

#exit

# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

--上面实验说明系统看用户是只认UID的,并不是认名称



/bin/bash--可以登录系统(注意不同的shell类型会有少许的区别)

/bin/false--不能登录系统,不能登录一些服务如FTP,可以收邮件,一般用来跑守护进程

/sbin/nologin--不能登录系统,但可以登录一些服务如FTP,也可以收邮件等



还有三个特殊的非通用的

/bin/sync

/sbin/shutdown

/sbin/halt



实验:

修改user1的第7列,然后在另一个终端su - user1切换来对比





实验:

把/etc/passwd里root这行的第二列的x给去掉保存,注销系统重新登录,不需要密码就可以登录







--vim /etc/shadow

root:$1$.1RfCu/n$ModWntxLJRC6SpgAXSDO81:14694:0:99999:7:::

与/etc/passwd相对应 (但这里有九列)

第一列: 用户名

第二列:密码   (这里以*号开头或!开头默认是不能登陆的,但可以用su 命令切换)

第三列:上一次修改密码的时间      linux以1970年1月1日到现在的天数来算的

第四列:修改密码后几天内不允许再修改如果这里为5,那改过密码后5天内不能再修改(限普通用户自己改自己的密码,root用户随时能改) 0代表不限制

第五列:多少天内必须要求你改99999代表不限制

第六列:过期前几天给你一个告警信息

第七列:密码过期后还给的一个宽限天数

第8列: 这里可以写一个过期天数    这里也是以1970年1月1日到现在的天数来计算的,多用于收费系统

第九列: 保留,留着以后功能扩展




=================================================


# date +%F

2012-03-03

# date +'%F %T'

2012-03-03 10:40:46


# date +%Y/%m/%d

2012/03/03

# date +"%Y/%m/%d %H:%M:%S"

2012/03/03 10:41:09




--使用date命令修改时间

# date -s 20120217

# date -s "20120217 17:40:05"



计算现在离1970年1月1号的天数

[root@li ~]# echo $[`date +%s`/86400]

15386



`  `    --执行符号(在tab键上,ESC键下),里面的一定是在bash下单独可以执行成功的命令。加上执行符号的作用就是为了直接得到这个命令结果


$()  --和执行符号一样的作用


它们的区别:

在应用上有点小区别:

` `符号不要在一条命令里使用两个或两个以上,会出现问题,但$()可以





记住:

$[]

$(())

$()

``




===========================================================



手动去加密码

[root@li ~]# grub-md5-crypt --使用此命令产生加密字符串

Password:

Retype password:

$1$rVSI30$YG2geS.fjSU4mHiS5P4vW/

[root@li ~]# grub-md5-crypt --两次密码都为123,但产生的字符串不一样,这是正常的

Password:

Retype password:

$1$3YSI30$ZyGCzWM2IEmnIW4q4p1uS/


[root@li ~]# vim /etc/shadow--然后加到/etc/shadow

[root@li ~]# su - a--root切换普通用户,不用密码

[a@li ~]$ su - b--普通切换普通,要密码

Password: --输入123

[b@li ~]$ --登陆成功



=================================================


实验:把/etc/shadow里user1的第四列改成2

    然后把修改时间,再用另一个终端去su - user1,使用user1自己去修改自己的密码

   如果离上次改密码的时间在2天以内,则会报You must wait longer to change your password

  离2天以外,则可以顺利修改



=====================================================


用一个普通用户在第8列,写一个已经过期的时间,


然后su - 切换一个另一个普通用户,再来切换修改过的那个普通用户,就会报账号过期--不能直接用root切换它做测试


或者注销,直接使用这个修改过的用户登录,也是可以看到报账号过期




===========================================================





用户相关的命令

useradd

usermod

userdel  --建议加一个-r参数,删除用户的同时删除相关目录

passwd




[root@li ~]# userdel a--删除时没有加-r参数

[root@li ~]# useradd a   --再建立一个a用户会报错

Creating mailbox file: File exists

useradd: warning: the home directory already exists.

Not copying any file from skel directory into it.

[root@li ~]# id a--现在的a用户id 为505

uid=505(a) gid=505(a) groups=505(a)

[root@li ~]# ll /home/

total 24

drwx------ 4   501   501 4096 Jun 29 13:42 a  --原来的a用户id为501


[root@li ~]# userdel -r a--这次加-r参数,也删除不了,因为它不属于id 505的这个a用户

userdel: /var/spool/mail/a not owned by a, not removing

userdel: /home/a not owned by a, not removing


解决方法:

[root@li ~]# rm /home/a -rf

[root@li ~]# rm /var/mail/a -rf



使用passwd改密码,普通用户只能改自己,并且只能改成复杂的密码(最少8位,要字母,数字,符号组合)

root用户可以改所有人,并且可以改成很简单的密码






=================================




[root@localhost ~]# su - user1--完全切换,切换后就是相当于使用user1用户登录

[user1@localhost ~]$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user1/bin



[root@localhost ~]# su user1--非完全切换,切换后还带有上一个用户的属性

[user1@localhost root]$ echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin


--root用户切换普通用户不需要密码, 但是普通用户切换别的用户都需要密码





建立一个普通用户后,如果没有对它设密码,则无法登录,只能使用root用户去切换它(别的用户去切换它也切换不了)




# su - user1

$ touch 888

$ ll 888

-rw-rw-r-- 1 user1 user1 0 Mar  3 11:52 888



# su - user1 -c 'touch 777'



===================================





组管理


vim /etc/group

bin:x:1:root,bin,daemon


第一列:组名

第二列:与/etc/passwd第二列一样

第三列:gid

第四列:哪些用户属于这个组


vim /etc/gshadow

bin:::root,bin,daemon



groupadd  

groupdel  

groupmod

gpasswd



gid 和 groups的区别:


gid是建立文件和目录时的属组属性

groups是表示此用户在访问时拥有它们的组权限



[root@localhost ~]# groupadd uplooking

[root@localhost ~]# useradd -G uplooking up1

[root@localhost ~]# id up1

uid=503(up1) gid=504(up1) groups=504(up1),503(uplooking)



[root@localhost ~]# useradd -g uplooking up4

[root@localhost ~]# id up4

uid=506(up4) gid=503(uplooking) groups=503(uplooking)




[root@localhost ~]# su - up1

[up1@localhost ~]$ touch test

[up1@localhost ~]$ ll

total 0

-rw-rw-r-- 1 up1 up1 0 Mar  7 13:43 test



[root@localhost ~]# su - up4

[up4@localhost ~]$ touch test

[up4@localhost ~]$ ll

total 0

-rw-r--r-- 1 up4 uplooking 0 Mar  7 13:43 test



--总结:也就是说gid为哪个组,那么它默认创建的文件或目录的属组为gid的那个组



# useradd -g up1 -G up2,up3 up7





============================================================




关于初始组和有效组的讨论


[root@localhost ~]# usermod -g uplooking -G up1 up1--把up1的gid改为uplooking,同时还要属于up1组

[root@localhost ~]# id up1

uid=503(up1) gid=503(uplooking) groups=503(uplooking),504(up1)



[root@localhost ~]# su - up1

[up1@localhost ~]$ groups

uplooking up1--前一个组为有效组,就是gid的组,表示创建的文件的属组为uplooking



[up1@localhost ~]$ newgrp up1--把有效组切换为up1,也可以说成是组登录

[up1@localhost ~]$ groups

up1 uplooking--虽然gid仍然为uplooking,但是有效组切换为up1了,那么创建的文件属组为up1



--总结:上面可以看到gid只是默认的有效组,如果有效组进行了切换,则创建的文件或目录的属组为有效组的那个组



=============================



[root@localhost ~]# gpasswd up2--组up2组加一个组密码

Changing the password for group up2

New Password:

Re-enter new password:



[root@localhost ~]# su - up1

[up1@localhost ~]$ groups

uplooking up1

[up1@localhost ~]$ newgrp up2--登录一个不属于的组需要组密码。属于那个组的话就不需要组密码

Password:

[up1@localhost ~]$ groups

up2 uplooking up1--再创建的文件或目录的属组就为up2了





建立三个用户

a,b,c

建两个组group1,group2,组密码都为123


要求:

1.a用户创建的文件的默认属组为group2,同时它属于group1组

2.不存在a,b这两个组,但存在c组,不存在group1,group2这两个用户

3.b用户gid为group1,不属于其它组

4.c用户gid为c,还同时属于group1,group2

5.b用户在自己的家目录下创建一个test文件,要求test文件属于group2组





groupadd group1

groupadd group2

gpasswd group1

gpasswd group2


useradd -g group2 -G group1 a

useradd -g group1 b

useradd -G group1,group2 c


su - b

newgrp group2

touch test




==============================================

pwconv同步/etc/passwd和/etc/shadow

grpconv  

==============================================




[root@li ~]# vim /etc/login.defs  --useradd创建用户时默认读取的文件


man login.defs



======================================



/etc/shadow 误删除了  使用pwconv同步,再修改一下密码


/etc/passwd  误删了  ,自己写一个,或者拷别的机器,先把root写上去,进入系统再慢慢处理别的用户




=================================


sudo


man sudoers


Sudoers allows particular users to run various commands as

the root user, without needing the root password.




# vim /etc/sudoers


user1   ALL=(ALL)       ALL--在76行加上这一句



然后

#su - user1

#sudo touch /root/user1


We trust you have received the usual lecture from the local System

Administrator. It usually boils down to these three things:


   #1) Respect the privacy of others.

   #2) Think before you type.

   #3) With great power comes great responsibility.


Password: --密码是user1的密码,而不是root的密码



=================================================================




环境变量


env--查看环境变量

set--除环境变量还可以查看自定义变量




# PS1='[\u@\h \W]\$ '






用户的环境变量设定文件,存放在每个用户的家目录下

.bash_history--用户的历史命令存放的地方  用history命令可以查看,它不记录当前会话所操作的命令,当你exit退出时,才会把刚才所用过的命令记录在这个文件

.bash_logout--用户登出后执行的可以在这里加上清除.bash_history的命令,在用户登出时清掉之前的操作

.bashrc--别名设定的文件

.bash_profile--用户的环境变量设定的地方



/etc/profile

/etc/bashrc

这两个文件是全局环境变量的配置文件,里面的配置是对所有用户生效的





例1:用户登出时清掉所有的操作记录

在用户家目录下的.bash_logout里加histroy -c (而不要使用rm -rf .bash_history)



# vim /home/mmm/.bash_logout


history -w

echo "*****************************" >> /tmp/mmm_history_record

echo `date +"%Y-%m-%d %H:%M:%S"` >> /tmp/mmm_history_record

echo  >> /tmp/mmm_history_record

cat .bash_history >> /tmp/mmm_history_record

echo  >> /tmp/mmm_history_record

echo "*****************************" >> /tmp/mmm_history_record


history -c

/usr/bin/clear

echo "goodbye,$USER"




例2,别名的增加

vim /root/.bashrc

加上下面一句

alias mount2='mount 2.2.2.35:/share/soft /mnt'


保存退出后 使用source /root/.bashrc使它生效



环境变量文件修改后,使它生效的方法

1,source /etc/bash_profile

2, . /etc/bash_profile

3,登录重登录用户



--在rhel5   全局环境变量这两个文件修改后,需要source使他生效

--在rhel6   这两个文件修改后,不需要source,直接已经生效;但是用户家目录里的bashrc和bash_profile修改后,仍然要source使它生效




例3.实现a用户可以直接使用(不要绝对路径)/sbin/下的所有命令


su - a

[a@li ~]$ vim ~/.bash_profile


PATH=$PATH:$HOME/bin:/sbin--这里多加一个/sbin的目录


export PATH



[a@li ~]$ source ~/.bash_profile --./或者source使它生效



[a@li ~]$ ifconfig --可以查看




[a@li ~]$ init 0

init: must be superuser.

[a@li ~]$ shutdown

shutdown: you must be root to do that!

[a@li ~]$ ifconfig eth0 10.1.1.36 netmask 255.255.255.0

SIOCSIFADDR: Permission denied

SIOCSIFFLAGS: Permission denied

SIOCSIFNETMASK: Permission denied

SIOCSIFBROADCAST: Permission denied


--但是上面的一些操作都是不可以的,它们都由内部被权限控制了

--那么如何可以让普通用户能关机呢?  就要用到讲权限时用到的特殊权限位 S位




练习:

1, 使用date命令显示昨天的日期,三天前,五天后的日期,2013年0点与1970年0点之间的秒数(man date)



# date -d yesterday

# date -d "-1 days"

# date -d "3 days ago"

# date -d "3 yesterday"


# date -d "5 tomorrow"

# date -d "+5 days"


# date +%s -d '20120101'







2,.系统自动把任何登录系统的用户信息给保存到/tmp/login文件里

要求格式为:用户名2011-06-29 16:40:11

提示:先做下面两步:

touch /tmp/login

chmod 777 /tmp/login--这是把此文件的权限改为所有的用户可写

用户名如何显示?   有一个显示当前登录用户的环境变量 (env去查找)




# vim /etc/profile--在最后加上下面一句


echo "$USER `date +'%Y-%m-%d %H:%M:%S'`" >> /tmp/login


# source /etc/profile--rhel6里,source这句可以省略




3.实现每天root用户登录后,自动密码的修改

比如说今天登录后,

root的密码就自动被修改为uplooking20110629(后面的数字为登录当天的时间)

--提示man passwd 去查找 --stdin

# echo uplooking | passwd --stdin root > /dev/null




# vim /root/.bash_profile

echo "uplooking`date +%Y%m%d`" | passwd --stdin root > /dev/null


# source /etc/profile







4,实现用户登出时,提示它登录一共的时间

以test用户退出时显示的为例:

格式如下:

test,你一共登录了0时,0分,8秒 Bye @_@


提示计算格式:

a=$[$a-$b]




# vim /home/test/.bash_profile


export logintime=`date +%s`


# vim /home/test/.bash_logout


logouttime=`date +%s`

alltime=$[$logouttime-$logintime]

hours=$[$alltime/3600]

minutes=$[($alltime-$hours*3600)/60]

seconds=$[$alltime-$hours*3600-$minutes*60]


echo "$USER,你一共登录了$hours时,$minutes分,$seconds秒 Bye @_@"





5,实现3分钟内用户无操作,则自动退出

  提示:把TMOUT=180 加入环境变量相关的文件里,使之生效



单个用户,在它的.bashrc或.bash_profile里加上TMOUT=180,

再source使之生效


如果是所有用户,则写到/etc/profile里或/etc/bashrc里,再使之生效







6,手工建立一个用户(也就是不使用useradd user5,而是完全用vi的修改和mkdir,cp等相关的命令建立一个user5用户)写出步骤



1 vim /etc/passwd

2 vim /etc/shadow

3 vim /etc/group

4 vim /etc/gshadow

5 mkdir /home/user5

6 cp /etc/skel/.bash* /home/user5/

7 touch /var/mail/user5

8 改/home/user5和/var/mail/user5的权限和属组,









你可能感兴趣的:(vi,vim,emacs,gedit, , , , )