shell简单技巧之一

shell中可能经常能看到:>/dev/null 2>&1

#分解这个组合:“>/dev/null 2>&1” 为五部分。
    1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
    2:/dev/null 代表空设备文件
    3:2> 表示stderr标准错误
    4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
    5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"

#因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1”

#那么本文标题的语句执行过程为:
    1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
    2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

#最常用的方式有:
    command > file 2>file  与command > file 2>&1

#它们有什么不同的地方吗?
      1、首先command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command  > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道。
     2、 而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
     3、 从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。

linux检查IP是否存在冲突

  方法一:
        arping 192.168.1.2    #若要检查的IP地址,看返回mac是否唯一

  方法二:
        yum install arp-scan -y
        arp-scan -I eth0 -l   #(直接检查所在网段)
#清空网卡接口上所有的ip地址
    ip add flush dev eth0

#linux查看arp表项
  arp -n
  ip neigh show 

#绑定静态arp表项
    arp -i eth0 -s 192.168.2.1 00:CC:0C:BB:11:C2

#删除某个arp表项,清空arp表项
  ip neigh del 192.168.255.29 dev zt3rf5mdn4
  ip neigh flush  dev eth0

#使用指定ip进行arpping
    arping 192.168.1.1 -s 192.168.1.120

#主动更新邻居arp缓存
    arping -U -c 192.168.0.1
#检查进程是否存在(用0信号)
    killall -0 sshd &> /tmp/nginx.log

#删除30天前带 ".log"的文件,如下是具体命令
        find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

    说明:
        将/opt/soft/log/目录下所有30天前带".log"的文件删除。具体参数说明如下:

        find:linux的查找命令,用户查找指定条件的文件;
        /opt/soft/log/:想要进行清理的任意目录;
        -mtime:标准语句写法;
        +30:查找30天前的文件,这里用数字代表天数;
        "*.log":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;
        -exec:固定写法;
        rm -rf:强制删除文件,包括目录;
        {} \; :固定写法,一对大括号+空格+\+; 
#linux进行快ping
  ping -i 0.0001 192.168.1.1
  ping -f 192.168.1.1
centos当yum程序出现报错“Another app is currently holding the yum lock; waiting for it to exit...”的解决方法
    rm -rf /var/run/yum.pid 
#linux磁盘坏道检查
  #-s 显示进度,-v显示详细过程,并将结果重定向到sdb.txt文件中方便查阅
  badblocks -s -v /dev/sdb > sdb.txt
思科等网络设备,ssh无法正常交换密钥,提示如下故障代码
    故障代码:ssh_rsa_verify: RSA modulus too small: 512 < minimum 768 bits  key_verify failed for server_host_key

    可以尝试的解决办法:
        A、ssh -v 2 -c des root@10.0.0.1
        B、ssh -oKexAlgorithms=+diffie-hellman-group1-sha1  root@10.0.0.1
#创建非常大的loop文件(ext4或xfs)
  #其实我的磁盘没有那么大(因为truncate的时候没有实际去写那么大的文件,当然这个也是要文件系统支持的)
  truncate -s 10T loop.img

#当有多个IP地址,可以使用下面的命令查看主动到某个地址,默认使用那个IP。
  ip route get 目标ip地址
  [root@aliyun ~]# ip route get 1.1.1.1
  1.1.1.1 via 172.31.127.253 dev eth0 src 172.31.112.253 uid 0 
      cache

[root@localhost ~]# ip route get 9.9.9.9 from 12.82.22.32
9.9.9.9 from 12.82.22.32 via 12.82.22.1 dev eno1
    cache

查看某个pid程序所占用的 资源状态(3804是pid)
    top -Hp 3804

如何查看文件的inode,以及如何根据 inode number 查找文件
[root@dn42-bd ~]# ls -il
total 7116
924451 -rw-r--r--  1 root root      27 Jul 28 16:45 123.sh
924442 -rw-r--r--  1 root root       0 Jul 28 16:45 16:45:03
924444 -rw-r--r--  1 root root       0 Jul 28 16:45 2020.txt
924441 -rw-r--r--  1 root root       0 Jul 28 16:45 28

[root@dn42-bd ~]# find / -inum 924444
/root/2020.txt
ubuntu如何修改dns
    1、检查机器127.0.0.53的53端口是否监听(ss -tnl),要是没启动那么,你按照普通的修改就可以  /etc/resolv.conf
    2、要是监听了,就说明 systemd-resolved.service 这个服务启动了,所有的dns请求会被转发给他,如下是修改办法
        A、cat /etc/systemd/resolved.conf
[Resolve]
DNS=9.9.9.9             #主dns
FallbackDNS=8.8.8.8     #备dns
        B、systemctl restart systemd-resolved.service
华为服务器如何冷重置IPMI
    CLI界面:ipmcset -d reset

查看分区类型及其代码的列表(比如 linux的是83 , Linux LVM是8e,VMFS 是 fb 等等)
    sfdisk -T

centos如何保存yum 安装过的软件包
#第一:修改yum的配置文件未保存缓存
    vi /etc/yum.conf
keepcache=1

#第二:yum 安装软件后,查看缓存目录
    yum install tree -y
    #软件包存放目录/var/cache/yum/x86_64
    cd /var/cache/yum/x86_64/7/epel/packages    

centos5 yum源
            cat /etc/yum.repo/Centos-Bash.repo
    [base] name=CentOS-$releasever - Base
    baseurl=http://vault.centos.org/5.11/os/$basearch/ 
    gpgcheck=1 
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#centos7单网卡同时配置ipv4与ipv6并设置ipv6的网关
    DEVICE=eth0
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=89.42.1.12
    NETMASK=255.255.255.0
    GATEWAY=89.42.1.1
    IPV6INIT=yes
    IPV6_AUTOCONF=no
    IPV6ADDR=2001:0ac8:0021:0008:0000:0000:0ccd:a1d9/64
    IPV6_MTU=1500
    IPV6_DEFAULTGW=2001:ac8:21:8::1

#linux查看磁盘分区类型
[root@VM_0_6_centos ~]# partprobe -s
Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.
/dev/vda: msdos partitions 1
/dev/vdb: msdos partitions 1
#centos系统修改网卡mac地址(在/etc/rc.local中将eth0的mac地址改成00:0c:29:85:31:01)
    ifconfig eth0 down
    ifconfig eth0 hw ether 00:0c:29:85:31:01
    ifconfig eth0 up 

查看用密码登陆成功的IP地址及次数

#dabian系列
    grep "Accepted password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

#redhat
    grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
#使用sed调换两行的顺序
    sed '/lineONE/{h;d;};/LineTWO/G'
    可使用$?来获取返回参数,0:open,1:close.

从文件列表打包tar gz包
    #文件列表里保存一份需要打包的列表,然后将其打包成tar gz包。可以使用如下命令
    cat file_list | xargs tar -czvf 'test.tar.gz'

获取进程ID
    ps -ef | grep nginx | awk '{print $2}'
获取进程ID后批量kill
    ps -ef | grep nginx | awk '{print $2}' | xargs kill -9

#查看用密码登陆失败的IP地址及次数
    dabian系列
    grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

#不校验文件系统进行只读挂载
    mount -o ro,norecovery /dev/dm-0 /data0

#小技巧:去除pve登录弹窗,去除proxmox登录弹窗
    sed -i "s/data.status !== 'Active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

#同时移动多种类型的文件
    mv /tmp/*.{doc,pdf,txt} /root/123

#删除网卡上的某个IP地址
    ip addr del 192.168.1.104/24 dev enp0s3

#删除0字节文件
    find -type f -size 0 -exec rm -rf {} \;

#查看一个命令是否为shll的内置命令
    type -a command
    如:type -a scp

#查看http的并发请求数及其TCP连接状态:
    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

#踢掉远程登录的用户(先用w命名,查看pts)
    pkill -kill -t pts/1

#解决centos无法tab补全命令
    yum install bash-c* -y

#博客程序升级,避免手动输入yes,进行文件覆盖
    yes | cp ./wordpress/* /web-boke/html/ -ifr

#查看系统的安装时间
    方式一:tune2fs -l /dev/sda1 | grep create
    方式二:rpm -q basesystem --qf '%{installtime:date}\n'

#以sudo运行上一条命令
    sudo !!

#查看系统在过去一段时间是否有过重启
[root@izwz98ohezcyvm2tjptvw6z ~]# last reboot
reboot   system boot  3.10.0-862.9.1.e Sun Aug  5 08:54 - 00:55  (-7:-58)   
reboot   system boot  3.10.0-862.9.1.e Sun Aug  5 08:48 - 00:54  (-7:-54)   
reboot   system boot  3.10.0-862.9.1.e Sun Aug  5 08:09 - 00:48  (-7:-21)   
reboot   system boot  3.10.0-862.9.1.e Sun Aug  5 07:49 - 00:09  (-7:-39)

#删除linux的日志及操作记录
    history -cw
    echo > /var/log/wtmp //清除用户登录记录
    echo > /var/log/btmp //清除尝试登录记录
    echo> /var/log/lastlog //清除最近登录信息
    echo > /var/log/secure //登录信息
    echo > .bash_history
    history -cw

#打印行号
    cat -n  #
    cat -b  #看内容有多少行,空白行不编号,不显示

#检查端口是否开放
    nc -vuz 1.1.1.1 53      #查看UDP的53端口是否开放(感觉不太准)
    nc -vtz wsfnk.com 443   #查看TCP的443端口是否开放
    nmap -sU 175.102.134.107  -p 1701 -Pn   #测试1701端口是否开放(感觉不太准)

#查看目录大小(注意这里查看的是占用磁盘的大小,是最小单元的倍数)(与ls -lh 看到的真实大小不一样)
    du -sh /tmp

#让linux的CPU满载
    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done
    或则
    cat /dev/urandom | md5sum

#查看文件的inode号,并使用innode进行删除(适用于无法用文件名进行删除时)
    wsfnk@ThinkPad-E540:~$ ls -i
    4470596 id_rsa00          4456462 模板            4456465 音乐
    wsfnk@ThinkPad-E540:~$ find -inum 4470596 -delete

#设置history 历史命令时间戳
    vim /etc/profile  #(添加如下一行信息)

    export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  "

    #登出后再次进入,查看就会有时间戳(如下,但是之前的命令时间会维持不变)
   63  2017-08-30 13:50:19  ls
   64  2017-08-30 13:50:19  su -

#以HTTP方式共享当前文件夹的文件
    python -m SimpleHTTPServer
    python3 -m http.server
    #python是默认打开的8000端口

#python以匿名ftp的方式共享当前文件夹(注意ftp端口是2121)
    wget https://bootstrap.pypa.io/get-pip.py
    python get-pip.py
    pip install pyftpdlib
    python -m pyftpdlib
    #python -m pyftpdlib -i 192.168.100.49 -w -d /tmp/ -u test -P 123456        #这是搭建认证的ftp

    wget -r ftp://1.1.1.1:2121/boot/dasdasd/*  #这里linux客户端使用wget匿名下载ftp数据的方式

#centos查询某条命令是在由哪个软件包提供的(先查询命令由什么包提供,再安装对应的包即可)
    方式一:
        yum  whatprovides  */lspci
    方式二:
        yum provides lspci
        dnf provides lspci

#普通用户使用vim编辑保持系统文件
    :w !sudo tee %
    #让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入

#快速备份一个文件
    cp filename{,.bak}

#替换上一条命令中的一个短语
    ^foo^bar^

#记录linux字符界面下的操作到文件中,便于同事查看
    #开始将shell里的操作以日志的方式记录到文件test.txt中,
    script test.txt
    #注意按Ctrl+D就可以停止日志的记录,其他人,如何查看
    cat test.txt

    高级用法
    script -t 2>demo.time -a demo.logshell  #屏幕录像
    scriptreplay demo.time demo.log     #录像回放

    记录某个用户的操作
        vi ~/.profile
    script -t -f -q 2>$USER.time -a $USER.log

#将你在命令行编辑的命令放在vim中编辑
    用法:命令或则编辑的内容,后面按ctrl+x,然后按ctrl+e
    ls <ctrl+x> <ctrl+e>

#重置终端
    在中端无反应是敲入reset

#用SSH创建端口转发通道
    ssh -N -L2001:remotehost:80 user@somemachine
    #这个命令在本机打开了2001端口,对本机2001端口的请求通过somemachine作为跳板,转到remotehost的80端口上

#更友好的显示当前挂载的文件系统
    mount | column -t

#用 Wget 的递归方式下载整个网站
    wget --random-wait -r -p -e robots=off -U Mozilla www.example.com
    参数解释:
        - -random-wait 等待 0.5 到 1.5 秒的时间来进行下一次请求
        -r 开启递归检索
        -e robots=off 忽略 robots.txt
        -U Mozilla 设置 User-Agent 头为 Mozilla
        其它一些有用的参数:
        - -limit-rate=20K 限制下载速度为 20K
        -o logfile.txt 记录下载日志
        -l 0 删除深度(默认为5)
        --wait=1h 每下载一个文件后等待1小时

#显示当前目录中所有子目录的大小
    du -h --max-depth=1

#显示消耗内存最多的 10 个运行中的进程,以内存使用量排序
    ps aux | sort -nk +4 | tail

#简易计时器
    time ls /
    #表示记录显示ls / 这条命令执行所需要的时间
        real指整个程序对真实世界而言运行所需时间,
        user指程序在用户空间运行的时间,
        sys指程序对系统调用锁占用时间

#远程关掉一台WINDOWS机器
    net rpc shutdown -I IP_ADDRESS -U username%password

#利用中间管道嵌套使用SSH
    ssh -t host_A ssh host_B
    #用于不可直达,网络环境复杂时

#列出你最常用的10条命令
    history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

#linux使用tcp追踪路径信息
    traceroute 43.230.145.95 -p 80 -T

#用TELNET看《星球大战》
    telnet towel.blinkenlights.nl

#将光盘文件制作成iso文件
    dd if=/dev/cdrom of=/home/wsfnk/centos7.iso

#查看cpu的缓存(比如有多个物理cpu,要看他的一级二级三级缓存是共享的还是独享的)
    lscpu -p

#查看系统性能
    mpstat 
    mpstat 1    #表示每一秒刷新一次

#查看各个网卡的收发包情况
    ip -s link

#查看网卡实时流量
    dstat
    或者
    sar -n DEV 1 5

#定时任务文件crontab -e的文件在哪儿(对应用户名)
    /var/spool/cron/root    里
*/20 * * * * /usr/sbin/ntpdate kvm-ntp-dns 2>&1

#远程命令执行(执行完成将结果返回,立马退出)
    ssh root@192.168.1.141 w

#怎么让linux的ssh终端不掉线
    方法一:在linux系统中使用ssh连接远程服务器时,可以使用-o的一个参数ServerAliveInterval来设置防止超时的时间。
        ssh -o serveraliveinterval=60 root@192.168.1.12
    方法二:修改服务器配置
        vim /etc/ssh/sshd_config
    #添加或者修改ClientAliveInterval为“ClientAliveInterval 60”
    #这个参数的是意思是每1分钟,服务器向客户端发一个消息,用于保持连接。保存后记得重启ssh服务。

#查看所有进程的文件打开数
    lsof |wc -l

#查看某个进程打开的文件数
    lsof -p pid |wc -l

#非交互式修改密码(两种方法)
    echo “ldap001:1234”|chpasswd
    echo "1234"|passwd --stdin ldap001

#linux设置复杂密码,使用md5生成密码
    echo "root:`echo '12346' |md5sum |cut  -c1-10`+2" |chpasswd

#linux如何批量杀进程
    第一:批量获取进程ID
    ps -ef|grep nginx|awk '{print $2}'
    第二:批量杀进程
    ps -ef|grep nginx|awk '{print $2}'|xargs kill -9

linux下如何查看网卡属性,网卡速率

    mii-tool eth0       查看网卡状态
    ethtool eth0        查看网卡物理特性(网卡速率)
    ethtool -p eth0     确定网卡物理位置(多网卡服务器,该网卡灯会闪烁)
    ethtool -i eth0     查看网卡驱动信息
    ethtool -S eth0     查看网卡状态

    ethtool -m em0      查看网卡光功率(下面便是发射和接收功率)

    Laser output power                        : 0.5162 mW / -2.87 dBm
    Receiver signal average optical power     : 0.4702 mW / -3.28 dBm
#ip别名,单网卡如何设置多个ip解决方法之一
    ip addr add 192.168.1.2/24 dev eth0 lable eth0:0
    #或则
    ifconfig eth0:0 192.168.1.2/24 gw 192.168.1.1
    #若采用文件的方式永久添加逻辑接口ip,其中配置文件加上如下这句(表示有依附关系的)
    ONPARENT=yes

#linux禁止ping,centos禁ping(0表示允许,1表示禁止)
    方法一:
    echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all     #即时生效
    方法二:
    vim /etc/sysctl.conf
        net.ipv4.icmp_echo_ignore_all = 1
    sysctl -p   #刷新生效

#linux开启IP转发(作为网关时必须开启)(修改/etc/sysconfig/network)
    FORWARD_IPV4=yes/no
    可以通过cat /proc/sys/net/ipv4/ip_forward 来确认,1表示开启,0表示未开启

#查看网卡是否支持SR-IOV功能(英特尔网卡支持),并查看网卡是否开启IOMMU功能
    lspci -vv | grep -A 10 "Single Root I/O Virtualization"
    dmesg | grep IOMMU | grep enabled

#linux查看系统有无内存错误(测试只在部分真实主机上有用)
    [root@localhost ~]# grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count
    /sys/devices/system/edac/mc/mc0/csrow0/ch0_ce_count:8
    /sys/devices/system/edac/mc/mc0/csrow1/ch0_ce_count:4

linux添加路由表之centos7,采用iproute2工具集

#帮助使用格式
    ip help
    ip link help

#注意:什么时候用跟网关地址,什么时候需要跟出接口(via是网关,src用于单接口多IP地址的情况)
    ip route add default via 192.168.0.1 dev eno1
    ip route add 192.168.1.3 dev eno1
    ip route add 192.168.1.3/24 dev eno1
    ip route add 192.168.1.3/24 src 172.16.0.2 via 172.16.0.1  metric 100

#清空路由
    ip route flush 
#删除路由
    ip route del 192.168.1.3
    ip route del 192.168.1.3/24

#永久添加路由
    方法一:将命令写到/etc/rc.local,并且赋予/etc/rc.d/rc.local执行权限
    方法二:创建网卡路由文件
    [root@CQ ~]# cat /etc/sysconfig/network-scripts/route-enp0s3 
    172.0.0.0/8 dev enp0s3
    [root@CQ ~]# ip r
    172.0.0.0/8 dev enp0s3 proto static scope link metric 100 
    192.168.2.0/24 dev enp0s3 proto kernel scope link src 192.168.2.1 metric 100

linux添加路由表之centos6,采用net-tools工具集

    route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0   #添加一条静态路由
    route add default gw 192.168.0.1        #添加默认路由
    route add -net 224.0.0.0 netmask 240.0.0.0 reject       #屏蔽一条路由
    route del -net 192.168.1.0/24 gw 192.168.0.1    #删除一条路由
    route -n        #查看路由表

#永久添加路由
    方法一:将命令写到/etc/rc.local,并且赋予/etc/rc.local执行权限
    方法二:创建静态路由文件/etc/sysconfig/static-routes
    [root@CQ ~]# cat /etc/sysconfig/static-routes
    any net 192.56.76.0 netmask 255.255.255.0 dev eth0 
    any host 192.56.7.4 dev eth0 
微信打赏微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2022/11/20作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???