怎么在linux上清除命令的输出内容

1
$ ls -al > /dev/null 2>&1

执行上面的命令之后你会发现终端没有任何输出,为什么会这样呢?

继续执行下面的命令

1
$ ls -qwer > /dev/null 2>&1

发现还是没有任何输出,即使该命令是错误的。

造成这一切的根源在于命令最后面的2>&1

我们知道/dev/nulllinux系统上的伪设备文件,可以被用来消除来自程序的输出。尤其是对于命令行程序而言有更大的意义。

/dev/null看起来像是一个水漕,比如说一个可写的目标文件,然而只要有任何数据流被写入这个文件,都会被马上删除。

当用户不需要来自程序的输出信息时,这个命令是有用的。因为程序可能会生成大量的输出内容,而这会给分析日志的工作带来混乱。

对于/dev/null 2>&1命令,2在linux上代表STDERR(标准错误输出),而1则代表STDOUT(标准输出)。因此,这个命令的最终解释就是将标准错误输出和标准输出重定向到/dev/null,即消除这两种类型的输出。

我们再来具体分析下这个命令的构成,首先>表示重定向,而被重定向的对象则是/dev/null。而不是打印到终端。

这是否意味着该命令所有的输出都会被重定向到/dev/null呢,并不是,因为它只会重定向标准输出。

因此,还需要加上2>&1。表示将2(标准错误输出)重定向到1(标准输出)。那么&代表什么意思呢?如果不加上&的话,标准错误输出将会输出到名字为1的文件中。而&会告诉系统1不是一个文件,而是一个标准输出描述符号。

最后,我们将标准输出和标准错误输出都重定向到了/dev/null。而/dev/null会将所有的输出内容全部清除掉。

小结:/dev/null是linux系统上一个特殊的设备文件,可以将任何命令的标准输出(不管是标准输出还是错误输出)清除掉。

在linux系统终端查看硬件信息

使用如下命令查看包括CPU、内存、硬盘、主板在内的各种硬件相关的信息

  • CPU型号

    1
    cat /proc/cpuinfo | grep "model name" | uniq
  • 查看CPU物理个数

    1
    cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
  • 查看内存信息

    1
    2
    3
    # 先安装工具软件,以archlinux为例
    sudo pacman -S dmidecode
    sudo dmidecode -t memory | grep Size
  • 查看内存条厂家

    1
    sudo dmidecode -t memory | grep Manufacturer
  • 查看硬盘信息

    1
    fdisk -l | grep "Disk /dev/sd"
  • 查看主板信息

    1
    sudo dmidecode | grep -A16 "System Information$"

linux上的实用软件清单(个人用)

为什么要列这个清单

在使用gnu linux(后面均简称为linux)操作系统的过程当中,总有一些软件让你觉得即使没有windows也能让自己的工作和生活变得更加便利,因此,为了方便后面因为更换发行版或者因为不可控因素导致系统损坏而必须重新安装linux系统,特别将自己平时用的比较多的软件列出来以供后面安装新系统之后能够快速恢复到正常工作和生活状态。个人觉得,对于linux用户来说,相对于windows系统中软件来源的不可控性和零散性,linux系统自带的包管理器绝对是节约我们软件安装时间的一大利器。而且更便于自动化安装和初始化,而作为软件开发者,良好的编程环境更是完胜windows系统。也希望这个清单能让自己在今后的软件开发生涯中更加注重时间的重要性,不要浪费时间在一些无意义的折腾上,毕竟,系统是拿来用的,高效才是操作系统带给我们最终的目的。

以下包管理器均采用archlinux内置的pacman

翻译类软件

  1. 带gui的:goldendict、stardict(星际译王)
    1
    2
    3
    sudo pacman -S goldendict
    # 或者
    sudo pacman -S stardict
    字典下载链接
阅读更多

docker使用手冊

启动docker实例

1
sudo docker start 你的镜像名称

关闭docker实例

1
sudo docker stop 你的镜像名称

查看所有的本地镜像

1
sudo docker ps -a

或者带上选项q则只会列出容器id(类似369a959e3402)

查看指定命令的帮助手册(有哪些可用选项)

1
docker 你的命令 --help

安装镜像

1
docker pull 镜像名

安装并启动镜像

1
docker run -it --name <容器名称> --hostname <容器主机名> -p 15672:15672 -p 5672:5672 镜像名称

注意,该命令会先在本地查找镜像是否已经存在,如果不存在,则从远程仓库下载,并创建该镜像的一个实例。其中,–name用来指定被创建容器的名称,–hostname被用来指定被创建容器的主机名,-p被用来映射容器端口和本地运行环境端口,最后的镜像名称为远程仓库中已存在的镜像名;-it,其中的i表示交互式运行,t表示开启一个伪终端。

删除指定的容器实例

1
docker rm 容器名称或者容器id

挂载本地目录,并映射到容器内的存储目录

1
docker run -it --name mongo -v /mongodb/data/db:/data/db -p 27017:27017 -d mongo:latest

该命令使用-v选项(volumn)将本地目录/mongodb/data/db挂载到容器内的目录/data/db,并使用-d选项将容器实例以后台进程的形式运行。

进入容器实例内部

1
docker exec -it mongodb bash

该命令会开启一个新的bash shell,而该bash shell对应的是容器内的环境。

linux下使用crontab工具设置定时任务

使用crontab添加定时任务

crontab -e

cron的格式说明

分钟 小时 月中日 月份 周中日 你的自动化脚本
取值范围:
分钟:0-59
小时:0-23
月中日:1-31
月份:1-12
周中日:0-6

在指定的时间点调度

30 08 10 12 * /home/pengkai/myjob.sh
上面的调度器会在12月10号的上午8点30分执行myjob.sh脚本。
注意,上面最后一个位置使用了*号来表示一周中的每一天。因为已经指定了具体的月日,所以不必再限制那一天是星期几。

查看当前用户下的所有调度任务

1
$ crontab -l

或者以root用户查看其他用户的任务

1
# crontab -u kyle -l

每分钟执行一次调度

1
* * * * * 你的脚本

一天执行两次

1
* 12,20 * * * 你的脚本

上面的命令会分别在中午12点晚上8点执行你的脚本

指定起止时间并按照固定间隔执行

1
08-20 * * * 你的脚本

上面的命令会从8点开始执行,然后间隔一个小时再次执行,最后一直到晚上8点截止。

只在工作日的工作时间内执行

1
00 09-18 * * 1-5 你的脚本

从周一开始,每天从上午9点开始执行,然后每隔一个小时再次执行,最后一直到下午6点截止。如此往复到周五晚上6点停止执行。下周继续。

每隔10分钟执行一次

1
*/10 * * * * 你的脚本

使用特殊字符指定调度周期

cron支持的特殊字符
@yearly = 0 0 1 1 * :每年的1月1日执行
@daily = 0 0 * * * : 每天的0点执行
@monthly = 0 0 1 * * :每个月的1号的0点执行
@hourly = 0 * * * * :每个小时执行一次
@reboot = 计算器启动时执行

curl命令常见用法

发送post请求

  • 参数类型为application/json
  1. 常规用法:

    1
    curl -d '{"key1":"value1", "key2": "value2"}' -H "Content-Type: application/json" -X POST http://localhost:8080/your_interface_name
  2. 使用json文件:

    1
    curl -d "@data.json" -X POST http://localhost:8080/your_interface_name

    data.json


    1
    2
    3
    4
    {
    "key1": "value1",
    "key2": "value2"
    }
  • 参数类型为application/x-www-form-urlencoded
  1. 常规用法:

    1
    curl -d "param1=value1&param2=value2" -X POST http://localhost:8080/your_interface_name
  2. 使用data文件:

    1
    curl -d "@data.txt" -X POST http://localhost/your_interface_name

    data.txt


    param1=value1&param2=value2

  • 发送GET请求
  1. 常规用法:

    1
    curl -X GET http://localhost:8080/user/info?id=1

    如果需要显示响应头信息,则可以加上-i参数。

如何使用openssh进行远程连接

SSH连接的建立方式

ssh可以通过密码和密钥(更加安全)这两种方式建立起客户端与 服务端的连接。

SSH连接的实现过程(假设通过密钥的方式连接)

  1. 当客户端发起一个ssh连接请求时,它首先会告诉服务端需要使用的公钥;
  2. 然后服务端会检查它的~/authorized_keys文件,这个文件中包含了所有已经保存的客户端公钥,一个公钥占据一行,这些公钥所对应的客户端可以实现免验证登录。
  3. 服务端如果在文件中找到了请求客户端所对应的公钥,就会生成一个随机字符串,并使用找到的公钥进行加密。这个加密后的信息只能被请求客户端的私钥所解密,然后服务端将这个加密后的字符串发送给请求客户端,以此来验证该客户端是否拥有私钥。
  4. 客户端收到来自服务端的加密字符串之后,会立即使用自己的私钥进行解密,并将解密后的随机字符串与之前协商好的会话id结合,生成一个md5加密的hash值,并回传给服务端。
  5. 由于服务端已经知道加密之前的随机字符串和会话id,因此,服务端会在本地将这个随机字符串和会话id进行hash,然后和客户端传过来的值进行比较,如果一致,则表示请求客户端确实拥有私钥,并允许建立连接。
阅读更多