linux笔记4(压缩、bash、系统监视、进程、用户管理)
压缩
gzip
[root@redhat root]# gzip test1.txt //压缩
gunzip
[root@redhat root]# gunzip test1.txt.gz //解压
[root@redhat root]# gzip -d test1.txt.gz //解压
[root@redhat root]# zcat test1.txt.gz //直接查看gz文件
十月 2011
日 一 二 三 四 五 六
1
1
02 3 4 5 6 7 8
09 10 11 12 13 14 15
09 10 11 12 13 14 15
16 17 18 19 20 21 22
compress, uncompress
unix上一种较老的压缩工具。
bzip2
[root@redhat root]# bzip2 test1.txt //压缩
bunzip2
[root@redhat root]# bunzip2 test1.txt.bz2 //解压
[root@redhat root]# bzip2 -d test1.txt.bz2 //解压
tar
[luowei@redhat luowei]$ tar -cvf test.tar test //给test目录打包成test.tar
[luowei@redhat luowei]$ tar cvf aaa.tar allout test.tar //将allout与test.tar文件打包到aaa.tar文件中
[luowei@redhat luowei]$ tar xvf test.tar //解包
[luowei@redhat luowei]$ tar tf test.tar //查看test.tar包文件中的内容
[luowei@redhat luowei]$ tar cvf bbb.tar stdout -C /home/luowei/test 将stdout打包成bbb.tar并存放到 /home/luowei/test目录下
[root@redhat root]# tar zcvf test.tar.gz test //给test目录打包,并添加到压缩文件
[root@redhat root]# tar zxvf test.tar.gz //对压缩文件解压并解包
[root@redhat root]# tar jcvf test.tar.bz2 test //把test目录打包并压缩成bz2文件
[root@redhat root]# tar jxvf test.tar.bz2 //对打包压缩后的bz2解压并解包
dump
[root@redhat root]# dump -0 -f /tmp/dump1 /root/test //将test目录备份到dump1文件
[root@redhat /]# dump -0u -f /tmp/bootdump /boot //将顶层分区boot备份到bootdump文件
[root@redhat /]# cat /etc/dumpdates //查看到分区的备份记录
[root@redhat root]# dump -0 -f /tmp/test2dump test2.txt //备份文件test2.txt
[root@redhat root]# restore -tf /tmp/test2dump //查看备份文件的内容
[root@redhat root]# restore -rf /tmp/dump1 //将dump1还原到当前文件夹下
bash
shell
shell:命令行解释器,是用户与系统沟通时的媒介。在unix系统中有各种shell,linux用bash为默认shell。系统可以使用的shell记录在 /etc/shells中。
如:
[root@redhat root]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/bash2
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh
[root@redhat root]# a=luowei //设置变量a的值为luowei
[root@redhat root]# echo $a //显示a变量的值
luowei
[root@redhat root]# echo ${a} //显示a变量的值
luowei
[root@redhat root]# a=$a123 //这样不能把a赋成luowei123
[root@redhat root]# echo $a
[root@redhat root]# a=luowei
[root@redhat root]# a=${a}123 //这样可以把a赋成luowei123
[root@redhat root]# echo $a
luowei123
[root@redhat root]# unset a //删除a变量
环境变量
使用set可以查看本地变量和环境变量,如:
[root@redhat root]# set //查看本地变量与环境变量
[root@redhat root]# env //查看环境变量
预定义环境变量
系统通过预定义的环境变量来定义shell环境,用户可以用set或env查询当前的环境变量。
常用的预定义环境变量:
HOME:当前用户的主目录
PATH:当前用户的可执行文件搜索路径
LANG:程序应该使用的默认语言
PS1:行提示符
如:
[root@redhat /]# cd $home //进入到家目录
[root@redhat root]# LANG=en //更改在英文语系
[root@redhat root]# echo $PS1 //显示PS1中的值
[\u@\h \W]\$
\u:显示当前用户的名称
\h:仅列出主机名的第一个名字
\W:显示当前工作目录的最后个目录名称
[root@redhat root]# basename /etc/X11 //截取目录的最后一个目录名
[root@redhat root]# PS1='[\u@\H \w \A \#]\$' //设置PS1
[root@redhat ~ 16:44 32]#
\H:显示完整的主机名
\w:显示当前完整工作路径,家目录用~表示
\A:显示当前时间
\#:显示当前是第几条命令
\$:显示提示符
[root@redhat root]# export a //将a变量转换成环境变量
History
History:可以查询用户以前的过往操作
如:
[root@redhat root]# history //列出用过的命令
[root@redhat root]# history 10 //列出最后使用过的10条指令
内存中记录的过往指令数由环境变量HISTSIZE而定。History表存储在内存中,在用户logout时会记录用户主目录下的.bash_history文件中。在下次login时载入。 .bash_history中的指令由环境变量中的HISTFILESIZE而定。
如:
[root@redhat root]# echo $HISTSIZE
1000
[root@redhat root]# echo $HISTFILESIZE
1000
[root@redhat root]# history –w //将历史指令强制写入.bash_history文件中
调用过往指令
使用 ! 来调用过往指令:如
!!:重复执行上一条指令
!a:重复执行上一条以a为首的的指令
!number:重复执行上一条在history表中记录号码为number的指令
!-number:重复执行前第number条指令
可以用<ctrl+r>来在history表中查询过往指令
例:
[root@redhat root]# !e //执行最近的以 e 开头的指令
[root@redhat root]# !$ //截取上一条指令的最后一个参数
127.0.0.1
-bash: 127.0.0.1: command not found
[root@redhat root]# ping !$ //直接ping 127.0.0.1,因为 !$ 截取到的是127.0.0.1
ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
Alias(别名)
例:
[root@redhat root]# alias //列出系统中目前存在的别名
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mc='. /usr/share/mc/bin/mc-wrapper.sh'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@redhat root]# alias a='ls -al' //设置 a 为 ls –al 的别名
[root@redhat root]# unalias a //删除a 这条别名
命令行表达式
命令行输出——" "
将一串字符当成一个字符串对待,如果字符串中包含特殊含义的字符(/,`,$,!),则转义。
命令行输出——' '
将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符,不转义。
执行引用符——` `
引用命令的执行结果
例:
[root@redhat root]# echo "$PWD"
/root
[root@redhat root]# echo '$PWD'
$PWD
[root@redhat root]# ls -l `PWD` //列出当前目录下的详细信息
数学运算——$[]
在中括号内的表达式会被数学计算
逸脱符——\
用于取消命令行中字符的特殊含义
用于表示一行未结束
例:
[root@redhat root]# echo $[1+4]
5
[root@redhat root]# echo \$[1+4]
$[1+4]
[root@redhat root]# mkdir a\ b //建立一个名为"a b"的目录,\取消了空格的间隔作用
[root@redhat root]# ls \ // \表示一行未结束
> /home
luowei test1
[root@redhat root]#
命令行结束符——;
用于在一行内分隔几个独立命令,表示一行已结束,作用相当于回车键。
了shell激活——()
在小括号内的命令行表示激活一个子shell后在子shell中运行。
[root@redhat root]# ls;pwd;ls –a //依次分别执行这三条指令
[root@redhat root]# echo $HOME
/root
[root@redhat root]# HOME=/usr
[root@redhat root]# echo $HOME
/usr
[root@redhat root]# HOME=/root
[root@redhat root]# (HOME=/usr) //表示这个HOME=/usr 在子shell中运行
[root@redhat root]# echo $HOME
/root
[root@redhat root]#
逻辑运算符
&&:当前一条指令执行成功时再执行后一条指令
||:当前一条指令执行失败时再执行后一条指令
例:
[root@redhat root]# ls /home && touch /home/test1 //如果存在/home则建立/home/test1
[root@redhat root]# ls /root/test1 || mkdir /root/test1 //如果不存在/root/test1,则建立 /root/test1目录
[root@redhat root]# ls /root/test && echo "exist" || echo "no exist"
ls: /root/test: 没有那个文件或目录
no exist
[root@redhat root]#
定制登录shell
Bash在用户登录时从四个文件中读取环境,设定:
全局设置文件:/etc/profile , /etc/bashrc
用户设置文件:~/.bashrc , ~/.bash_profile
其他shell设定文件
~/.bash_logout:在用户logout的时候自动执行。
~/.bash_history:用户login时自动读取其内容并加载到内存history记录中,logout时将内存history记录写入。
/etc/profile.d/*.sh:在/etc/profile中被执行,其中的环境设定,也会被全局引用。
常用快捷键
Ctrl+d:输入已结束。在shell下相当于一个exit。
Ctrl+c:键盘中断请求。
Ctrl+s & ctrl+q:暂停/恢复屏幕输出。
Ctrl+l:清屏,相当于clear。
Tab:自动补完命令行与文件名。
Tab键双击可以列出所有可能匹配的选择。
例:
[root@redhat ~ 20:22 35]#cat > test2.txt
cat > test2.txt
hello ,i'm luowei.
welcome to linux's world! //ctrl+d结束输入
[root@redhat ~ 20:23 36]#cat test2.txt
cat > test2.txt
hello ,i'm luowei.
welcome to linux's world!
[root@redhat ~ 20:24 37]#
系统监视
了解系统状况
uname:显示系统信息
hostname:显示主机名
last:列出最近的用户登录
lastlog:列出每一个用户的最近登录情况
free:显示内存使用状况
vmstat:详细列出内存使用状况
top:系统监视器
例:
[root@redhat root]# top -d 3 //top默认是5秒刷新一次,这设置成3秒刷新一次
[root@redhat root]# top -b -n 2 > top.txt //将top刷新两次的结果存到top.txt
[root@redhat root]# cat top.txt
进程
系统通过进程来完成工作,每个进程都有一个独立的进程号,系统通过调用进程号来调度操控进程。系统的原始的原始进程是init。init的PID总是1。一个进程可以产生另一个进程,除了init以外,所有的进程都有父进程。
例:
[root@redhat root]# ps –l //列出与ps进程相关相关的进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 2311 2309 0 75 0 - 1384 wait4 pts/0 00:00:00 bash
0 R 0 2408 2311 0 80 0 - 781 - pts/0 00:00:00 ps
[root@redhat root]# ps aux //查看所有有效进程
[root@redhat root]# pstree –a //以树状结构显示所有进程
[root@redhat root]# pstree –aup //以树状结构显示所有进程,并显示所属用户和PID
控制进程
Kill,语法:kill [-signal] PID ,向进程传送一个特定的讯号,默认为15,列出所有可以由kill传递的讯号。
[root@redhat root]# kill –l //列出所有可以由kill –l 传递的讯号
[root@redhat root]# ps -ef|grep "top" //筛选出所有含有top的指令
[root@redhat root]# kill -9 4634 //删除一个进程号为4634的进程
使用nice和renice改变进程的优先级。
[root@redhat root]# renice 10 4709 //将4709号进程的优先级改为4709
[root@redhat root]# ps -l | grep top //显示top进程的详细信息
第二种修改进程优先级的方法,直接打开top命令,在top界面内直接敲入 R ,然后直接输入进程号,再输入优先级的值。
将进程丢入后台运行
Command & :将一个进程直接丢入后台运行。
nohup command &:将一个进程直接丢入后台运行,而且在该控制台退出后,进程仍不挂断。
Ctrl + z :将一个正在运行的前台进程暂停,并丢入后台。
例:
[root@redhat root]# top & //将top进程放到后台执行
[1] 2405
[root@redhat root]# vi top.txt
CPU0 states: 0.0% user 0.1% system 0.0% nice 0.0% iowait 99.0% idle
CPU1 states: 0.0% user 0.0% system 0.0% nice 0.0% iowait 100.0% idle
Mem: 254664k av, 59076k used, 195588k free, 0k shrd, 22052k buff
48112k actv, 172k in_d, 224k in_c
Swap: 522104k av, 0k used, 522104k free 20612k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
1 root 15 0 472 472 420 S 0.0 0.1 0:04 0 init
2 root RT 0 0 0 0 SW 0.0 0.0 0:00 0 migration/0
……………… //按下ctrl+z
[2]+ Stopped vim top.txt
[root@redhat root]#
工作
jobs:列出系统当前的后台进程
fg:将后台进程拉回前台
bg:激活后台暂停的进程
例:
[root@redhat root]# jobs –l //查看后台作业
[1]- 2405 Stopped (tty output) top //作业的状态为Stopped
[2]+ 2411 Stopped vim top.txt
[root@redhat root]# fg %1 //将后台的1号作业,放到前台来执行
[root@redhat root]# bg %1 //把1号作业,放到后台执行
[1]+ top &
[root@redhat root]# bg %1 ;jobs
[1]+ top &
[2]+ Stopped vim top.txt
[1]- Running top &
/proc目录
/proc目录是一个虚拟的文件系统,包含了来自正在运行着的核心的信息。
用户可以通过cat /proc/下的文件来获得系统的信息。
这些信息包括系统硬件、网络设置、内存使用,及其他一引些东西。
/proc/sys目录下的文件,允许系统管理员更动,这些变动会直接影响当前核心。
例:
[root@redhat root]# ls -l /proc/ //查看/proc/目录下的文件
[root@redhat root]# cat /proc/cpuinfo //查看cpu的信息
[root@redhat root]# echo "" > /proc/sys/net/ipv4/icmp_echo_ignore_all //忽略所有ping消息
系统日志存放在 /var/log 目录下
常用的系统日志:
/var/log/dmesg 核心启动日志
/var/log/messages 系统报错日志
/var/log/maillog 邮件系统日志
例:
[root@redhat root]# tail -f /var/log/messages //查看最近的系统日志
[root@redhat root]# cat /var/log/maillog //查看邮件服务信息
/var/log/xferlog //FTP服务用日志
/var/log/secure //安全信息,系统登录与网络连接的信息
/var/log/wtmp //登录记录
例:
[root@redhat root]# last //显示最近登录的用户
检查用户身份
who:查询当前登录的用户
groups:查询用户所属的组
id:显示当前用户信息
finger:查询用户信息
例:
[root@redhat root]# groups //显示当前系统存在的用户组
[root@redhat root]# id root //显示root用户的详细信息
[root@redhat root]# finger luowei //显示luowei这个用户的详细信息
[root@redhat root]# whoami //显示当前的用户
[root@redhat root]# w //显示当前用户的详细信息
添加用户
用指令添加命令:
useradd <username>
passwd <password>
系统添加用户的标准步骤:
- 编辑 /etc/password与 /etc/group
- 创建用户主目录
- 从 /etc/skel拷贝文件与目录
- 让新用户获得其主目录与文件的拥有权限
- 给新用户一个密码
更改/删除用户
1.更改用户的资料可以通过:
redhat-config-users或kusers之类的图形界面工具来完成,在字符界面下可以使用usermod指令来更改。
2.系统管理者可以用userdel指令来删除已存在的用户
参数-r可以帮助系统将一个用户的目录等一并删除。
例:
[root@redhat root]# usermod -c "this is luowei's username" luowei //修改luowei的全名
[root@redhat root]# finger luowei
Login: luowei Name: this is luowei's username
Directory: /home/luowei Shell: /bin/bash
Last login Mon Oct 24 17:32 (CST) on :0
No mail.
No Plan.
[root@redhat home]# mkdir tst1
[root@redhat home]# usermod -d /home/tst1 test1 //将test1的家目录改到tst1
[root@redhat home]# cd ~test1 //切换到test1的家目录
[root@redhat tst1]# cd .. //切换上层目录
[root@redhat home]# chown test1.test tst1 //修改tst1目录的属主
[root@redhat home]# chmod 700 tst1 //修改tst1的权限
[root@redhat tst1]# usermod -e "2012-01-01" test1 //设置test1用户的过期时间为2012-01-01
[root@redhat tst1]# id test1
uid=501(test1) gid=501(test) groups=501(test)
[root@redhat tst1]# usermod -G root test1 //将test1加入到root用户组
[root@redhat tst1]# id test1
uid=501(test1) gid=501(test) groups=501(test),0(root)
[root@redhat tst1]# usermod -g root test1 //修改test1的gid改成root组的
[root@redhat tst1]# id test1
uid=501(test1) gid=0(root) groups=0(root)
[root@redhat tst1]# usermod -g 501 test1 //将test1的gid改成501
[root@redhat tst1]# id test1
uid=501(test1) gid=501(test) groups=501(test),0(root)
[root@redhat tst1]# usermod -s /bin/csh test1 //将test1的默认shell改为csh
[root@redhat tst1]# usermod -u 504 test1 //修改test1的uid
[root@redhat tst1]# usermod -p 1234 test1 //将test1的密码设置为1234
[root@redhat tst1]# usermod -L test1 //锁定test1用户
[root@redhat tst1]# passwd -S test1 //查看test1用户的状态
Password locked.
[root@redhat tst1]# useradd jack //添加jack用户
[root@redhat tst1]# ls /home
jack luowei test1 tst1
[root@redhat tst1]# userdel jack //删除jack用户
[root@redhat tst1]# id jack
id: jack: No such user
[root@redhat tst1]# ls /home
jack luowei test1 tst1
[root@redhat tst1]# useradd tom
[root@redhat tst1]# ls /home
jack luowei test1 tom tst1
[root@redhat tst1]# userdel -r tom //删除tom用户及以tom相关的其它信息
[root@redhat tst1]# ls /home
jack luowei test1 tst1
[root@redhat tst1]#
/etc/password文件
password文件中记录的是用户的登录信息,每一行代表一个用户。
例:
[root@redhat root]# vi /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
…………
luowei:x:500:500:this is luowei's username:/home/luowei:/bin/bash
test1:x:504:501::/home/tst1:/bin/csh
tom:x:505:505::/home/tom:/bin/bash
[root@redhat root]# cat /etc/passwd|wc –l //显示passwd文件中共有多少行
39
[root@redhat root]#
----------------------------------------
password文件详细信息(分别表示):
login name:登录用户名
passwd:密码
uid:用户身份编号
gid:登录默认所在组编号
full name:用户全名或注释
home directory:用户主目录
shell:用户默认使用shell
----------------------------------------
login.defs中的create home选项决定系统在建立用户的时候是否同时创建其主目录,系统在建立用户主目录时,会将/etc/skel下的内容复制到新目录下,最后系统会使该目录与其下的文件归属于新用户。
----------------------------------------
Red Hat Linux默认将用户密码存储在/etc/shadow文件中,passwd文件默认权限为644,shadow文件默认权限为400,shadow文件支持密码过期设定等功能,shadow文件中每一行表示一个系统用户的密码记录,用 :号分隔。用户可以通过authconfig来设定是否使用shadow文件及md5加密。
shadow文件的每一行中的每一项具体来说:
登录用户名
用户密码(一般经md5加密)
从1970年1月1日起到密码上一次被更改的时间
密码再过几天可以被变更(0表示随时可被变更)
密码再过几天必须被变更(999999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过期几天后账号会被取消
从1970年1月1日算起,多少天后帐号失效
---------------------------------
[root@redhat root]# groupadd gp1 //添加群组
[root@redhat root]# groupdel gp1 //删除群组
[root@redhat root]# groupmod -n jack tom //将名称为tomr的群组重命名为jack
[root@redhat root]# cat /etc/group //查看所有的群组
[root@redhat root]# groupmod -n tom jack //将名称改回来
[root@redhat root]# gpasswd tom //给tom群组设置密码
Changing the password for group tom
New Password:
Re-enter new password:
[root@redhat root]# useradd jack //添加一个jack用户
[root@redhat root]# passwd jack
Changing password for user jack.
New password:
BAD PASSWORD: it is too short
Retype new password:
passwd: all authentication tokens updated successfully.
[root@redhat root]# groups jack //添加jack群组
jack : jack
[root@redhat root]# gpasswd -a jack tom //将jack添加到tom群组中
Adding user jack to group tom
[root@redhat root]# vi /etc/group
…………
luowei:x:500:
test:x:501:jack //手动添加jack到test群组
tom:x:505:jack
jack:x:506:jack
"/etc/group" 48L, 659C written
[root@redhat root]# cat /etc/passwd
…………
luowei:x:500:500:this is luowei's username:/home/luowei:/bin/bash
test1:x:504:501::/home/tst1:/bin/csh
tom:x:505:505::/home/tom:/bin/bash
jack:x:506:501::/home/jack:/bin/bash 后边一个501表示初始群组gid
[root@redhat root]# su - jack
[jack@redhat home]$ groups //列出当前用户的群组
test tom jack
[jack@redhat home]$ cd
[jack@redhat jack]$ touch test
[jack@redhat jack]$ ls -l
total 0
-rw-r--r-- 1 jack test 0 Nov 5 17:20 test
[jack@redhat jack]$ newgrp jack //修改当前用户的有效群组
[jack@redhat jack]$ groups
jack test tom
[jack@redhat jack]$ touch test1
[jack@redhat jack]$ ls -l
total 0
-rw-r--r-- 1 jack test 0 Nov 5 17:20 test
-rw-rw-r-- 1 jack jack 0 Nov 5 17:23 test1
[jack@redhat jack]$ su -
Password:
[root@redhat root]# useradd -u 600 -g test -G jack jim //建立jim用户,并设置其uid为600,初始群组为test,并且还将其加入jack群组中。
[root@redhat root]# useradd lucy -s /bin/csh //创建lucy并将它的默认shell改为csh
[root@redhat root]# useradd -M test2 //创建test2目录但不创建它的家目录
[root@redhat root]# ls /home
jack jim lucy luowei test1 tom tst1
[root@redhat /]# useradd test3 -d /test3 //创建test3并设置它的家目录为 /test3
[root@redhat /]# finger test3
Login: test3 Name: (null)
Directory: /test3 Shell: /bin/bash
Never logged in.
[root@redhat root]# useradd -r lucy_sys //创建一个名为lucy_sys的系统用户
[root@redhat root]# cat /etc/passwd
…………
luowei:x:500:500:this is luowei's username:/home/luowei:/bin/bash
test1:x:504:501::/home/tst1:/bin/csh
tom:x:505:505::/home/tom:/bin/bash
jack:x:506:501::/home/jack:/bin/bash
jim:x:600:501::/home/jim:/bin/bash
test2:x:602:602::/home/test2:/bin/bash
test3:x:603:603::/test3:/bin/bash
lucy_sys:x:100:101::/home/lucy_sys:/bin/bash
[root@redhat root]# groupadd -r lucygp_sys //创建系统群组