linux文章迁移之一

本文详细介绍了Linux系统中的passwd文件及其用户管理,错误处理机制,包括标准输出和标准错误的重定向,以及环境变量的配置文件。此外,讲解了shell编程中的for、while、until循环结构,并展示了logger命令的使用方法,用于向系统日志写入信息。最后,讨论了sudo命令的使用,包括权限配置和安全性。通过实例解析,帮助读者深入理解Linux系统管理和Shell编程。
摘要由CSDN通过智能技术生成

一、passwd文件

x:表示有密码

用户id0:超级管理员,要想让某个用户像root一样,就需要改为0   1-499:伪用户  500以上:普通用户

初始组(创建用户的时候就创建了一个和用户名一样的组名)id[跟group文件匹配]  ,另有附加组的概念

禁止某人登录,改为/sbin/nologin

每个用户的邮箱:/var/spool/mail/user1

每次加新用户时在其家目录下生成的文件:/etc/skel

二、linux中错误处理1和2

描述设备文件名描述符
标准输出屏幕控制台1
标准错误/dev/stderr2

说明与举例:

例子一        

        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来配置这些环境变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值