一、passwd文件
x:表示有密码
用户id0:超级管理员,要想让某个用户像root一样,就需要改为0 1-499:伪用户 500以上:普通用户
初始组(创建用户的时候就创建了一个和用户名一样的组名)id[跟group文件匹配] ,另有附加组的概念
禁止某人登录,改为/sbin/nologin
每个用户的邮箱:/var/spool/mail/user1
每次加新用户时在其家目录下生成的文件:/etc/skel
二、linux中错误处理1和2
描述 | 设备文件名 | 描述符 |
标准输出 | 屏幕控制台 | 1 |
标准错误 | /dev/stderr | 2 |
说明与举例:
例子一
l3s 2>[>] z :如果l3s(本来是ls列出文件命令,你在l与s之间加了个3,自然没有这个命令,就会报错)执行出错,就把出错信息写入z文件,否则不写,注意2和>之间没空格。
把1和2级别的信息输出到同个文件(即完成ls >>z 并且 l3s 2>>z都输出结果到某个文件z):
例子二
ls >[>]z 2>&1 #把错误先保存到标准中,再把标准输出的z文件中
或者
ls &>[>]z #把1和2级别的信息输出到z ,比如ls &>/dev/null
或者
ls >>z 2>>y
解释:
/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt,如果123有内容,则覆盖,>>则表示附加到指定文件
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
1>/dev/null
解释:首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1
解释:标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
2>&1写在后面的原因
正确的格式:command > file 2>&1 == command 1> file 2>&1
原因:首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
错误的格式: command 2>&1 >file
原因:2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是输出到终端。当 >file 后,标准输出才被重定向到file,但标准错误仍然保留了先前的设置,即保持输出到终端。
三、linux中的变量类型以及与变量有关的配置文件
set命令可以看到自定义变量以及环境变量
linux中有四种变量:
①、用户自定义变量:如上面的a
②、环境变量:系统环境变量和用户自定义环境变量
用户自定义环境变量:export 变量=变量值,对父和子(如bash exit)shell都起作用
系统环境变量:如PS1、PATH
PS1='[\u@\t \#]\$'
[root@0:30 第30个命令]#
③、位置参数变量:$n $* $@ $#
④、预定义变量:
如1.ls3 2.echo $? :非零数
&:find /root -name "helelo.sh" & :表示在后台运行
$!:s输出上一个后台进程id号。
变量的运算:
aa=11 bb=22 cc=$(($aa+$bb)) echo $cc :33 dd=$[$aa+$bb] echo $dd :33
环境变量的配置五类文件:
/etc/profile #如配置PATH /etc/profile.d/*.sh ~/.bash_profile ~/.bashrc /etc/bashrc #如配置PS1
注销时调用的配置文件:
~/.bash_logout
本机登录前信息:
/etc/issue # \r :内核版本
远程登录前信息:
/etc/issue.net的是否生效由/etc/ssh/sshd_config是否加入Banner /etc/issue.net来决定
登录后信息的决定:
/etc/motd
四、shell编程之三种循环结构for、while、until
这次来看看shell编程常用的三种循环结构for、while、until的使用案例。
一、for循环(靠空格或换行判断):
for i in moring nonn afternoon eving do echo "this is $i" done
再看一个for循环的例子
vi fordemo.sh:
cd /lamp ls *.tar.gz > lamp.log for i in $(cat lamp.log) do tar -zxf $i &>/dev/null done
除了与in结合的写法,for还有第二种语法,这种语法与java里面的for循环很相似,举个例子如下:
for((i=2;i<100;i=i+1)) do echo $i done
二、while语法
while [ 条件判断 ] do 程序 done
三、until语法(和while相反)
until [条件判断] do 程序 done
如:
i=1 s=0 until [ $i gt 100 ] do $s=$(( $s+$i )) $i=$i+1 done echo $s #执行结果:5050
五、logger命令
logger是一个shell命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。默认的日志保存在 /var/log/messages中。syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/rsyslog.conf 文件.
格式:logger [options] [messages]
常用options:
-d, --udp 使用数据报(UDP)而不是使用默认的流连接(TCP) -i, --id 逐行记录每一次logger的进程ID -f, --file file_name 记录特定的文件 -h, --help 显示帮助文本并退出 -n, --server 写入指定的远程syslog服务器,使用UDP代替内装式syslog的例程 -P, --port port_num 使用指定的UDP端口。默认的端口号是514 -p, --priority priority_level 指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式。 -s, --stderr 输出标准错误到系统日志。 -t, --tag tag 指定标记,指定后每行记录都会加上自己指定的标记 -u, --socket socket 写入指定的socket,而不是到内置系统日志例程。 -V, --version 现实版本信息并退出
举例:
写入一行信息并读取,默认写入到 /var/log/messages文件中。
[root@node113 ~]#logger test 写入信息 [root@node113 ~]#tail -n 1 /var/log/messages Jun 4 04:06:50 node113 root: test 写入信息
通过-t指定日志标记:
[root@node113 ~]#logger -t 乐之者java系统 test 写入信息 [root@node113 ~]#tail -n 1 /var/log/messages Jun 4 04:10:04 node113 乐之者java系统: test 写入信息
六、sudo
为了linux系统的安全,我们一般不能直接使用root用户进行日常维护,那么问题来了,使用普通用户有时候想做某个操作却没有权限怎么破?sudo就是用来临时提升普通用户权限的命令,有时执行一些命令或者更新没权限的文件时需要使用root,这个时候就需要sudo上场了
普通用户是没有sudo使用权的,需要root管理员添加才行,添加需要用到visudo命令。
sudo格式:
sudo 选项 参数
sudo常用的选项:
-b:在后台执行指令;
-h:显示帮助;
-H:将HOME环境变量设为新身份的HOME环境变量;
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s<shell>:执行指定的shell;
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-v:延长密码有效期限5分钟;
-V :显示版本信息。
参数:
指令:需要运行的指令和对应的参数。
执行命令visudo,其实是编辑的/etc/sudoers这个文件,两者效果是一样的。/etc/sudoers文件中有这么一句:
root ALL=(ALL) ALL
什么意思呢?
第一个ALL:指网络中的主机
第二个ALL:指目标用户,也就是以谁的身份去执行命令
第三个ALL:指命令名,可以执行所有命令
例:让zhao用户在本地主机上以admin的身份执行kill命令,需要在/etc/sudoers中作如下配置
zhao localhost=(admin) /bin/kill
如果多个用户可以使用组功能,%代表这个是组,NOPASSWD是免输入密码
%wheel ALL=(ALL) NOPASSWD: ALL usermod -a -G wheel jspear #添加用户zhao到组wheel
添加到wheel组的用户都能够利用root身份进行任何操作,可以自定义限制用户执行的指令
[root@localhost ~]# visudo
zhao ALL=(root) /usr/bin/passwd #命令需要使用绝对路径
配置sudo必须通过编辑/etc/sudoers
文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。
出现的错误,就像:
>>> sudoers file: syntax error, line 22 <<
此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。
现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户Foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件,可以看到类似下面几行:
# Runas alias specification # User privilege specificationroot ALL=(ALL)ALL
我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白):
foobar ALL=(ALL) ALL
保存退出后,切换到foobar用户,我们用它的身份执行命令:
[foobar@localhost ~]$ ls /rootls: /root: 权限不够[foobar@localhost ~]$ sudo ls /rootPassWord: anaconda-ks.cfg Desktop install.log install.log.syslog
好了,我们限制一下foobar的权利,不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig,把那一行改为:
foobar localhost= /sbin/ifconfig, /bin/ls
再来执行命令:
[foobar@localhost ~]$ sudo head -5 /etc/shadowPassword: Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.[foobar@localhost ~]$ sudo /sbin/ifconfigeth0 Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...
现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:
foobar linux=(jimmy,rene) /bin/kill
但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo -u
了,它正是用在这种时候。 foobar可以使用sudo -u jimmy kill PID
或者sudo -u rene kill PID
,但这样挺麻烦,其实我们可以不必每次加-u
,把rene或jimmy设为默认的目标用户即可。再在上面加一行:
Defaults:foobar runas_default=rene
Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:
Defaults env_reset
另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:
foobar localhost=NOPASSWD: /bin/cat, /bin/ls
再来sudo一下:
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.loginstall.log.syslog
当然,你也可以说“某些命令用户foobar不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。
日志与安全
sudo为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。这样来做:
touch /var/log/sudo vi /etc/syslog.conf
在syslog.conf最后面加一行(必须用tab分割开)并保存:
local2.debug /var/log/sudo
重启日志守候进程,
ps aux grep syslogd
把得到的syslogd进程的PID(输出的第二列是PID)填入下面:
kill –HUP PID
这样,sudo就可以写日志了:
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfgDesktop install.log install.log.syslog $cat /var/log/sudoJul 28 22:52:54 localhost sudo: foobar : TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root
不过,有一个小小的“缺陷”,sudo记录日志并不是很忠实:
[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/nullcat /var/log/sudo...Jul 28 23:10:24 localhost sudo: foobar : TTY=pts/1 ; PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow
重定向没有被记录在案!为什么?因为在命令运行之前,shell把重定向的工作做完了,sudo根本就没看到重定向。这也有个好处,下面的手段不会得逞:
[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够
sudo 有自己的方式来保护安全。以root的身份执行sudo-V
,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。