Linux常用命令
     分类:系统管理     有: 0 条评论

Linux常用命令

     分类:系统管理     有: 0 条评论

这些linux技巧大大提高你的工作效率:https://mp.weixin.qq.com/s/p795Do0vwfPUZsLE8aJZPA

相见恨晚的15个 Linux 神器:https://mp.weixin.qq.com/s/GO9J64TfDn1eqsR6uL-M7A

DevOps人员常用的linux命令速查表:https://mp.weixin.qq.com/s/0rWm2CjXukl64VTvvp382g

Linux正则表达式:https://mp.weixin.qq.com/s/t9lz4na_fT5kFrxWUCqfjA

20个堪称神器的Linux命令行软件:https://mp.weixin.qq.com/s/JeOuj7dkizjc6dlvX7a2Sg

5个相见恨晚的Linux命令(tldr、tree、rlwrap、script、autojump):https://mp.weixin.qq.com/s/qS-ZuueeBPv5wG5F1-bojQ

23个Linux命令常用项:https://mp.weixin.qq.com/s/whlG9QYEbnPe-SbsPZi4bw

服务异常处理指南:https://mp.weixin.qq.com/s/dduLDD2T1e6GVwdWWtVxsA


系统管理类

快捷键

搜索历史命令

快速搜索历史命令并运行
Ctrl+r输入命令关键字即可搜索出来,按左或右方向键,或鼠标左键(视使用的第三方ssh软件而定)选定该命令,回车执行。


命令中引用命令

经常需要在命令中引用命令,如:

# 取消wget、curl的执行权限,防止中毒机器情况恶化
chmod a-x `which wget`
chmod a-x `which curl`
# 在命令中引用命令用``号括起来,如果是字符串则是''或""

测试网站响应速度

curl -o /dev/null -s -w '%{time_connect}:%{time_starttransfer}:%{time_total}\n' 'http://baidu.com'
`curl`输出通常是 HTML 代码,通过 
-o 参数发送到 `/dev/null`
-s 参数去掉所有状态信息.
-w 参数让 curl 写出列出的计时器的状态信息:
计时器描述
time_connect建立到服务器的 TCP 连接所用的时间
time_starttransfer在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total完成请求所用的时间
time_namelookupDNS解析时间,从请求开始到DNS解析完毕所用时间(记得关掉 Linux 的 nscd 的服务测试)
speed_download下载速度,单位-字节每秒。

用户、用户组

在docker中使用web环境,经常会遇到权限问题,一般在宿主机上执行命令修改挂载目录的属主和所属组之后,在docker中如果没有对应的用户就会显示成数字,数字对应的是宿主机的UID;这时就要把docker中的www用户的UID和GID改为该数字才能继承权限。之后还是无法访问,就在宿主机中增加读写权限就可以了。

# 修改用户名称
usermod -l login-name old-name

# 修改用户HOME目录,前面rename用户名称之后,HOME家目录的显示没有改变。
usermod -d /home/new-user -m new-user

# 修改UID
usermod -u NEW-UID username

# 修改GID/group-name
groupmod -g NEW-GID groupname

groupadd test 创建test用户组
useradd user1 创建user1用户
passwd user1 设置user1的密码
useradd user2 创建user2用户
passwd user2 设置user2的密码
gpasswd -a user1 test 把user1用户添加到test用户组
gpasswd -a user2 test 同上

sudo免密码

# 切换到root
chmod u+w /etc/sudoers
echo "leolan(用户名)        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
chmod u-w /etc/sudoers

该用户使用sudo不需要密码。


systemctl

查看所有服务:systemctl list-unit-files
查看所有已启动的服务:systemctl list-units --type=service
验证是否为开机启动:systemctl is-enabled [server name]
重新加载所有服务(改动):systemctl daemon-reload


自启动

Centos 7 中使用systemctl enable管理服务器自启动,但是有些服务只支持chkconfig方式,或者可以用rc.local文件这时要对应修改。

systemctl方式

服务目录有系统(system)和用户(user)之分,如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即:/lib/systemd/system/;如果是登录后才能运行的程序,存在用户(user)里,即:/usr/lib/systemd/ 服务以.service结尾。

下面以jira为例:

vim /lib/systemd/system/jira.service

[Unit]
Description=jira
After=network.target

[Service]
Type=forking
ExecStart=/data/atlassian/jira/bin/start-jira.sh
ExecReload=/etc/rc.d/init.d/jira restart
ExecStop=/data/atlassian/jira/bin/stop-jira.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

保存并设置权限为754 chmod 754 /lib/systemd/system/jira.service 然后就可以用ststemctl管理了

[Unit]:服务的说明
Description:描述服务
After:描述服务类别

[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径

[Install]服务安装的相关设置,可设置为多用户

参考:
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two
http://www.csdn.net/article/2015-02-27/2824034


修改rc.local方式

# 首先要执行的脚本要有执行权限
vim /etc/rc.local       #该文件链接到/etc/rc.d/rc/local
在在末尾增加脚本路径
# 在centos7中,/etc/rc.d/rc.local的权限被降低了,增加执行权限
chmod +x /etc/rc.d/rc.local

chkconfig方式

以redis脚本为例,可以适当简化

cd /etc/rc.d/init.d/
vim xxx.sh
# 按以下格式编写

###########################
#!/bin/sh
#chkconfig: 2345 10 90
#description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
   
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
   
PIDFILE=/var/run/redis.pid
CONF="/etc/redis.conf"
   
case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        if [ "$?"="0" ] 
        then
              echo "Redis is running..."
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $REDIS_CLI -p $REDISPORT SHUTDOWN
                while [ -x ${PIDFILE} ]
               do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
   restart|force-reload)
        ${0} stop
        ${0} start
        ;;
  *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
        exit 1
esac
##############################

或者
##############################
#!/bin/bash
# JIRA Linux service controller script
# chkconfig: 2345 20 80
#
cd "/data/atlassian/jira/bin"

case "$1" in
    start)
        ./start-jira.sh
        ;;
    stop)
        ./stop-jira.sh
        ;;
    restart|force-reload)
        ${0} stop
        ${0} start
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac
##############################

# 保存退出
chmod +x xxx.sh
chkconfig --add xxx.sh
chkconfig xxx.sh on

参考:http://www.cnblogs.com/ssooking/p/6094740.html


ssh免密登录、密钥登陆

ssh-keygen 创建公钥和密钥。 一路回车就行,会在~/.ssh/下创建相应文件。
ssh-copy-id user@IP 把本地主机的公钥复制到远程主机的authorized_keys文件上。这样就能免登录这台主机啦。

ssh-copy-id 也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限 。

A将公钥发给B,不是说让B来访问A,而是A就可以访问B了。也就是说B不能在.ssh文件夹下的authorized_keys保留A的公钥,如保存就是把自己让给别人来访问!

注意:配置本机ssh的ssh_config文件,StrictHostKeyChecking值为no;这样在每次连接新主机时就不会提示输入yes了。

参考:
https://my.oschina.net/emptytimespace/blog/79173
http://www.linuxidc.com/Linux/2015-07/119608.htm
http://www.runoob.com/w3cnote/set-ssh-login-key.html


环境变量

# 编辑文件,按格式写好路径
vim /etc/profile

source /etc/profile

分析空间大小

分析空间大小(根目录下个文件夹大小):du -sh /*


打开文件最大数

系统级

系统级的最大打开文件数一般比较高,一般不是瓶颈。

# 查看当前值
cat /proc/sys/fs/file-max  或 sysctl -a 查看结果中fs.file-max这项的配置数量(sysctl -a |grep fs.file-max)

# 修改值
vim /etc/sysctl.conf
配置fs.file-max属性,如果属性不存在就添加。

fs.file-max = 1024000

# 配置生效
sysctl -p

用户级

Linux用户级默认最大打开文件数是1024,Linux是以文件为基础的操作系统,连接也是通过文件的形式体现的,在高并发送场景很容易报错:too many open files

查看当前的设置

[root@localhost ~]# ulimit -a
...
open files                      (-n) 1024
...

临时修改,注销、重启后失效
ulimit -n 1024000
只针对当前进程有效。重新打开一个shell或者开启一个进程,则是原来的1024。

修改配置,修改最大开大文件数

# 修改配置。必须注销或重启才能生效(这种情况注销再次登录后要重启相关服务才会为新的配置)。
# 可以结合ulimit -n一起就可以不重启服务进程了。

说明
# 添加格式:
[username | @groupname] [参数] [resource] [具体数值]

[*]:
代表针对所有用户(所有组)

[参数]:
有 soft,hard 和 -
soft 指的是当前系统生效的设置值。
hard 表明系统中所能设定的最大值。
soft 的限制不能比hard 限制高。
用 - 就表明同时设置了 soft 和 hard 的值。

[resource]:
core - 限制内核文件的大小(kb)
date - 最大数据大小(kb)
fsize - 最大文件大小(kb)
memlock - 最大锁定内存地址空间(kb)
nofile - 打开文件的最大数目
rss - 最大持久设置大小(kb)
stack - 最大栈大小(kb)
cpu - 以分钟为单位的最多 CPU 时间
noproc - 进程的最大数目
as - 地址空间限制
maxlogins - 此用户允许登录的最大数目



# 法一
echo "* hard nofile 1024000" >>  /etc/security/limits.conf
echo "* soft nofile 1024000" >>  /etc/security/limits.conf


###############################################
# 法二
echo "ulimit -SHn 1024000" >> /etc/profile

# 说明
-S soft limits
-H hard limits
-n 打开文件数的最大值

参考:https://www.cnblogs.com/405845829qq/p/5919495.html


挂载分区

ISCSI挂载

# 安装软件
yum -y install iscsi-initiator-utils

# 修改配置,填入ISCSI指定的地址iSCSI IQN,修改InitiatorName后的值。
# 多台主机是可以用同一套账户密码挂载的。
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2000-01.com.synology:haha-NAS.Target-1.c91a1f469c



# 修改配置,填入账户密码
vim /etc/iscsi/iscsid.conf

# line 57: 取消注释
node.session.auth.authmethod = CHAP
# line 61,62: 填入账户密码
node.session.auth.username = username
node.session.auth.password = password



# 发现target,可以看到两行信息,一行是ipv4,一行是ipv6
#(必须执行)会在/var/lib/iscsi/nodes/生成节点信息。
iscsiadm -m discovery -t sendtargets -p 192.168.0.45

# 展示信息(可跳过此步)
iscsiadm -m node -o show

# 登陆target,可看到登陆成功信息,会保持屏幕输出,按Ctrl+c退出来
iscsiadm -m node --login
# 如果报错iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)
# 先不管,用fdisk -l查看是否挂载成功;若不成功执行以下操作。
# rm -rf /var/lib/iscsi/nodes/*
# systemctl restart iscsi && systemctl restart iscsid
# iscsiadm -m discovery -t sendtargets -p 192.168.0.45
# iscsiadm -m node --login


# 确认连接状态,可以看到已连接的target
iscsiadm -m session -o show

tcp: [1] 172.16.16.45:3260,1 iqn.2000-01.com.synology:haha-NAS.Target-1.c91a1f469c (non-flash)

# 这时可以用fdisk -l或cat /proc/partitions可以看到新加的设备。
# 开始分区,小于2T的,可以用fdisk工具;大于2T的可以用parted工具
参考:
https://www.leolan.top/index.php/posts/69.html
https://www.leolan.top/index.php/posts/75.html

# 开机登陆target并挂载
vim /etc/rc.lcoal
iscsiadm -m node -T iqn.2000-01.com.synology:haha-NAS.Target-1.c91a1f469c -p 192.168.0.45:3260 --login

# 查询UUID可以用命令:blkid /dev/sdc1或者lsblk -f
# 或者用/dev/sdc1也是可以挂载的。
vim /etc/fstab
UUID=27f0ec37-d7ab-4c93-b9e3-cd09ddd9e340 /data  ext4  defaults        0 0

NTFS的挂载

官方下载:http://www.tuxera.com/community/ntfs-3g-download/
然后解压:tar zxvf ntfs-3g_ntfsprogs-2017.3.23.tgz并进入目录
安装:yum install gcc -y && ./configure && make && make install
挂载:mount -t ntfs-3g /dev/sda2 /mnt/Windows


CIFS挂载

mount -t cifs -o username=backup,password=123456 //192.168.10.115/Data(如果是D盘就直接写d就好了)/ /home/remote_backup

在Ubuntu中挂载win共享磁盘报:mount: mount //192.168.0.250:/d on /mnt failed: 远程 I/O 错误
看了国内一些网文瞎扯后还是没能解决,最后找到了答案:mount.cifs Cannot allocate memory OR Remote I/O error after data transfer
我这里只是报远程IO错误,只需要膝盖注册表把HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size的值改为3,然后重启Server服务就可以了。


raw虚拟硬盘挂载

linux下可以直接挂载raw格式的虚拟磁盘镜像文件。

mkfs.ext4 -q raw.img 
mount -o loop raw.img /mnt
df -h

vhd、qcow2虚拟硬盘挂载

# 使用modprobe来加载nbd驱动
modprobe nbd max_part=16

# modinfo命令来查看模块信息
modinfo nbd
ls /dev/nbd*   # 初始化网络块设备的数目为16

将vhdx文件连接到nbd设备

# 使用qemu-nbd来进行连接(使用-c参数为连接,使用-d参数断开连接)
qemu-nbd -c /dev/nbd0 XXXXX.vhdx
qemu-nbd -c /dev/nbd1 XXXXX.vhd
qemu-nbd -c /dev/nbd2 XXXXX.qcow2

# fdisk查看一下设备信息。没有分区信息可以用fdisk /dev/nbd0对虚拟硬盘进行分区。
fdisk -l /dev/nbd0
fdisk -l /dev/nbd1
fdisk -l /dev/nbd2
# 分区完成后再次查看一般有/dev/nbd0p1、/dev/nbd0p2 这样的分区。

# 挂载
# exFAT格式要安装包:fuse-exfat和exfat-utils
mount -t exfat -o rw  /dev/nbd0p1 /mnt
mount -t ext4 -o rw  /dev/nbd1p1 /mnt

# 断开连接
umount /mnt
qemu-nbd -d /dev/nbd0

参考:
https://www.cnblogs.com/oloroso/p/6385398.html
http://smilejay.com/2012/11/how-to-mount-a-qcow2-image/


fuser

fuser命令用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号,那些本地进程使用file,参数指定的本地或远程文件。对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。

Linux中,不管是登陆还是磁盘挂载,还是输入输出,都是以文件为基础;杀掉占用文件的进程就相当于终止了某连接了。

fuser(选项)(参数)

选项

参数
文件:可以是文件名或者TCP、UDP端口号。

例:

fuser -u /etc/filesystems   #列出使用/etc/filesystems文件的进程的进程号和用户登录名
fuser /dev/pts/0            #用户登陆的进程号
fuser -k /dev/pts/0         #中断用户连接

参考:http://man.linuxde.net/fuser


parted分区工具

格式化大硬盘时(单盘大于2T)或者是GPT分区时,是无法用fdisk进行分区的,这时要用parted工具来分区,分区完成后,其他操作都是一样的。

fdisk -l                              #查看分区情况
root@leo-Ubuntu:~# parted             #开始分区
GNU Parted 3.2
使用 /dev/sda
欢迎使用 GNU Parted! 输入 'help'可获得命令列表.
(parted) select /dev/sda              #选择硬盘(用fdisk -l查看)
Using /dev/sdb
(parted) mklabel gpt                  #格式化为GPT分区
(parted) mkpart primary 0 -1          #将整块磁盘分成一个分区                                           
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? Ignore        #同意                                   
(parted) print                        #打印结果                                    
Model: ATA ST3000DM008-2DM1 (scsi)    #注意这个结果中有scsi字样,说明以scsi方式挂载到系统中
磁盘 /dev/sda: 3001GB
Sector size (logical/physical): 512B/4096B
分区表:gpt
Disk Flags: 

数字  开始:  End     大小    文件系统  Name     标志
 1    17.4kB  3001GB  3001GB            primary

(parted) quit                         #分区完成,退出                                    
信息: You may need to update /etc/fstab.

# 现在开始格式化分区
PS:在Linux系统中挂载SCSI盘阵,且分区大小超过2TB时,无法使用mk2fs命令进行格式化,而在使用mkfs.extX等命令格式化时,需要增加-T largefile参数,否则格式化过程将非常缓慢。
# 经过上一步之后fdisk -l可以看到/dev/sda1了
# 即使看不到/dev/sda1也不影响的,依然可以执行下面的命令。

mkfs.ext4 -T largefile /dev/sda1    #执行这一步可能会提示输入标签名,自己起个名字(之后可以修改的)。
e2label /dev/sda1 data              #对/dev/sda1添加(修改)标签为data
e2label /dev/sda1                   #查看分区的标签
mkdir /data
mount /dev/sda1 /data               #查看挂载信息

root@leo-Ubuntu:/data# df -Th
   文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sdb3      btrfs     116G   78G   37G   68% /
/dev/sda1      ext4      2.8T   73M  2.6T    1% /data
/dev/sdb3      btrfs     116G   78G   37G   68% /home
/dev/sdb1      vfat      285M  2.5M  282M    1% /boot/efi

# 修改fstab文件
vim /etc/fstab
/dev/sda1              /data                  ext4    defaults        0 0
# 重启系统检测是否成功。

参考:https://blog.csdn.net/richerg85/article/details/17917129


定时任务

crontab status                #crontab 状态 
crontab -e                    #编辑配置文件
/sbin/service crond start     #启动服务 
/sbin/service crond stop      #关闭服务 
/sbin/service crond restart   #重启服务 
/sbin/service crond reload    #重新载入配置

格式:

*/25 * * * * /opt/xxx/xxx/restart.sh

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

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

crontab的默认输出对象是邮件,执行一个crontab任务,执行完之后总是会发送邮件。crontab -e在执行的任务前加上MAILTO=""就不会发送邮件了。

MAILTO=""
* * * * * /home/xxxx.sh >> /home/xxxx.log 2>&1

这样既可以取消邮件通知,又可以将结果输出到log中

查看所有用户下的定时任务

for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done

命令执行

顺序执行多条命令可以用;来隔开(即使前面一条命令没有正确执行,后面的命令也会执行)

&&实现选择性执行的,它表示如果前面的命令执行结果返回0(前一条命令正确执行),才执行后面的,否则不执行(不是表示终端输出的内容,而是表示命令执行状态的结果),用echo $?环境变量可以查看上一次命令的执行结果。

shell中的||除了用于表示逻辑与和或之外,还可以实现命令执行顺序的简单控制。||是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时(上一条命令执行失败),则执行它后面的命令。


后台运行命令

放入后台执行:或者执行screen命令进入控制台,执行程序或命令,然后按Ctrl+a一下,然后按d键后台
查看后台任务:screen -ls
恢复后台任务:screen -r xxxx(id)

图中所显示的 [1] 236分别是该工作的 job number 与该进程的 PID,而最后一行的 Done 表示该命令已经在后台执行完毕。

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。   
该命令的一般形式为:nohup command &   使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:   
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。   

    • z 使当前工作停止并丢到后台中去

使用 jobs 查看任务。
mark
第一列显示的为被放置后台的工作的编号,
第二列的 表示最近被放置后台的工作,同时也表示预设的工作,也就是若是有什么针对后台的工作的操作,首先对预设的工作,- 表示倒数第二被放置后台的工作,倒数第三个以后都不会有这样的符号修饰,
第三列表示它们的状态,而最后一列表示该进程执行的命令

通过fg命令将后台的工作拿到前台来运行

#后面不加参数提取预设工作,加参数提取指定工作的编号
fg (%jobnumber)  #使用时不要括号

通过bg命令将后台的工作在后台运行

#与fg类似,加参则指定,不加参则取预设
bg [%jobnumber]

rar、unrar

因为centos中没有yum源可以用来安装rar和unrar,所以这里有个简单的办法

wget http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz
tar -xzvf rarlinux-x64-5.3.0.tar.gz -C /usr/local/
ln -s /usr/local/rar/rar /usr/local/bin/rar
ln -s /usr/local/rar/unrar /usr/local/bin/unrar

ps

ps命令很强大,选项和参数也多的离谱,参考:http://man.linuxde.net/ps

常用命令:
ps aux 罗列出所有的进程信息
pa axjf 连同部分的进程呈树状显示出来
ps -l 显示自己这次登陆的 bash 相关的进程信息罗列出来
ps -afxo user,ppid,pid,pgid,command 自定义我们所需要的参数显示

mark

内容解释
F进程的标志为4 表示此程序的权限为 root,若为 1 则表示此子程序仅进行复制(fork)而沒有实际执行(exec)
USER进程的属主
PID进程的ID
PPID其父进程的PID
SIDsession的ID
TPGID前台进程组的ID
%CPU进程占用的CPU百分比
%MEM占用内存的百分比
NI进程的NICE值
VSZ进程使用虚拟内存大小
RSS驻留内存中页的大小
TTY终端ID
S or STAT进程状态
WCHAN正在等待的进程资源
START启动进程的时间
TIME进程消耗CPU的时间
COMMAND命令的名称和参数 

TPGID栏写着-1的都是没有控制终端的进程,也就是守护进程
STAT表示进程的状态,而进程的状态有很多,如下表所示

状态解释
RRunning.运行中
SInterruptible Sleep.等待调用
DUninterruptible Sleep.不可终端睡眠
TStoped.暂停或者跟踪状态
XDead.即将被撤销
ZZombie.僵尸进程
WPaging.内存交换
N优先级低的进程
<优先级高的进程
s进程的领导者
L锁定状态
l多线程状态
+前台进程

其中的 D 不可终端睡眠的状态,处在这种状态的进程不接受外来的任何signal,所以无法使用 kill 命令杀掉处于D状态的进程,无论是 kill,kill -9 还是 kill -15,一般处于这种状态可能是进程 IO 的时候出问题了。


在使用 ps 命令的时候可以看到大部分的进程都是处于休眠的状态,如果这些进程都被唤醒,那么该谁最先享受 CPU 的服务,后面的进程又该是一个什么样的顺序呢?进程调度的队列又该如何去排列呢?

当然就是靠该进程的优先级值来判定进程调度的优先级,而优先级的值就是 PRnice 来控制与体现的

而 nice 的值我们是可以通过 nice 命令来修改的,而需要注意的是 nice 值可以调整的范围是 -20 ~ 19,其中 root 有着至高无上的权力,既可以调整自己的进程也可以调整其他用户的程序,并且是所有的值都可以用,而普通用户只可以调制属于自己的进程,并且其使用的范围只能是 0 ~ 19,因为系统为了避免一般用户抢占系统资源而设置的一个限制。

#这个实验在环境中无法做,因为权限不够,可以自己在本地尝试

#打开一个程序放在后台,或者用图形界面打开
nice -n -5 vim &

renice -5 pid    #修改已经存在的进程的优先级

#用 ps 查看其优先级
ps -afxo user,ppid,pid,stat,pri,ni,time,command | grep vim

cp
关于cp命令的一些参数:
-f 强制覆盖,不询问yes/no(-i的默认的,即默认为交互模式,询问是否覆盖)
-r 递归复制,包含目录
-a 做一个备份,这里可以不用这个参数,我们可以先备份整个test目录
-p 保持新文件的属性不变
-i 覆盖文件前提示确认

一般我们在使用cp命令时加上-f选项,希望不让出现“overwrite”的提示(文件覆盖的提示)。但是为什么加上-f了,还出现“overwrite”的提示呢?
这是因为系统为防止我们误操作,覆盖了不该覆盖的文件,而使用了命令的别名。使用alias命令查看:

[root@blog]# alias
alias cp='cp -i'

第一种解决办法(临时):
在cp前加上一个"\"符号就不使用别名运行了,如下:

\cp -f sourcefile targetdir 

第二种解决办法(临时):

unalias cp
cp -rf ./sourcefile/* /tmp/targetdir/

第三种解决办法(临时):

yes|cp -rf ./sourcefile/* /tmp/targetdir/

第四种解决办法(永久):
编辑文件,注释掉别名。

vim ~/.bashrc
在alias cp='cp -i'前加上“#”注释掉这行,然后重新登陆就可以了(source无效)。

pstree
通过 pstree 可以很直接的看到相同的进程数量,还可以看到所有进程的之间的相关性。

pstree 或 pstree -up

#参数选择:
#-A  :各程序树之间以 ASCII 字元來連接;
#-p  :同时列出每个 process 的 PID;
#-u  :同时列出每个 process 的所属账户名称。

kill

信号值作用
-1重新读取参数运行,类似与restart
-2如同 ctrl+c 的操作退出
-9强制终止该任务   
-15正常的方式终止该任务

完整64个信号:
mark

用法一般是:kill [信号值] [PID] 对 pid 对应的进程做操作
       kill [信号值] [%jobnumber] 对job对象进行操作


日志

常见的日志一般存放在/var/log,一般都有日志系统,默认是syslog,但一些新的linux发新版已经采用了功能更强大的rsyslog

系统日志

日志名称记录信息
alternatives.log系统的一些更新替代信息记录
apport.log应用程序崩溃信息记录
apt/history.log使用apt-get安装卸载软件的信息记录
apt/term.log使用apt-get时的具体操作,如 package 的下载打开等
auth.log登录认证的信息记录
boot.log系统启动时的程序服务的日志信息
btmp错误登陆的信息记录
Consolekit/history控制台的信息记录
dist-upgradedist-upgrade这种更新方式的信息记录
dmesg启动时,显示屏幕上内核缓冲信息,与硬件有关的信息
dpkg.logdpkg命令管理包的日志。
faillog用户登录失败详细信息记录
fontconfig.log与字体配置有关的信息记录
kern.log内核产生的信息记录,在自己修改内核时有很大帮助
lastlog(二进制文件)用户的最近信息记录
wtmp(二进制文件)wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等
syslog系统信息记录

二进制日志文件wtmp,lastlog,不能直接使用 less、cat、more 这样的工具来查看, 可以用lastlastlog 工具来提取其中的信息

syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,虽然时代的进步与发展,syslog 已经年老体衰跟不上时代的需求,所以他被 rsyslog 所代替了,较新的Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具

sudo service rsyslog start
ps aux | grep syslog

既然它是一个服务,那么它便是可以配置,为我们提供一些我们自定义的服务;rsyslog 的配置文件有两个

vim /etc/rsyslog.conf  #主要是配置的环境,也就是 rsyslog 的加载什么模块,文件的所属者等。

vim /etc/rsyslog.d/50-default.conf  #主要是配置的过滤条件

修改配置文件比较复杂,请自行man或搜索。


开机启动服务

交互界面的开机启动项:ntsysv(centos)
--back:在互动式界面里,显示Back钮,而非cancel钮。
使用空格键选择或者取消选项!


开机启动脚本

Centos 7中服务的管理方式变化了。

自己的脚本添加执行权限

chmod +x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
然后最后一行追加你的脚本路径。

包管理

二进制包

二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可。

Debian/Ubuntu(apt)

搜索软件包:apt-cache search softname

选项说明
install其后加上软件包名,用于安装一个软件包
update从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
upgrade升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update
dist-upgrade解决依赖关系并升级(存在一定危险性)
remove移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
autoremove移除之前被其他软件包依赖,但现在不再被使用的软件包
purge与remove相同,但会完全移除软件包,包含其配置文件
clean移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/
autoclean移除已安装的软件的旧版本软件包
参数说明
-y自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
-s模拟安装
-q静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
-f修复损坏的(已安装的所有软件包)依赖关系
-d只下载不安装
--reinstall重新安装已经安装但可能存在问题的软件包
--install-suggests同时安装APT给出的建议安装的软件包

dpkg常用参数介绍

参数说明
-i安装指定deb包
-R后面加上目录名,用于安装该目录下的所有deb安装包
-rremove,移除某个已安装的软件包
-I显示deb包文件的信息
-s显示已安装软件的信息
-S搜索已安装的软件包
-L显示已安装软件包的目录信息

CentosRedhat(yum)

选项说明
install安装rpm软件包;
update更新rpm软件包;
check-update检查是否有可用的更新rpm软件包;
remove删除指定的rpm软件包;
list显示软件包的信息;
search检查软件包的信息;
info显示指定的rpm软件包的描述信息和概要信息;
clean清理yum过期的缓存;
shell进入yum的shell提示符;
resolvedep显示rpm软件包的依赖关系;
localinstall安装本地的rpm软件包;
localupdate显示本地rpm软件包进行更新;
deplist显示rpm软件包的所有依赖关系。
参数说明
-h显示帮助信息;
-y对所有的提问都回答“yes”;
-c指定配置文件;
-q安静模式;
-v详细模式;
-d设置调试等级(0-10);
-e设置错误等级(0-10);
-R设置yum处理一个命令的最大等待时间;
-C完全从缓存中运行,而不去下载或者更新任何头文件。

自动搜索最快镜像插件:yum install yum-fastestmirror
安装yum图形窗口插件:yum install yumex
查看可能批量安装的列表:yum grouplist
列出用yum源安装的软件:yum list installed | grep ruby

安装

yum install #全部安装 
yum install package1 #安装指定的安装包package1 
yum groupinsall group1 #安装程序组group1 

更新和升级

yum update #全部更新 
yum update package1 #更新指定程序包package1 
yum check-update #检查可更新的程序 
yum upgrade package1 #升级指定程序包package1 
yum groupupdate group1 #升级程序组group1 

查找和显示

yum info package1 #显示安装包信息package1 
yum list #显示所有已经安装和可以安装的程序包 
yum list package1 #显示指定程序包安装情况package1 
yum groupinfo group1 #显示程序组group1信息
yum search string 根据关键字string查找安装包 删除程序 
yum remove | erase package1 #删除程序包package1 
yum groupremove group1 #删除程序组group1 
yum deplist package1 #查看程序package1依赖情况 

清除缓存

yum clean packages #清除缓存目录下的软件包 
yum clean headers #清除缓存目录下的 headers 
yum clean oldheaders #清除缓存目录下旧的 headers

yum 软件组
软件组管理功能实测并不是很好用,经常出现没有包可安装的问题,可能原因有几个,换了yum源,软件组信息已经变更了,等等,平时用处不大,就没有去研究咯,知道怎么解决的朋友欢迎反馈。
列出软件组yum grouplist 已安装的软件组

未安装的软件组

软件组信息yum groupinfo "软件组名(英文双引号)"

主要被安装的软件

额外可选的软件

安装某个软件组yum groupinstall "软件组名(英文双引号)"


RPM常用参数介绍

参数说明
-a查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+设置包装套件的完成阶段,并指定套件档的文件名称;
-c只列出组态配置文件,本参数需配合"-l"参数使用;
-d只列出文本文件,本参数需配合"-l"参数使用;
-e<套件档>或--erase<套件档>删除指定的套件;
-f<文件>+查询拥有指定文件的套件;
-h或--hash套件安装时列出标记;
-i显示套件的相关信息;
-i<套件档>或--install<套件档>安装指定的套件档;
-l显示套件的文件列表;
-p<套件档>+查询指定的RPM套件档;
-q使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R显示套件的关联性信息;
-s显示文件状态,本参数需配合"-l"参数使用;
-U<套件档>或--upgrade<套件档>升级指定的套件档;
-v显示指令执行过程;
-vv详细显示指令执行过程,便于排错。

列出用rpm包安装的软件:rpm -qa | grep ruby
用yum解决安装rpm时的依赖问题:yum install /root/xxxx.rpm这样在安装过程中就会自动解决rpm的依赖库问题。rpm的路径要用绝对路径。


源码包编译为rpm包、deb包

源码包到rpm包:
https://blog.51cto.com/13667098/2108175
rpm转deb包:
http://blog.sina.com.cn/s/blog_43a59c7a0102xftk.html
https://blog.csdn.net/qq_29570381/article/details/89716582
https://blog.csdn.net/weixin_39198406/article/details/86693240
https://www.codeleading.com/article/7809347567/


dd命令

dd --help或是info dd

输入或输出

dd if=[STDIN] of=[STDOUT]
例:
dd if=ubuntu-13.10-desktop-amd64.iso of=/dev/sdb2把光盘写进磁盘
当然你可以拿这个来方便的拷贝光碟(注意,你的光碟是标准的 iso9660格式才可以这么做!)

dd if=/dev/cdrom of=cdrom.iso 把光驱内容保存为iso镜像文件

同理,要把一张磁盘的内容拷贝到另一张磁盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:
dd if =/dev/xxx of = /tmp/tmpfile
拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:
dd if = /tmp/tmpfile of =/dev/xxx
软盘拷贝完成后,应该将临时文件删除:
rm /tmp/tmpfile

设备到设备拷贝

如果两个设备能同时工作:dd if =/dev/xxx of = /dev/xxx

/dev/zero还可用于擦除磁盘数据

分割、合并文件

# 分割文件
# 分割为若干个文件
dd if=3.img of=1.img bs=128k            #一个块为128K,分割为若干个文件

# 分割取出指定大小的内容
dd if=3.img of=1.img bs=128k skip=18    #一个块为128K,跳过前18块,只取18块后面的内容。
dd if=3.img of=2.bin bs=128k count=18   #表示一个块128k, 从文件头开始,读取18块。

# 合并两个文件
(dd if=1.img;dd if=2.img) > 3.img

时区时间

时区修改
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 提示覆盖的就覆盖掉
date 看到有CST字样为中国标准时间; date -R 看到+0800 是东八区

修改硬件时钟(每次开机都是从硬件读取时间的,首先硬件时间要正确)
hwclock --show 显示当前硬件时间
hwclock --set --date="10/28/16 10:04:00" (月/日/年 时:分:秒)

hwclock --hctosys 或者hwclock -s或者clock --hctosys
date #查看当前系统时间

注:tzselect 命令也可以交互界面选择修改,但最后还要执行一个提示设置时区的命令,并写入环境变量中,重启才能生效。



文件、目录类

cd

cd :进入用户主目录;
cd ~ :进入用户主目录;
cd - :返回进入此目录之前所在的目录;
cd !$ : 把上个命令的参数作为cd参数使用


权限设置

数字设定法

0表示没有权限,1表示可执行权限, 2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:
语法:chmod [mode] 文件名
例如:chmod 755 mm.txt

文字设定法

语法:chmod [who] [+ | - | =] [mode] 文件名
命令中各选项的含义为:
操作对象who可是下述字母中的任一个或者它们的组合:

设置 mode 所表示的权限可用下述字母的任意组合:

方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。

文件名:以空格分开的要改变权限的文件列表,支持通配符。

chattr命令

chattr命令用来改变文件属性。这项指令可改变文件或目录属性,这些属性共有以下8种模式:

属性

选项

例:

chattr +i /etc/fstab
# 然后试一下rm、mv、rename等命令操作于该文件,都是得到Operation not permitted的结果。

# 让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作:
chattr +a /data1/user_act.log

CUT命令

打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:cut /etc/passwd -d ':' -f 1,6
前五个(包含第五个):cut /etc/passwd -c -5
前五个之后的(包含第五个):cut /etc/passwd -c 5-
第五个:cut /etc/passwd -c 5
2到5之间的(包含第五个): cut /etc/passwd -c 2-5


查找近期修改的文件

比如按名字查找一个文件,可以用find / -name filename
按时间查找也有参数

find . -name '*.html' -type f -mmin -30:当前目录最近30分钟内修改过的html文件
find . -name '*.html' -type f -mmin -30 -ls:最近30分钟内修改过的文件,的详细情况
find ./ -mtime 0:返回最近24小时内修改过的文件。
find ./ -mtime 1 : 返回的是前48~24小时修改过的文件。而不是48小时以内修改过的文件。
find . -type f -mtime +1:最近1天前(2天内)修改过的常规文件
find . -mtime -2 -type f:48小时以内修改过的文件

那怎么返回10天内修改过的文件?find支持表达式关系运算,所以可以把最近几天的数据一天天的加起来:
find ./ -mtime 0 -o -mtime 1 -o -mtime 2 虽然比较土,但也算是个方法了。

例:

find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} \;
   /tmp  --设置查找的目录;
   -mtime +30 --设置时间为30天前;
   -type f --设置查找的类型为文件;
   -name *.sh[ab] --设置文件名称中包含sha或者shb;
   -exec rm -f --查找完毕后执行删除操作;
提示:将此命令写入crontab后即可自动完成查找并删除的工作
另外的方法大同小异
find . -mtime +30 -type f | xargs rm -rf
find /usr/local/mysql/data -mtime +5 -type f -name 'mysql-bin.00*' -exec rm -f {} \;
#查找多个文件,文件名要用单引号括起来。

参考:
http://man.linuxde.net/find
https://yq.aliyun.com/articles/157928?utm_content=m_27477


关于删除匹配文件

# 需要删除redis02-relay-bin.3410800-redis02-relay-bin.3410899这100个文件,可以这样做:
rm -rf redis02-relay-bin.34108{00..99}

参考:http://bbs.chinaunix.net/thread-1863337-1-1.html


echo

echo "ok" > test.txt :用ok字符覆盖掉test.txt内容,>表示追加并覆盖的意思。
echo "ok" >> test.txt:向test.txt文件追加OK字符,不覆盖原文件里的内容。>>表示尾行追加


计算MD5

计算MD5:md5sum filename


文件上下传

SCP

scp -P 22 /home/xxx.sql root@192.168.10.250:/home/backup          #上传本地文件到远程
scp -r -P 22 /home/soft root@192.168.10.250:/home/soft/           #上传本地目录到远程

scp  root@192.168.10.250:/home/backup/xxx.sql /home/              #下载远程文件到本地
scp -r root@192.168.10.250:/home/soft/ /home/soft                 #下载远程目录到本地

lrzsz(Windows-Linux)

rz 上传文件
sz 下载文件

FTP

FTP自动下载脚本,参考:http://www.cnblogs.com/0201zcr/p/4739207.html

ncftp

另外有两个常用的ftp工具ncftpgetncftpput,可以实现后台的ftp上传和下载,这样我就可以利用这些命令在后台上传和下载文件了。


man手册转为PDF

把man的帮助转换成PDF文档:man -t [command] | ps2pdf - filename.pdf


管道符、awk等高级控制

|”管道符是左边命令的标准输出(stdout)给右边命令作为标准输入(stdin);
<”是右边文件名指定的文件内容读入为左边命令的标准输入(stdin);
>”是左边命令的输出覆盖写到右边指定的文件中。

ps aux |grep XXX |awk '{print $11}' | grep -v 'grep' | wc -l


grep -rnI "myleolan" ~

其中$就表示一行的末尾。


wc 命令用于统计并输出一个文件中行、单词和字节的数目
分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数:
行数:wc -l /etc/passwd
单词数:wc -w /etc/passwd
字节数:wc -c /etc/passwd
字符数:wc -m /etc/passwd
最长行字节数:wc -L /etc/passwd

注意:对于西文字符来说,一个字符就是一个字节,但对于中文字符一个汉字是大于2个字节的,具体数目是由字符编码决定的


sort 排序命令
将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。
默认为字典排序:cat /etc/passswd | sort
反转排序:cat /etc/passwd | sort -r
按特定字段排序:cat /etc/passwd | sort -t':' -k 3 -n

上面的-t参数用于指定字段的分隔符,这里是以":"作为分隔符;
-k 字段号用于指定对哪一个字段进行排序。这里/etc/passwd文件的第三个字段为数字,默认情况下是一字典序排序的,如果要按照数字排序就要加上-n参数


uniq 去重命令
uniq命令可以用于过滤或者输出重复行。
● 过滤重复行
我们可以使用history命令查看最近执行过的命令(实际为读取${SHELL}_history文件),那么你可能就会要想去掉命令后面的参数然后去掉重复的命令:history | cut -c 8- | cut -d ' ' -f 1 | uniq

然后经过层层过滤,你会发现确是只输出了执行的命令那一列,不过去重效果好像不明显,仔细看你会发现它趋势去重了,只是不那么明显,之所以不明显是因为uniq命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
或者history | cut -c 8- | cut -d ' ' -f 1 | sort -u

● 输出重复行
输出重复过的行(重复的只输出一个)及重复次数:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
输出所有重复的行:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D


tr 命令
tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。
常用的选项有:

选项说明
-d删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
-s去除set1指定的在输入文本中连续并重复的字符

删除 "hello shiyanlou" 中所有的'o','l','h':echo 'hello shiyanlou' | tr -d 'olh'
将"hello" 中的ll,去重为一个l:echo 'hello' | tr -s 'l'
将输入文本,全部转换为大写或小写输出:cat /etc/passwd | tr '[:lower:]' '[:upper:]'
上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的


sed
经常用到需要批量修改文件中的指定字符,用find和sed结合的方式比较麻烦。这里用grep和sed结合。

# 在当前目录下搜索所有包含“13021259号”字符串并替换为“13526485号”,l参数查询多文件时只输出包含匹配字符的文件名。
sed -i "s/13021259号/13526485号/g" `grep -rl "13021259号" ./`

# 如果只是搜索含“13021259号”字符串的文件,用下面的命令,n参数列出匹配行
grep -rn "13021259号" ./

set命令
set -uset -o nounset执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。
set -xset -o xtrace用来在运行结果之前,先输出执行的那一行命令。
set -eset -o errexit脚本只要发生错误,就终止执行。(不适用于管道命令)
set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行。(可以结合set -o一起用:set -eo pipefail)

参考:http://www.ruanyifeng.com/blog/2017/11/bash-set.html


col 命令
col 命令可以将Tab换成对等数量的空格建,或反转这个操作。
常用的选项有:

选项说明
-x将Tab转换为空格
-h将空格转换为Tab(默认选项)

操作举例:
查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号:
cat -A /etc/protocols
使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了:
cat /etc/protocols | col -x | cat -A


join命令
学过数据库的用户对这个应该不会陌生,这个命令就是用于将两个文件中包含相同内容的那一行合并在一起。

常用的选项有:

选项说明
-t指定分隔符,默认为空格
-i忽略大小写的差异
-1指明第一个文件要用哪个字段来对比,默认对比第一个字段
-2指明第二个文件要用哪个字段来对比,默认对比第一个字段

操作举例:
创建两个文件

echo '1 hello' > file1
echo '1 shiyanlou' > file2
join file1 file2

将/etc/passwd与/etc/shadow两个文件合并,指定以':'作为分隔符
sudo join -t':' /etc/passwd /etc/shadow
将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对第4和第3个字段
sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group


paste命令
paste这个命令与join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。

常用的选项有:

选项说明
-d指定合并的分隔符,默认为Tab
-s不合并到一行,每个文件为一行

操作举例:

echo hello > file1
echo shiyanlou > file2
echo www.shiyanlou.com > file3
paste -d ':' file1 file2 file3
paste -s file1 file2 file3

xargs 分割参数列表
xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。
这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。
cut -d: -f1 < /etc/passwd | sort | xargs echo
上面这个命令用于将/etc/passwd文件按:分割取第一个字段排序后,使用echo命令生成一个列表。


命令行将图片转换为 ascii 字符查看的工具 aview/asciiview(黑白的)
彩色的:

sudo apt-get install caca-utils
cacaview <pic_file>
cacademo
cacafire

重定向

标准错误重定向

重定向标准输出到文件,这是一个很实用的操作,另一个很实用的操作是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。比如下面的操作:

使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
cat Documents/test.c hello.c
你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
下面我们将输出重定向到一个文件,根据我们前面的经验,这里将在看不到任何输出了
cat Documents/test.c hello.c > somefile

这里依然出现了那条错误信息,这正是因为如我上面说的那样,标准输出和标准错误虽然都指向终端屏幕,实际它们并不一样。那有的时候我们就是要可以隐藏某些错误或者警告,那又该怎么做呢。这就需要用到我们前面讲的文件描述符了:

将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
cat Documents/test.c hello.c >somefile 2>&1
或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
cat Documents/test.c hello.c &>somefilehell

注意你应该在输出重定向文件描述符前加上&,否则shell会当做重定向到一个文件名为1的文件中


tee命令同时重定向到多个文件
经常你可能还有这样的需求,除了将需要将输出重定向到文件之外也需要将信息打印在终端(打印终端的同时输出到文件),那么你可以使用tee命令来实现:
echo 'hello shiyanlou' | tee hello


永久重定向

前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到“永久”有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛,当然不需要,我们可以使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:

先开启一个子 Shell:zsh
使用exec替换当前进程的重定向,将标准输出重定向到一个文件:exec 1>somefile
后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)

ls
exit
cat somefile

创建输出文件描述符
默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符,另外我们还可以使用3-8的文件描述符,只是它们默认没有打开而已,你可以使用下面命令查看当前 Shell 进程中打开的文件描述符:
cd /dev/fd/;ls -Al

同样使用exec命令可以创建新的文件描述符:

zsh
exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
echo "this is test" >&3
cat somefile
exit

关闭文件描述符
如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:

exec 3>&-
cd /dev/fd;ls -Al;cd 

完全屏蔽命令的输出
在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。
在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF
我们可以利用设个/dev/null屏蔽命令的输出:
cat Documents/test.c nefile 1>/dev/null 2>&1
上面这样的操作将使你得不到任何输出结果。



网络类

Showterm(命令屏幕录制)

你可以使用几乎所有的屏幕录制程序轻松录制终端会话。但是,你很可能会得到超大的视频文件。Linux 中有几种终端录制程序,每种录制程序都有自己的优点和缺点。Showterm 是一个可以非常容易地记录终端会话、上传、分享,并将它们嵌入到任何网页中的工具。一个优点是,你不会有巨大的文件来处理。

参考:https://linux.cn/article-9433-1.html


网卡管理

# 查看网卡的模块是否加载,看看是否网卡驱动好了的意思
lsmod

# 查看是否检测到了网卡。可以grep eth查看mac
dmesg

# 管理单个网卡
ifup ifdown 激活/停止网卡

wget递归下载整个网站

wget加上参数之后,即可成为相当强大的下载工具。

wget -r -p -np -k http://xxx.com/xxx

-r,  --recursive(递归)指定使用递归下载
-k,  --convert-links(转换链接)将下载的HTML页面中的链接转换为相对链接即本地链接
-p,  --page-requisites(页面必需元素)下载所有的图片等页面显示所需的内容
-np, --no-parent(不追溯至父级)
-nc,   (断点续传)
-o,    (日志)

命令行(脚本)发邮件

# 字符串作为输入
echo "hello,leo"|mail -s "test mail" 842632422@qq.com

# 文件作为输入
mail -s "test mail" 842632422@qq.com < /root/123.txt

axel高速下载

axel是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快。

CentOS 6安装Axel: 目前yum源上没有Axel,我们可以到http://pkgs.repoforge.org/axel/下载rpm包安装

32位CentOS执行下面命令:

wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.i386.rpm 
rpm -ivh axel-2.4-1.el5.rf.i386.rpm 

64位CentOS执行下面命令:

wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.x86_64.rpm 
rpm -ivh axel-2.4-1.el5.rf.x86_64.rpm 

Centos 7:yum install -y axel

Debian/Ubuntu安装Axel: apt-get install axel

如下载lnmp安装包指定10个线程,保存到/tmp/中:

axel -n 10 -o /tmp/ http://www.linuxde.net/lnmp.tar.gz

mwget

参考:http://www.ttlsa.com/tools/mwget-get-file

curl

# 不检查SSL,最后加-k
如果还是报curl: (35) SSL connect error,则升级nss后再执行
yum update nss

# soap请求
# 不指定格式
curl --connect-timeout 30 -m 30 -d "sCorpCode=XXX&sLocationCode=XXXX&fromcity=XXXX&sCorpPassword=XXXX&dReportDateStart=2018-04-01&dReportDateEnd=2018-04-02" "请求接口地址" -k

# 指定xml格式
curl -H 'Content-Type: text/xml;charset=utf-8;SOAPAction: ""' -d "sCorpCode=XXX&sLocationCode=XXXX&fromcity=XXXX&sCorpPassword=XXXX&dReportDateStart=2018-04-01&dReportDateEnd=2018-04-02" "请求接口地址" -k

监听流量

iftop

官方网站:http://www.ex-parrot.com/~pdw/iftop/
安装:
源码安装

yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel  #安装依赖
或
apt-get install flex byacc  libpcap0.8 libncurses5   #安装依赖

#编译之前确保已安装好了make、gcc、autoconf等。
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz
tar zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make && make install

仓库源安装
Debian/Ubuntu系统:apt-get install iftop
Centos/Redhat系统:安装EPEL源,然后yum install iftop安装

使用iftopiftop -i eth0 -n -p


nethogs

nethogs eth0


网页命令行阅读器

w3m 【网址】 网页命令行方式阅读,对于没有桌面环境但在需要判断网页服务是否正常时非常有用。

links阅读html文件,只显示链接
links [选项] [URL]
例:links www.baidu.com


禁ping (禁用ICMP协议)

echo "1" >/proc/sys/net/ipv4/icmp_echo_ignore_all

不能vi编辑,1为禁止ping命令,0为允许ping命令


IP

获得真实外网IP

curl members.3322.org/dyndns/getip

获取内网IP

ifconfig eth2|grep inet |awk '{print $2}'|cut -d: -f2

文字接口数据包捕获器:
tapdump [-AennqX] [-i 接口] [-w 存储文件名] [-c 次数] \ [-r 文件] [所要摘取的数据包数据格式]

图形接口数据包捕获器:Wireshark
yum install wireshark wireshark-gnome


屏幕共享(局域网,公网貌似不行)

连接的两台电脑(也可多台)命令行显示是实时同步的,两边都可以操作。
可能要先安装:screen

screen -S foo 创建会话
screen -x foo 加入会话
exit退出

即时通讯软件: pidgin(gaim的延伸)
yum install pidgin


参考:https://www.oschina.net/translate/most-useful-linux-command-line-tricks


shell分析服务器日志

作者:Panda
原文:https://segmentfault.com/a/1190000009745139

1、查看有多少个IP访问:
awk '{print $1}' log_file|sort|uniq|wc -l

2、查看某一个页面被访问的次数:
grep "/index.php" log_file | wc -l

3、查看每一个IP访问了多少个页面:
awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txt
sort -n -t ' ' -k 2 log.txt  # 配合sort进一步排序

4、将每个IP访问的页面数进行从小到大排序:
awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n

5、查看某一个IP访问了哪些页面:
grep ^111.111.111.111 log_file| awk '{print $1,$7}'

6、去掉搜索引擎统计的页面:
awk '{print $12,$1}' log_file | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l

7、查看2015年8月16日14时这一个小时内有多少IP访问:
awk '{print $4,$1}' log_file | grep 16/Aug/2015:14 | awk '{print $2}'| sort | uniq | wc -l

8、查看访问前十个ip地址
awk '{print $1}' |sort|uniq -c|sort -nr |head -10 access_log
uniq -c 相当于分组统计并把统计数放在最前面
cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10
cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}

9、访问次数最多的10个文件或页面
cat log_file|awk '{print $11}'|sort|uniq -c|sort -nr | head -10
# 访问量最大的前20个ip
cat log_file|awk '{print $11}'|sort|uniq -c|sort -nr|head -20
awk '{print $1}' log_file |sort -n -r |uniq -c | sort -n -r | head -20

10、通过子域名访问次数,依据referer来计算,稍有不准
cat access.log | awk '{print $11}' | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn | head -20

11、列出传输大小最大的几个文件
cat www.access.log |awk '($7~/\.php/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -100

12、列出输出大于200000byte(约200kb)的页面以及对应页面发生次数
cat www.access.log |awk '($10 > 200000 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

13、如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面
cat www.access.log |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

14、列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat www.access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

15、列出传输时间超过 30 秒的文件
cat www.access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20

16、列出当前服务器每一进程运行的数量,倒序排列
ps -ef | awk -F ' ' '{print $8 " " $9}' |sort | uniq -c |sort -nr |head -20

17、查看apache当前并发访问数
# 对比httpd.conf中MaxClients的数字差距多少
netstat -an | grep ESTABLISHED | wc -l

18、可以使用如下参数查看数据
ps -ef|grep httpd|wc -l
1388
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整

netstat -nat|grep -i "80"|wc -l
4341
netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与80端口有关的连接的,wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数

netstat -na|grep ESTABLISHED|wc -l
376
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计
最终返回的数字就是当前所有80端口的已建立连接的总数。

netstat -nat||grep ESTABLISHED|wc
可查看所有建立连接的详细记录

19、输出每个ip的连接数,以及总的各个状态的连接数
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'

20、其他的收集

分析日志文件下 2012-05-04 访问页面最高 的前20个 URL 并排序
cat access.log |grep '04/May/2012'| awk '{print $11}'|sort|uniq -c|sort -nr|head -20

查询受访问页面的URL地址中 含有 www.abc.com 网址的 IP 地址
cat access_log | awk '($11~/\www.abc.com/){print $1}'|sort|uniq -c|sort -nr

获取访问最高的10个IP地址 同时也可以按时间来查询
cat linewow-access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10

时间段查询日志时间段的情况
cat log_file | egrep '15/Aug/2015|16/Aug/2015' |awk '{print $1}'|sort|uniq -c|sort -nr|head -10

分析2015/8/15 到 2015/8/16 访问"/index.php?g=Member&m=Public&a=sendValidCode"的IP倒序排列
cat log_file | egrep '15/Aug/2015|16/Aug/2015' | awk '{if($7 == "/index.php?g=Member&m=Public&a=sendValidCode") print $1,$7}'|sort|uniq -c|sort -nr

($7~/.php/) $7里面包含.php的就输出,本句的意思是最耗时的一百个PHP页面
cat log_file |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

统计网站流量(G)
cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'

统计404的连接
awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

统计http status
cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' 
cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

每秒并发
watch "awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' log_file|sort -k 2 -nr|head -n10"

带宽统计
cat apache.log |awk '{if($7~/GET/) count++}END{print "client_request="count}' 
cat apache.log |awk '{BYTE+=$11}END{print "client_kbyte_out="BYTE/1024"KB"}'

找出某天访问次数最多的10个IP
cat /tmp/access.log | grep "20/Mar/2011" |awk '{print $3}'|sort |uniq -c|sort -nr|head

当天ip连接数最高的ip都在干些什么
cat access.log | grep "10.0.21.17" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

小时单位里ip连接数最多的10个时段
awk -vFS="[:]" '{gsub("-.*","",$1);num[$2" "$1]++}END{for(i in num)print i,num[i]}' log_file | sort -n -k 3 -r | head -10

找出访问次数最多的几个分钟
awk '{print $1}' access.log | grep "20/Mar/2011" |cut -c 14-18|sort|uniq -c|sort -nr|head

取5分钟日志
if [ $DATE_MINUTE != $DATE_END_MINUTE ] ;then 
#则判断开始时间戳与结束时间戳是否相等
START_LINE=sed -n "/$DATE_MINUTE/=" $APACHE_LOG|head -n1 
#如果不相等,则取出开始时间戳的行号,与结束时间戳的行号

查看tcp的链接状态
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' 
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}' 
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}' 
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn 
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -cnetstat -ant|awk '/ip:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -n 
netstat -ant|awk '/:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -rn|head -n 10 
awk 'BEGIN{printf ("http_code\tcount_num\n")}{COUNT[$10]++}END{for (a in COUNT) printf a"\t\t"COUNT[a]"\n"}'

查找请求数前20个IP(常用于查找攻来源): 
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20 
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

找查较多的SYN连接
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

根据端口列进程 
netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1

查看了连接数和当前的连接数
netstat -ant | grep $ip:80 | wc -l 
netstat -ant | grep $ip:80 | grep EST | wc -l

查看IP访问次数 
netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n

Linux命令分析当前的链接状况
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

watch "netstat -n | awk '/^tcp/ {++S[\$NF]} END {for(a in S) print a, S[a]}'" 
# 通过watch可以一直监控
LAST_ACK 5   #关闭一个TCP连接需要从两个方向上分别进行关闭,双方都是通过发送FIN来表示单方向数据的关闭,当通信双方发送了最后一个FIN的时候,发送方此时处于LAST_ACK状态,当发送方收到对方的确认(Fin的Ack确认)后才真正关闭整个TCP连接;
SYN_RECV 30       # 表示正在等待处理的请求数;
ESTABLISHED 1597  # 表示正常数据传输状态; 
FIN_WAIT1 51      # 表示server端主动要求关闭tcp连接; 
FIN_WAIT2 504     # 表示客户端中断连接; 
TIME_WAIT 1057    # 表示处理完毕,等待超时结束的请求数;


Linux技术汇总

https://mp.weixin.qq.com/s/uHVuQI6Vb20ZipLH-8AeqA

(●゚ω゚●)