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的权限和属组,