• Linux命令


    一、系统管理

    1.系统安全

    1.1 syslog :系统默认的日志守护进程

    syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。

    几乎所有的网络设备都可以通过syslog协议,将日志信息以用户数据报协议(UDP)方式传送到远端服务器,远端接收日志服务器必须通过syslogd监听UDP 端口514,并根据 syslog.conf配置文件中的配置处理本机,接收访问系统的日志信息,把指定的事件写入特定文件中,供后台数据库管理和响应之用。意味着可以让任何事件都登录到一台或多台服务器上,以备后台数据库用off-line(离线) 方法分析远端设备的事件。

    通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。

    使用方法

    在/var/log中创建并写入日志信息是由syslog协议处理的,是由守护进程sylogd负责执行。每个标准的进程都可以用syslog记录日志。可以使用logger命令通过syslogd记录日志。

    要向syslog文件/var/log/messages中记录日志信息:

    logger this is a test log line
    
    输出:
    tail -n 1 messages
    Jan  5 10:07:03 localhost root: this is a test log line
    

    如果要记录特定的标记(tag)可以使用:

    logger -t TAG this is a test log line
    
    输出:
    tail -n 1 messages
    Jan  5 10:37:14 localhost TAG: this is a test log line

    1.2 OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。在OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL的开源软件包。由于这是互联网应用最广泛的安全传输方法,被网银、在线支付、电商网站、门户网站、电子邮件等重要网站广泛使用,所以该漏洞影响范围广大。

    OpenSSL有两种运行模式:交互模式和批处理模式。

    直接输入openssl回车进入交互模式,输入带命令选项的openssl进入批处理模式。

    OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。 

    对称加密算法

    OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。 

    非对称加密算法

    OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。 

    信息摘要算法

    OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。 

    密钥和证书管理

    密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。 

    首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。 

    在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。 

    事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。

    实例

    1、消息摘要算法应用例子

    用SHA1算法计算文件file.txt的哈西值,输出到stdout:

    # openssl dgst -sha1 file.txt

    用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt:

    # openssl sha1 -out digest.txt file.txt

    用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin。签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中。

    # openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

    用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem。

    # openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

    用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem。

    # openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

    # 用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。

    # openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

    2、对称加密应用例子

    对称加密应用例子,用DES3算法的CBC模式加密文件plaintext.doc,加密结果输出到文件ciphertext.bin。

    # openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

    用DES3算法的OFB模式解密文件ciphertext.bin,提供的口令为trousers,输出到文件plaintext.doc。注意:因为模式不同,该命令不能对以上的文件进行解密。

    # openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

    用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取,输出到文件ciphertext.bin。

    # openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD

    给文件ciphertext.bin用base64编码,输出到文件base64.txt。

    # openssl base64 -in ciphertext.bin -out base64.txt

    用RC5算法的CBC模式加密文件plaintext.doc,输出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定。

    # openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

    3、Diffie-Hellman应用例子

    使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数,输出保存到文件dhparam.pem

    # openssl dhparam -out dhparam.pem -2 1024

    从dhparam.pem中读取Diffie-Hell参数,以C代码的形式,输出到stdout。

    # openssl dhparam -in dhparam.pem -noout -C

    4、DSA应用例子应用例子

    生成1024位DSA参数集,并输出到文件dsaparam.pem。

    # openssl dsaparam -out dsaparam.pem 1024

    使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem

    # openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

    使用私钥匙dsaprivatekey.pem生成公钥匙,输出到dsapublickey.pem

    # openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

    从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,然后写回文件dsaprivatekey.pem

    # openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

    5、RSA应用例子

    产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem

    # openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

    从文件rsaprivatekey.pem读取私匙,用口令trousers解密,生成的公钥匙输出到文件rsapublickey.pem

    # openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

    用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt

    # openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

    使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt

    # openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

    用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin

    # openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

    用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.txt

    # openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

    从X.509证书文件cert.pem中获取公钥匙,用3DES加密mail.txt,输出到文件mail.enc

    # openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

    从X.509证书文件cert.pem中获取接收人的公钥匙,用私钥匙key.pem解密S/MIME消息mail.enc,结果输出到文件mail.txt

    # openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

    cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包含在S/MIME消息中,输出到文件mail.sgn

    # openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

    验证S/MIME消息mail.sgn,输出到文件mail.txt,签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中

    # openssl smime -verify -in mail.sgn -out mail.txt
     

    1.3

    logwatch命令是一个可定制和可插入式的日志监视系统,它通过遍历给定时间范围内的系统日志文件而产生日志报告。logwatch默认每天执行一次,可以从/etc/cron.daily里看到。

    语法

    logwatch(选项)

    选项

    --detail<报告详细程度>:指定日志报告的详细程度;
    --logfile<日志文件>:仅处理指定的日志文件;
    --service<服务名>:仅处理指定服务的日志文件;
    --print:打印结果到标准输出;
    --mailto<邮件地址>:将结果发送到指定邮箱;
    --range<日期范围>:指定处理日志的日期范围;
    --archives:处理归档日志文件;
    --debug<调试等级>:调试模式;
    --save<文件名>:将结果保存到指定文件中,而不显示或者发送到指定邮箱;
    --logdir<目录>:指定查找日志文件的目录,而不使用默认的日志目录;
    --hostname<主机名>:指定在日志报告中使用的主机名,不使用系统默认的主机名;
    --numeric:在报告中显示ip地址而不是主机名;
    --help:显示指令的帮助信息。

    实例

    检查你的主机上是否已经存在Logwatch(Redhat默认已经安装了Logwatch,不过版本比较旧):

    rpm -qa logwatch

    如果主机上没有logwatch,则执行:

    rpm -Ivh logwatch***.rpm

    如果有老版本的logwatch,则执行:

    rpm -Uvh logwatch***.rpm

    安装完毕后,开始配置:

    可以修改和添加它的logfiles、services和其他配置,但默认已经有很多脚本了,只要在1)里设置Detail = High就可以了。

    • 可以添加新的配置到/etc/logwatch/conf/logwatch.conf
    • 也可以修改/usr/share/logwatch/default.conf/logwatch.conf

    /etc/logwatch/conf/会自动覆盖/usr/share/logwatch/default.conf/下的同名文件。

    如果没有设置logwatch.conf也没关系,可以直接在命令行下设置。

    logwatch --detail High --Service All --range All --print    基本就可以显示出所有日志的情况了
    logwatch --service sshd --detail High                       只看sshd的日志情况

    1.4

    lastb命令用于显示用户错误的登录列表,此指令可以发现系统的登录异常。单独执行lastb命令,它会读取位于/var/log目录下,名称为btmp的文件,并把该文件内容记录的登入失败的用户名单,全部显示出来。

    语法

    lastb(选项)(参数)

    选项

    -a:把从何处登入系统的主机名称或ip地址显示在最后一行;
    -d:将IP地址转换成主机名称;
    -f<记录文件>:指定记录文件;
    -n<显示列数>或-<显示列数>:设置列出名单的显示列数;
    -R:不显示登入系统的主机名称或IP地址;
    -x:显示系统关机,重新开机,以及执行等级的改变等信息。

    参数

    • 用户名:显示中的用户的登录列表;
    • 终端:显示从指定终端的登录列表。

    实例

    首次运行lastb命令会报下的错误:

    lastb: /var/log/btmp: No such file or directory
    Perhaps this file was removed by the operator to prevent logging lastb info.

    只需建立这个不存在的文件即可。

    touch /var/log/btmp

    使用ssh的登录失败不会记录在btmp文件中。

    lastb | head
    root     ssh:notty    110.84.129.3     Tue Dec 17 06:19 - 06:19  (00:00)
    root     ssh:notty    110.84.129.3     Tue Dec 17 04:05 - 04:05  (00:00)
    root     ssh:notty    110.84.129.3     Tue Dec 17 01:52 - 01:52  (00:00)
    root     ssh:notty    110.84.129.3     Mon Dec 16 23:38 - 23:38  (00:00)
    leonob   ssh:notty    222.211.85.18    Mon Dec 16 22:18 - 22:18  (00:00)
    leonob   ssh:notty    222.211.85.18    Mon Dec 16 22:18 - 22:18  (00:00)
    root     ssh:notty    110.84.129.3     Mon Dec 16 21:25 - 21:25  (00:00)
    root     ssh:notty    110.84.129.3     Mon Dec 16 19:12 - 19:12  (00:00)
    root     ssh:notty    110.84.129.3     Mon Dec 16 17:00 - 17:00  (00:00)
    admin    ssh:notty    129.171.193.99   Mon Dec 16 16:52 - 16:52  (00:00)

    1.5

    sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

    语法

    sudo(选项)(参数)

    选项

    -b:在后台执行指令;
    -h:显示帮助;
    -H:将HOME环境变量设为新身份的HOME环境变量;
    -k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
    -l:列出目前用户可执行与无法执行的指令;
    -p:改变询问密码的提示符号;
    -s<shell>:执行指定的shell;
    -u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
    -v:延长密码有效期限5分钟;
    -V :显示版本信息。

    参数

    指令:需要运行的指令和对应的参数。

    实例

    配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。

    visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。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 /root
    ls: /root: 权限不够
    
    [foobar@localhost ~]$ sudo ls /root
    PassWord:
    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/shadow
    Password:
    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.log
    install.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.cfg
    Desktop 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/null
    cat /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来配置这些环境变量。

    1.6

    lastlog命令用于显示系统中所有用户最近一次登录信息。

    lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**。注意需要以root身份运行该命令。

    语法

    lastlog(选项)

    选项

    -b<天数>:显示指定天数前的登录信息;
    -h:显示召集令的帮助信息;
    -t<天数>:显示指定天数以来的登录信息;
    -u<用户名>:显示指定用户的最近登录信息。

    实例

    lastlog
    Username         Port     From             Latest
    root             pts/0    221.6.45.34      Tue Dec 17 09:40:48 +0800 2013
    bin                                        **Never logged in**
    daemon                                     **Never logged in**
    adm                                        **Never logged in**
    lp                                         **Never logged in**
    sync                                       **Never logged in**
    shutdown                                   **Never logged in**
    halt                                       **Never logged in**
    mail                                       **Never logged in**
    news                                       **Never logged in**
    uucp                                       **Never logged in**
    operator                                   **Never logged in**
    games                                      **Never logged in**
    gopher                                     **Never logged in**
    ftp                                        **Never logged in**
    nobody                                     **Never logged in**
    vcsa                                       **Never logged in**
    ntp                                        **Never logged in**
    sshd                                       **Never logged in**
    nscd                                       **Never logged in**
    ldap                                       **Never logged in**
    postfix                                    **Never logged in**
    www                                        **Never logged in**
    mysql                                      **Never logged in**

    1.7

    logrotate命令用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用logrotate指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中。

    语法

    logrotate(选项)(参数)

    选项

    -?或--help:在线帮助;
    -d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况;
    -f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然;
    -s<状态文件>或--state=<状态文件>:使用指定的状态文件;
    -v或--version:显示指令执行过程;
    -usage:显示指令基本用法。

    参数

    配置文件:指定lograote指令的配置文件。

    1.8

    chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。

    在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:

    增加了系统的安全性,限制了用户的权力:

    在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。

    建立一个与原系统隔离的系统目录结构,方便用户的开发:

    使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。

    切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:

    chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。

    语法

    chroot(选项)(参数)

    选项

    --help:在线帮助;
    --version:显示版本信息。

    参数

    • 目录:指定新的根目录;
    • 指令:指定要执行的指令。

    实例

    将target作为根目录(运行其中的/bin/sh):

    chroot target /bin/sh

    这里,target是busybox安装好的路径,类似一个文件系统包含了许多工具。这样,将会进入一个shell界面,这个shell以target为根。运行exit退出该shell又返回原来的本机环境了,也可以使用Ctrl+D。

    注意:

    • 根用户才行
    • 如果直接chroot target默认寻找target的/bin/bash.这会以target作为根目录

    将target作为根目录(运行其中的/bin/ls):

    chroot target /bin/ls

    这里,target是busybox安装好的路径,类似一个文件系统包含了许多工具。这样运行的是target中的ls(不是本机的/bin/ls),然后返回立即本机的目录环境。

    注意,自己在本地编译一个程序生成a.out之后,拷进target/bin/中这样运行却不行,因为它包含了动态连接的库,需要用ldd查看a.out需要那些动态库,将这些库拷贝到新根的对应路径下才能执行。

    用chroot运行自己编译的一个程序:

    准备chroot的根目录:

    mkdir newRoot

    编译自己的程序:

    gcc main.c

    这里main.c生成a.out,功能是输出hello。

    查看程序需要的库:

    ldd a.out

    输入之后,输出如下:

    linux-gate.so.1 = &gt;  (0xb8034000)
    libc.so.6 = &gt; /lib/tls/i686/cmov/libc.so.6 (0xb7eab000)
    /lib/ld-linux.so.2 (0xb801a000)

    将程序需要的库和程序拷贝到新根目录下:

    cp a.out newRoot
    mkdir newRoot/lib
    cp /lib/tls/i686/cmov/libc.so.6 newRoot/lib
    cp /lib/ld-linux.so.2 newRoot/lib

    这里newRoot内容将如下:

    a.out lib/

    使用chroot运行自己的程序:

    su
    chroot newRoot /a.out

    这样就能够正确运行a.out了,因为a.out使用到了其他的动态连接库,所以需要将库拷贝到newRoot中,如果没有其他库那么直接拷贝a.out就能运行。例如静态编译后的busybox,其安装目录中的/bin/busybox就没有依赖其他库。

    1.9

    logsave命令运行给定的命令,并将命令的输出信息保存到指定的日志文件中。

    语法

    logsave(选项)(参数)

    选项

    -a:追加信息到指定的日志文件中。

    参数

    • 日志文件:指定记录运行信息的日志文件;
    • 指令:需要执行的指令。

    1.10

    last命令用于显示用户最近登录信息。单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。

    语法

    last(选项)(参数)

    选项

    -a:把从何处登入系统的主机名称或ip地址,显示在最后一行;
    -d:将IP地址转换成主机名称;
    -f <记录文件>:指定记录文件。
    -n <显示列数>或-<显示列数>:设置列出名单的显示列数;
    -R:不显示登入系统的主机名称或IP地址;
    -x:显示系统关机,重新开机,以及执行等级的改变等信息。

    参数

    • 用户名:显示用户登录列表;
    • 终端:显示从指定终端的登录列表。

    实例

    last命令用了显示用户登录情况,以下是直接显示固定行数的记录:

    last -10
    root     pts/0        221.6.45.34      Tue Dec 17 09:40   still logged in
    root     pts/0        221.6.45.34      Mon Dec 16 09:00 - 11:57  (02:56)
    root     pts/0        222.94.97.122    Sun Dec 15 20:39 - 23:28  (02:48)
    root     pts/0        222.95.209.80    Sat Dec 14 14:39 - 14:58  (00:18)
    root     pts/0        221.6.45.34      Thu Dec 12 16:55 - 17:37  (00:41)
    root     pts/0        49.65.139.195    Wed Dec 11 20:40 - 21:16  (00:35)
    root     pts/0        49.65.139.195    Wed Dec 11 19:46 - 20:03  (00:17)
    root     pts/0        221.6.45.34      Tue Dec 10 14:41 - 15:52  (01:10)
    root     pts/0        221.6.45.34      Mon Dec  9 17:24 - 17:30  (00:06)
    root     pts/0        221.6.45.34      Mon Dec  9 09:38 - 11:41  (02:02)

    2.进程和作业管理

    2.1

    ipcrm命令用来删除一个或更多的消息队列、信号量集或者共享内存标识。

    语法

    ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]

    选项

    -m SharedMemory id 删除共享内存标识 SharedMemoryID。与 SharedMemoryID 有关联的共享内存段以及数据结构都会在最后一次拆离操作后删除。
    -M SharedMemoryKey 删除用关键字 SharedMemoryKey 创建的共享内存标识。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
    -q MessageID 删除消息队列标识 MessageID 和与其相关的消息队列和数据结构。
    -Q MessageKey 删除由关键字 MessageKey 创建的消息队列标识和与其相关的消息队列和数据结构。
    -s SemaphoreID 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。
    -S SemaphoreKey 删除由关键字 SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。

    msgctl、shmctl 和 semctl 子例程提供了删除操作的细节。标识和关键字可以用 ipcs 命令找到。

    示例

    如果要删除和 SharedMemoryID 18602 相关的共享内存段,请输入:

    ipcrm -m 18602

    2.2

    systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。

    任务 旧指令 新指令
    使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service
    使某服务不自动启动 chkconfig --level 3 httpd off systemctl disable httpd.service
    检查服务状态 service httpd status systemctl status httpd.service (服务详细信息) systemctl is-active httpd.service (仅显示是否 Active)
    显示所有已启动的服务 chkconfig --list systemctl list-units --type=service
    启动某服务 service httpd start systemctl start httpd.service
    停止某服务 service httpd stop systemctl stop httpd.service
    重启某服务 service httpd restart systemctl restart httpd.service

    实例

    1.启动nfs服务

    systemctl start nfs-server.service

    2.设置开机自启动

    systemctl enable nfs-server.service

    3.停止开机自启动

    systemctl disable nfs-server.service

    4.查看服务当前状态

    systemctl status nfs-server.service

    5.重新启动某服务

    systemctl restart nfs-server.service

    6.查看所有已启动的服务

    systemctl list -units --type=service

    开启防火墙22端口

    iptables -I INPUT -p tcp --dport 22 -j accept

    如果仍然有问题,就可能是SELinux导致的

    关闭SElinux:

    修改/etc/selinux/config文件中的SELINUX=””为disabled,然后重启。

    彻底关闭防火墙:

    sudo systemctl status firewalld.service
    sudo systemctl stop firewalld.service          
    sudo systemctl disable firewalld.service
     

    2.3

    w命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令。执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序。单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。

    语法

    w(选项)(参数)

    选项

    -h:不打印头信息;
    -u:当显示当前进程和cpu时间时忽略用户名;
    -s:使用短输出格式;
    -f:显示用户从哪登录;
    -V:显示版本信息。

    参数

    用户:仅显示指定用户。

    实例

    w
     20:39:37 up 136 days,  3:58,  1 user,  load average: 0.00, 0.00, 0.00
    USER     TTY      FROM              login@   IDLE   JCPU   PCPU WHAT
    root     pts/0    222.94.97.122    20:39    1.00s  0.00s  0.00s w

    2.4

    watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示。watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。

    语法

    watch(选项)(参数)

    选项

    -n:指定指令执行的间隔时间(秒);
    -d:高亮显示指令输出信息不同之处;
    -t:不显示标题。

    参数

    指令:需要周期性执行的指令。

    实例

    #watch uptime
    #watch -t uptime
    #watch -d -n 1 netstat -ntlp
    #watch -d 'ls -l | fgrep goface'     //监测goface的文件
    #watch -t -differences=cumulative uptime
    #watch -n 60 from            //监控mail
    #watch -n 1 "df -i;df"       //监测磁盘inode和block数目变化情况

    FreeBSD和Linux下watch命令的不同,在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果,如:watch -n 1 -d netstat -ant,而在FreeBSD下的watch命令是查看其它用户的正在运行的操作,watch允许你偷看其它terminal正在做什么,该命令只能让超级用户使用。

     

    2.5

    pidof命令用于查找指定名称的进程的进程号id号。

    语法

    pidof(选项)(参数)

    选项

    -s:仅返回一个进程号;
    -c:仅显示具有相同“root”目录的进程;
    -x:显示由脚本开启的进程;
    -o:指定不显示的进程ID。

    参数

    进程名称:指定要查找的进程名称。

    实例

    pidof nginx
    13312 5371
    
    pidof crond
    1509
    
    pidof init
    1

    2.6

    skill命令用于向选定的进程发送信号,冻结进程。这个命令初学者并不常用,深入之后牵涉到系统服务优化之后可能会用到。

    语法

    skill(选项)

    选项

    -f:快速模式;
    -i:交互模式,每一步操作都需要确认;
    -v:冗余模式;
    -w:激活模式;
    -V:显示版本号;
    -t:指定开启进程的终端号;
    -u:指定开启进程的用户;
    -p:指定进程的id号;
    -c:指定开启进程的指令名称。

    实例

    如果您发现了一个占用大量CPU和内存的进程,但又不想停止它,该怎么办?考虑下面的top命令输出:

    top -c -p 16514
    23:00:44  up 12 days,  2:04,  4 users,  load average: 0.47, 0.35, 0.31
    1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
    CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
               total    0.0%    0.6%    8.7%   2.2%     0.0%   88.3%    0.0%
    Mem:  1026912k av, 1010476k used,   16436k free,       0k shrd,   52128k buff
                        766724k actv,  143128k in_d,   14264k in_c
    Swap: 2041192k av,   83160k used, 1958032k free                  799432k cached
     
      PID USER     PRI  NI  SIZE  RSS SHARE stat %CPU %MEM   time CPU command
    16514 oracle    19   4 28796  26M 20252 D N   7.0  2.5   0:03   0 oraclePRODB2...

    既然您确认进程16514占用了大量内存,您就可以使用skill命令“冻结”它,而不是停止它。

    skill -STOP 1

    之后,检查top输出:

    23:01:11  up 12 days,  2:05,  4 users,  load average: 1.20, 0.54, 0.38
    1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped
    CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
               total    2.3%    0.0%    0.3%   0.0%     0.0%    2.3%   94.8%
    Mem:  1026912k av, 1008756k used,   18156k free,       0k shrd,    3976k buff
                        770024k actv,  143496k in_d,   12876k in_c
    Swap: 2041192k av,   83152k used, 1958040k free                  851200k cached
     
      PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
    16514 oracle    19   4 28796  26M 20252 T N   0.0  2.5   0:04   0 oraclePRODB2...

    现在,CPU 从 0% 空闲变为 94% 空闲。该进程被有效冻结。过一段时间之后,您可能希望唤醒该进程:

    skill -CONT 16514

    如果希望暂时冻结进程以便为完成更重要的进程腾出空间,该方法非常有用。

    此命令用途很广。如果您要停止 "oracle" 用户的所有进程,只需要一个命令即可实现:

    skill -STOP oracle

    可以使用用户、PID、命令或终端 id 作为参数。以下命令可停止所有 rman 命令。

    skill -STOP rman

    如您所见,skill 决定您输入的参数(进程 ID、用户 ID 或命令)并进行相应操作。这可能会导致在某些情况下出现这样的问题:您可能具有同名的用户和命令。最好的示例是 "oracle" 进程,通常由用户 "oracle" 运行。因此,当您希望停止名为 "oracle" 的进程时,可执行以下命令:

    skill -STOP oracle

    用户 "oracle" 的所有进程都停止,包括您可能要使用的会话。要非常明确地执行命令,您可以选择使用一个新参数指定参数的类型。要停止一个名为 oracle 的命令,可执行以下命令:

    skill -STOP -c oracle

    snice命令的功能与skill类似。但它用于降低进程的优先级,而不是停止进程。首先,检查 top 输出:

      PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
        3 root      15   0     0    0     0 RW    0.0  0.0   0:00   0 kapmd
    13680 oracle    15   0 11336  10M  8820 T     0.0  1.0   0:00   0 oracle
    13683 oracle    15   0  9972 9608  7788 T     0.0  0.9   0:00   0 oracle
    13686 oracle    15   0  9860 9496  7676 T     0.0  0.9   0:00   0 oracle
    13689 oracle    15   0 10004 9640  7820 T     0.0  0.9   0:00   0 oracle
    13695 oracle    15   0  9984 9620  7800 T     0.0  0.9   0:00   0 oracle
    13698 oracle    15   0 10064 9700  7884 T     0.0  0.9   0:00   0 oracle
    13701 oracle    15   0 22204  21M 16940 T     0.0  2.1   0:00   0 oracle

    现在,将 "oracle" 进程的优先级降低四个点。注意,该值越高,优先级越低。

    snice +4 -u oracle
      PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
    16894 oracle    20   4 38904  32M 26248 D N   5.5  3.2   0:01   0 oracle

    注意,NI 列(nice 值)现在是 4,优先级现在设置为 20,而不是 15。这对于降低优先级非常有帮助。

     

    2.7

    pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。

    语法

    pgrep(选项)(参数)

    选项

    -o:仅显示找到的最小(起始)进程号;
    -n:仅显示找到的最大(结束)进程号;
    -l:显示进程名称;
    -P:指定父进程号;
    -g:指定进程组;
    -t:指定开启进程的终端;
    -u:指定进程的有效用户ID。

    参数

    进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。

    实例

    pgrep -lo httpd
    4557 httpd
    
    [root@localhost ~]# pgrep -ln httpd
    4566 httpd
    
    [root@localhost ~]# pgrep -l httpd
    4557 httpd
    4560 httpd
    4561 httpd
    4562 httpd
    4563 httpd
    4564 httpd
    4565 httpd
    4566 httpd
    
    [root@localhost ~]# pgrep httpd
    4557
    4560
    4561
    4562
    4563
    4564
    4565
    4566

    2.8

    renice命令可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。

    语法

    renice(选项)(参数)

    选项

    -g:指定进程组id;
    -p<程序识别码>:改变该程序的优先权等级,此参数为预设值。
    -u:指定开启进程的用户名。

    参数

    进程号:指定要修改优先级的进程。

    实例

    将行程id为987及32的行程与行程拥有者为daemon及root的优先序号码加1:

    renice 1 987 -u daemon root -p 32

    注意:每一个行程都有一个唯一的id。

    2.9

    nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。

    无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

    语法

    nohup(选项)(参数)

    选项

    --help:在线帮助;
    --version:显示版本信息。

    参数

    程序及选项:要运行的程序及选项。

    实例

    使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

    nohup command > myout.file 2>&1 &

    在上面的例子中,输出被重定向到myout.file文件中。

    2.10

    ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。

    语法

    ipcs(选项)

    选项

    -a:显示全部可显示的信息;
    -q:显示活动的消息队列信息;
    -m:显示活动的共享内存信息;
    -s:显示活动的信号量信息。

    实例

    ipcs -a
    ------ Shared Memory Segments --------
    key        shmid      owner      perms      bytes      nattch     status      
    0x7401833d 2654208    root      600        4          0                       
    0x00000000 3145729    root      600        4194304    9          dest         
    0x7401833c 2621442    root      600        4          0                       
    0xd201012b 3080195    root      600        1720       2

    2.11

    pmap命令用于报告进程的内存映射关系,是Linux调试及运维一个很好的工具。

    语法

    pmap(选项)(参数)

    选项

    -x:显示扩展格式;
    -d:显示设备格式;
    -q:不显示头尾行;
    -V:显示指定版本。

    参数

    进程号:指定需要显示内存映射关系的进程号,可以是多个进程号。

    实例

    pidof nginx
    13312 5371
    
    pmap -x 5371
    5371:   nginx: worker process                
    Address           Kbytes     RSS   Dirty Mode   Mapping
    0000000000400000     564     344       0 r-x--  nginx
    000000000068c000      68      68      60 rw---  nginx
    000000000069d000      56      12      12 rw---    [ anon ]
    000000000a0c8000    1812    1684    1684 rw---    [ anon ]
    0000003ac0a00000     112      40       0 r-x--  ld-2.5.so
    0000003ac0c1c000       4       4       4 r----  ld-2.5.so
    0000003ac0c1d000       4       4       4 rw---  ld-2.5.so
    0000003ac0e00000    1340     284       0 r-x--  libc-2.5.so
    0000003ac0f4f000    2044       0       0 -----  libc-2.5.so
    0000003ac114e000      16      16       8 r----  libc-2.5.so
    0000003ac1152000       4       4       4 rw---  libc-2.5.so
    0000003ac1153000      20      20      20 rw---    [ anon ]
    0000003ac1200000       8       4       0 r-x--  libdl-2.5.so
    0000003ac1202000    2048       0       0 -----  libdl-2.5.so
    0000003ac1402000       4       4       4 r----  libdl-2.5.so
    0000003ac1403000       4       4       4 rw---  libdl-2.5.so
    0000003ac1600000      84       0       0 r-x--  libselinux.so.1
    0000003ac1615000    2048       0       0 -----  libselinux.so.1
    0000003ac1815000       8       8       8 rw---  libselinux.so.1
    0000003ac1817000       4       4       4 rw---    [ anon ]
    0000003ac1a00000     236       0       0 r-x--  libsepol.so.1
    0000003ac1a3b000    2048       0       0 -----  libsepol.so.1
    0000003ac1c3b000       4       4       4 rw---  libsepol.so.1
    0000003ac1c3c000      40       0       0 rw---    [ anon ]
    0000003ac1e00000      88      44       0 r-x--  libpthread-2.5.so
    0000003ac1e16000    2048       0       0 -----  libpthread-2.5.so
    0000003ac2016000       4       4       4 r----  libpthread-2.5.so
    0000003ac2017000       4       4       4 rw---  libpthread-2.5.so
    0000003ac2018000      16       4       4 rw---    [ anon ]
    0000003ac2600000      80      52       0 r-x--  libz.so.1.2.3
    0000003ac2614000    2044       0       0 -----  libz.so.1.2.3
    0000003ac2813000       4       4       4 rw---  libz.so.1.2.3
    0000003ac2a00000      36       4       0 r-x--  libcrypt-2.5.so
    0000003ac2a09000    2044       0       0 -----  libcrypt-2.5.so
    0000003ac2c08000       4       4       4 r----  libcrypt-2.5.so
    0000003ac2c09000       4       4       4 rw---  libcrypt-2.5.so
    0000003ac2c0a000     184       0       0 rw---    [ anon ]
    0000003ac3600000       8       0       0 r-x--  libkeyutils-1.2.so
    0000003ac3602000    2044       0       0 -----  libkeyutils-1.2.so
    0000003ac3801000       4       4       4 rw---  libkeyutils-1.2.so
    0000003ac3a00000      68       0       0 r-x--  libresolv-2.5.so
    0000003ac3a11000    2048       0       0 -----  libresolv-2.5.so
    0000003ac3c11000       4       4       4 r----  libresolv-2.5.so
    0000003ac3c12000       4       4       4 rw---  libresolv-2.5.so
    0000003ac3c13000       8       0       0 rw---    [ anon ]
    0000003ac3e00000       8       0       0 r-x--  libcom_err.so.2.1
    0000003ac3e02000    2044       0       0 -----  libcom_err.so.2.1
    0000003ac4001000       4       4       4 rw---  libcom_err.so.2.1
    0000003ac4200000    1204       8       0 r-x--  libcrypto.so.0.9.8e
    0000003ac432d000    2044       0       0 -----  libcrypto.so.0.9.8e
    0000003ac452c000     132      88      12 rw---  libcrypto.so.0.9.8e
    0000003ac454d000      16      12      12 rw---    [ anon ]
    0000003ac4600000     176       0       0 r-x--  libgssapi_krb5.so.2.2
    0000003ac462c000    2048       0       0 -----  libgssapi_krb5.so.2.2
    0000003ac482c000       8       8       8 rw---  libgssapi_krb5.so.2.2
    0000003ac4a00000     144       0       0 r-x--  libk5crypto.so.3.1
    0000003ac4a24000    2044       0       0 -----  libk5crypto.so.3.1
    0000003ac4c23000       8       8       8 rw---  libk5crypto.so.3.1
    0000003ac4e00000      32       0       0 r-x--  libkrb5support.so.0.1
    0000003ac4e08000    2044       0       0 -----  libkrb5support.so.0.1
    0000003ac5007000       4       4       4 rw---  libkrb5support.so.0.1
    0000003ac5200000     580       0       0 r-x--  libkrb5.so.3.3
    0000003ac5291000    2048       0       0 -----  libkrb5.so.3.3
    0000003ac5491000      16      16      12 rw---  libkrb5.so.3.3
    0000003ac5a00000     288       4       0 r-x--  libssl.so.0.9.8e
    0000003ac5a48000    2048       0       0 -----  libssl.so.0.9.8e
    0000003ac5c48000      24      16      12 rw---  libssl.so.0.9.8e
    00002b5751808000       8       8       8 rw---    [ anon ]
    00002b5751810000     108      36       0 r-x--  libpcre.so.1.2.0
    00002b575182b000    2044       0       0 -----  libpcre.so.1.2.0
    00002b5751a2a000       4       4       4 rw---  libpcre.so.1.2.0
    00002b5751a2b000      28      28      28 rw---    [ anon ]
    00002b5751a32000      40      20       0 r-x--  libnss_files-2.5.so
    00002b5751a3c000    2044       0       0 -----  libnss_files-2.5.so
    00002b5751c3b000       4       4       4 r----  libnss_files-2.5.so
    00002b5751c3c000       4       4       4 rw---  libnss_files-2.5.so
    00002b5751c3d000       4       4       4 rw-s-  zero (deleted)
    00002b5751c3e000   20012   20000   20000 rw---    [ anon ]
    00007fffbf2ce000      84      20      20 rw---    [ stack ]
    00007fffbf35e000      12       0       0 r-x--    [ anon ]
    ffffffffff600000    8192       0       0 -----    [ anon ]
    ----------------  ------  ------  ------
    total kB           72880   22940   22000

    2.12

    nice命令用于以指定的进程调度优先级启动其他的程序。

    语法

    nice(选项)(参数)

    选项

    -n:指定进程的优先级(整数)。

    参数

    指令及选项:需要运行的指令及其他选项。

    实例

    新建一个进程并设置优先级,将当前目录下的documents目录打包,但不希望tar占用太多CPU:

    nice -19 tar zcf pack.tar.gz documents

    方法非常简单,即在原命令前加上nice -19。很多人可能有疑问了,最低优先级不是19么?那是因为这个“-19”中的“-”仅表示参数前缀;所以,如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级:

    nice --19 tar zcf pack.tar.gz documents

    2.13

    service命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。

    语法

    service(选项)(参数)

    选项

    -h:显示帮助信息;
    --status-all:显示所服务的状态。

    参数

    • 服务名:自动要控制的服务名,即/etc/init.d目录下的脚本文件名;
    • 控制命令:系统服务脚本支持的控制命令。

    实例

    当修改了主机名、ip地址等信息时,经常需要把网络重启使之生效。

    service network status
    配置设备:
    lo eth0
    当前的活跃设备:
    lo eth0
    
    service network restart
    正在关闭接口 eth0:                                        [  确定  ]
    关闭环回接口:                                             [  确定  ]
    设置网络参数:                                             [  确定  ]
    弹出环回接口:                                             [  确定  ]
    弹出界面 eth0:                                            [  确定  ]

    重启mysql

    service mysqld status
    mysqld (pid 1638) 正在运行...
    
    service mysqld restart
    停止 MySQL:                                               [  确定  ]
    启动 MySQL:                                               [  确定  ]

    2.14

    pstree命令以树状图的方式展现进程之间的派生关系,显示效果比较直观。

    语法

    pstree(选项)

    选项

    -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;
    -c:不使用精简标示法;
    -G:使用VT100终端机的列绘图字符;
    -h:列出树状图时,特别标明现在执行的程序;
    -H<程序识别码>:此参数的效果和指定"-h"参数类似,但特别标明指定的程序;
    -l:采用长列格式显示树状图;
    -n:用程序识别码排序。预设是以程序名称来排序;
    -p:显示程序识别码;
    -u:显示用户名称;
    -U:使用UTF-8列绘图字符;
    -V:显示版本信息。

    实例

    显示当前所有进程的进程号和进程id

    pstree -p

    显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。

    pstree  -a
     

    2.15

    telint命令用于切换当前正在运行的Linux系统的运行等级。

    语法

    telint(选项)(参数)

    选项

    -t:指定等待的秒数。

    参数

    运行等级:指定要切换的运行等级。

     

    2.16

    killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。

    语法

    killall(选项)(参数)

    选项

    -e:对长名称进行精确匹配;
    -l:忽略大小写的不同;
    -p:杀死进程所属的进程组;
    -i:交互式杀死进程,杀死进程前需要进行确认;
    -l:打印所有已知信号列表;
    -q:如果没有进程被杀死。则不输出任何信息;
    -r:使用正规表达式匹配要杀死的进程名称;
    -s:用指定的进程号代替默认信号“SIGTERM”;
    -u:杀死指定用户的进程。

    参数

    进程名称:指定要杀死的进程名称。

    实例

    杀死所有同名进程

    killall vi

    2.17

    runlevel命令用于打印当前Linux系统的运行等级。

    语法

    runlevel

    知识扩展

    linux操作系统自从开始启动至启动完毕需要经历几个不同的阶段,这几个阶段就叫做runlevel,同样,当linux操作系统关闭时也要经历另外几个不同的runlevel,下面我们就准备详细介绍一下runlevel,并向您展示一些小技巧来让您的linux系统避免不必要的重启动。

    runlevel可以认为是系统状态,形象一点,您可以认为runlevel有点象微软的windows操作系统中的Normal,safemode,和command prompt only。进入每个runlevel都需要启动或关闭相应的一系列服务(services),这些服务(services)以初始化脚本的方式放置于目录/etc/rc.d/rc?.d/或者/etc/rc?.d下面(?代表runlevel的对应序号)。

    在大多数的linux发行版本中,通常有8个runlevel:

    0 停机
    1 单用户模式
    2 多用户,没有 NFS
    3 完全多用户模式
    4 没有用到
    5 图形界面
    6 重新启动
    S s Single user mode

    多数的桌面的linux系统缺省的runlevel是5,用户登陆时是图形界面,而多数的服务器版本的linux系统缺省的runlevel是3,用户登陆时是字符界面,runlevel 1和2除了调试之外很少使用,runlevel s和S并不是直接给用户使用,而是用来为Single user mode作准备。

    linux的运行模式比起windows的启动模式的优势在于:你可以在系统空闲时使用init命令切换你现在使用的runlevel,另外,当你关闭或者启动linux系统时你已经不知不觉中切换你的runlevel,系统关机进程需要调用runlevel(0或6)来关闭所有正在运行中的进程。

     

    2.18

    batch命令用于在指定时间,当系统不繁忙时执行任务,用法与at相似。

    语法

    batch(选项)(参数)

    选项

    -f:指定包含具体指令的任务文件;
    -q:指定新任务的队列名称;
    -m:任务执行完后向用户发送E-mail

    参数

    日期时间:指定任务执行的日期时间。

    实例

    batch 
    at> echo 1234
    at> <EOT>
    job 5 at Sun Apr 28 08:49:00 2013

    2.19

    ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

    语法

    ps(选项)

    选项

    -a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
    a:显示现行终端机下的所有程序,包括其他用户的程序。
    -A:显示所有程序。
    -c:显示CLS和PRI栏位。
    c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
    -C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
    -d:显示所有程序,但不包括阶段作业领导者的程序。
    -e:此选项的效果和指定"A"选项相同。
    e:列出程序时,显示每个程序所使用的环境变量。
    -f:显示UID,PPIP,C与STIME栏位。
    f:用ASCII字符显示树状结构,表达程序间的相互关系。
    -g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
    g:显示现行终端机下的所有程序,包括群组领导者的程序。
    -G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
    h:不显示标题列。
    -H:显示树状结构,表示程序间的相互关系。
    -j或j:采用工作控制的格式显示程序状况。
    -l或l:采用详细的格式来显示程序状况。
    L:列出栏位的相关信息。
    -m或m:显示所有的执行绪。
    n:以数字来表示USER和WCHAN栏位。
    -N:显示所有的程序,除了执行ps指令终端机下的程序之外。
    -p<程序识别码>:指定程序识别码,并列出该程序的状况。
    p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
    r:只列出现行终端机正在执行中的程序。
    -s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
    s:采用程序信号的格式显示程序状况。
    S:列出程序时,包括已中断的子程序资料。
    -t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
    t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
    -T:显示现行终端机下的所有程序。
    -u<用户识别码>:此选项的效果和指定"-U"选项相同。
    u:以用户为主的格式来显示程序状况。
    -U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
    U<用户名称>:列出属于该用户的程序的状况。
    v:采用虚拟内存的格式显示程序状况。
    -V或V:显示版本信息。
    -w或w:采用宽阔的格式来显示程序状况。 
    x:显示所有程序,不以终端机来区分。
    X:采用旧式的Linux i386登陆格式显示程序状况。
    -y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
    -<程序识别码>:此选项的效果和指定"p"选项相同。
    --cols<每列字符数>:设置每列的最大字符数。
    --columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
    --cumulative:此选项的效果和指定"S"选项相同。
    --deselect:此选项的效果和指定"-N"选项相同。
    --forest:此选项的效果和指定"f"选项相同。
    --headers:重复显示标题列。
    --help:在线帮助。
    --info:显示排错信息。
    --lines<显示列数>:设置显示画面的列数。
    --no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
    --group<群组名称>:此选项的效果和指定"-G"选项相同。
    --Group<群组识别码>:此选项的效果和指定"-G"选项相同。
    --pid<程序识别码>:此选项的效果和指定"-p"选项相同。
    --rows<显示列数>:此选项的效果和指定"--lines"选项相同。
    --sid<阶段作业>:此选项的效果和指定"-s"选项相同。
    --tty<终端机编号>:此选项的效果和指定"-t"选项相同。
    --user<用户名称>:此选项的效果和指定"-U"选项相同。
    --User<用户识别码>:此选项的效果和指定"-U"选项相同。
    --version:此选项的效果和指定"-V"选项相同。
    --widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

    由于ps命令能够支持的系统类型相当的多,所以选项多的离谱!

    2.20

    init命令是Linux下的进程初始化工具,init进程是所有Linux进程的父进程,它的进程号为1。init命令是Linux操作系统中不可缺少的程序之一,init进程是Linux内核引导运行的,是系统中的第一个进程。

    语法

    init(选项)(参数)

    选项

    -b:不执行相关脚本而直接进入单用户模式;
    -s:切换到单用户模式。

    参数

    运行等级:指定Linux系统要切换到的运行等级。

    实例

    几个常用的命令

    查看系统进程命令:ps -ef | head
    查看init的配置文件:more /etc/inittab
    查看系统当前运行的级别:runlevel

    运行级别

    到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从0到6 ,具有不同的功能。你也可以在/etc/inittab中查看它的英文介绍。

    #0  停机(千万不能把initdefault 设置为0)
    #1  单用户模式
    #2  多用户,没有 NFS(和级别3相似,会停止部分服务)
    #3  完全多用户模式
    #4  没有用到
    #5  x11(Xwindow)
    #6  重新启动(千万不要把initdefault 设置为6)

    2.21

    crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

    语法

    crontab(选项)(参数)

    选项

    -e:编辑该用户的计时器设置;
    -l:列出该用户的计时器设置;
    -r:删除该用户的计时器设置;
    -u<用户名称>:指定要设定计时器的用户名称。

    参数

    crontab文件:指定包含待执行任务的crontab文件。

    知识扩展

    Linux下的任务调度分为两类:系统任务调度用户任务调度

    系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

    /etc/crontab文件包括下面几行:

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=""HOME=/
    
    # run-parts
    51 * * * * root run-parts /etc/cron.hourly
    24 7 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

    用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下:

    /etc/cron.deny     该文件中所列用户不允许使用crontab命令
    /etc/cron.allow    该文件中所列用户允许使用crontab命令
    /var/spool/cron/   所有用户crontab文件存放的目录,以用户名命名

    crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

    minute   hour   day   month   week   command     顺序:分 时 日 月 周

    其中:

    • minute: 表示分钟,可以是从0到59之间的任何整数。
    • hour:表示小时,可以是从0到23之间的任何整数。
    • day:表示日期,可以是从1到31之间的任何整数。
    • month:表示月份,可以是从1到12之间的任何整数。
    • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
    • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

    在以上各个字段中,还可以使用以下特殊字符:

    • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

    crond服务

    /sbin/service crond start    //启动服务
    /sbin/service crond stop     //关闭服务
    /sbin/service crond restart  //重启服务
    /sbin/service crond reload   //重新载入配置

    查看crontab服务状态:

    service crond status

    手动启动crontab服务:

    service crond start

    查看crontab服务是否已设置为开机启动,执行命令:

    ntsysv

    加入开机自动启动:

    chkconfig –level 35 crond on

    实例

    每1分钟执行一次command

    * * * * * command

    每小时的第3和第15分钟执行

    3,15 * * * * command

    在上午8点到11点的第3和第15分钟执行

    3,15 8-11 * * * command

    每隔两天的上午8点到11点的第3和第15分钟执行

    3,15 8-11 */2 * * command

    每个星期一的上午8点到11点的第3和第15分钟执行

    3,15 8-11 * * 1 command

    每晚的21:30重启smb 

    30 21 * * * /etc/init.d/smb restart

    每月1、10、22日的4 : 45重启smb 

    45 4 1,10,22 * * /etc/init.d/smb restart

    每周六、周日的1:10重启smb

    10 1 * * 6,0 /etc/init.d/smb restart

    每天18 : 00至23 : 00之间每隔30分钟重启smb 

    0,30 18-23 * * * /etc/init.d/smb restart

    每星期六的晚上11:00 pm重启smb 

    0 23 * * 6 /etc/init.d/smb restart

    每一小时重启smb 

    * */1 * * * /etc/init.d/smb restart

    晚上11点到早上7点之间,每隔一小时重启smb

    * 23-7/1 * * * /etc/init.d/smb restart

    每月的4号与每周一到周三的11点重启smb 

    0 11 4 * mon-wed /etc/init.d/smb restart

    一月一号的4点重启smb

    0 4 1 jan * /etc/init.d/smb restart

    每小时执行/etc/cron.hourly目录内的脚本

    01 * * * * root run-parts /etc/cron.hourly

    2.22

    pkill命令可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。

    语法

    pkill(选项)(参数)

    选项

    -o:仅向找到的最小(起始)进程号发送信号;
    -n:仅向找到的最大(结束)进程号发送信号;
    -P:指定父进程号发送信号;
    -g:指定进程组;
    -t:指定开启进程的终端。

    参数

    进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。

    实例

    pgrep -l gaim
    2979 gaim
    
    pkill gaim

    也就是说:kill对应的是PID,pkill对应的是command

     

    2.23

    atrm命令用于删除待执行任务队列中的指定任务。

    语法

    atrm(选项)(参数)

    选项

    -V:显示版本号。

    参数

    任务号:指定待执行队列中要删除的任务。

    实例

    删除已经排队的任务

    atq        //显示当前已经设置的任务
    2 Mon May 17 08:00:00 2010 a root
    1 Sat May 15 17:00:00 2010 a root
    
    atrm 2     //删除任务2

    2.24

    atq命令显示系统中待执行的任务列表,也就是列出当前用户的at任务列表。

    语法

    atq(选项)

    选项

    -V:显示版本号;
    -q:查询指定队列的任务。

    实例

    at now + 10 minutes
    at> echo 1111
    at> <eot>
    job 3 at Fri Apr 26 12:56:00 2013
    
    atq
    3       Fri Apr 26 12:56:00 2013 a root

    2.25

    at命令用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。

    上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

    语法

    at(选项)(参数)

    选项

    -f:指定包含具体指令的任务文件;
    -q:指定新任务的队列名称;
    -l:显示待执行任务的列表;
    -d:删除指定的待执行任务;
    -m:任务执行完成后向用户发送E-mail

    参数

    日期时间:指定任务执行的日期时间。

    实例

    三天后的下午 5 点锺执行/bin/ls

    [root@localhost ~]# at 5pm+3 days
    at> /bin/ls
    at> <EOT>
    job 7 at 2013-01-08 17:00

    明天17点钟,输出时间到指定文件内:

    [root@localhost ~]# at 17:20 tomorrow
    at> date >/root/2013.log
    at> <EOT>
    job 8 at 2013-01-06 17:20

    计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务:

    [root@localhost ~]# atq
    8       2013-01-06 17:20 a root
    7       2013-01-08 17:00 a root

    删除已经设置的任务:

    [root@localhost ~]# atq
    8       2013-01-06 17:20 a root
    7       2013-01-08 17:00 a root
    
    [root@localhost ~]# atrm 7
    [root@localhost ~]# atq
    8       2013-01-06 17:20 a root

    显示已经设置的任务内容:

    [root@localhost ~]# at -c 8
    #!/bin/sh
    # atrun uid=0 gid=0
    # mail     root 0
    umask 22此处省略n个字符
    date >/root/2013.log
  • 相关阅读:
    poj 2186 && hdu 3836
    poj 2833 The Average
    hud 3062 Party
    论 ACM 与泡妞 (转载)
    poj 1064 Cable master
    poj Candies
    [转]人才流失的背后
    获取存储过程的ReturnValue值
    javascript js jquery获取元素位置代码总结
    【引用】xmlpath 操作 xml
  • 原文地址:https://www.cnblogs.com/kaid/p/9127882.html
Copyright © 2020-2023  润新知