怎么在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系统上一个特殊的设备文件,可以将任何命令的标准输出(不管是标准输出还是错误输出)清除掉。

在manjaro中修复deepin-wine-wechat对话框输入中文乱码的问题

最近在manjaro上安装了deepin-wine-wechat,毕竟生活中用微信还是挺多的,但腾讯貌似短期内并没有将微信移植到linux桌面平台的打算,所以,作为替代方案,只能使用deepin基于wine定制的微信客户端

首先GNU/Linux操作系统作为一款世界流行的操作系统,其稳定性和可定制性都是非常优秀的。但由于众多linux发行版大部分都是从国外发展起来的,虽然近几年来国内也有几家比较优秀的linux厂商,但终究起步别别人晚,所以还是有很多需要提升的地方。对于打着国产操作系统旗号的Deepin团队而言,想要在国内推广他们定制的Deepin Linux发行版,首先在通讯软件方面就要能够提供最常用的几款即时通讯软件的移植版,毕竟国内通讯软件市场还是腾讯一家独大,奈何鹅厂迟迟不将linux平台的QQ、微信的开发提上日程,而目前能够最大限度移植Windows程序到linux上执行的莫过于使用Wine了。所以,基于Wine提供linux版的微信和QQ也成为了最为方便快捷的选择。

这次安装完deepin-wine-wechat之后,正常启动没问题,但当我打开和好友聊天的对话框时发现我输入的中文在内容栏里面都变成了一个个空心的小方块。但当我将消息发送出去之后,我的消息又变成了正常的中文。经过查找资料后发现,是因为wine模拟的windows环境里面缺少了宋体的字体文件,所以,只需要将宋体文件复制到对应的字体目录下就可以了。步骤如下:

1
2
3
1.下载宋体字符集文件:https://www.freefonts.io/downloads/simsun/
2.将解压后的文件复制如下路径:cp ~/Downloads/SIMSUN.ttf ~/.deepinwine/Deepin-WeChat/drive_c/windows/Fonts/
3.重启微信即可解决。

使用netcat工具在两台linux主机之间通信

为什么我们不使用当下流行的即时通讯工具在PC间通信或者传输文件

目前国内使用率最高的两款即时通讯工具莫过于鹅厂的两款工具——微信和QQ。因为某些众所周知的原因,这两款工具在linux平台要么直接没有,要么只有一个复古的阉割版,功能少的让人怀疑是不是鹅厂直接把10年前的产品直接拿来用了。基于这些现实的问题,对于linux用户来说,其实可替换方案也不是没有,最好的办法就是使用telegram,但在中国,这种方案并不是人人都能够直接拿来用,最直接的原因就是使用这款软件必须要学会科学上网(比如访问谷歌或者油管)。而科学上网在中国处于法律的灰色地带,一般人没有途径也不愿意承担这样的风险。那么作为一名linux用户,只要具备基本的使用命令行的能力,其实方法还是有很多的。这里介绍一种非常方便而且直观的通讯工具——netcat,供大家参考。

netcat是个什么样的工具

netcat是一款网络工具,可以在基于TCP和UDP网络连接的基础上执行读写操作。

它被设计为一个可靠的后端工具,可以直接在其他程序或者脚本中被使用。同时,它还是一个用来调试和探测网络的工具。因为它可以创建几乎所有你可能需要的连接类型。

netcat有哪些特性

  • 流出和流入连接:例如来自基于TCP或者UDP的任意端口的连接。
  • 隧道模式:它允许创建特殊的隧道,如 UDP 到 TCP,并且可以指定所有网络参数(源主机端口/接受主机端口、监听端口/接口和允许连接到隧道的远程主机)。
  • 使用随机发生器进行端口扫描
  • 高级使用选项:例如传输和接收数据的缓冲发送模式(每 N 秒一行)和 hexdump(到 stderr 或到指定文件)。
  • 可选的 RFC854 telnet 代码解析器和响应器。

如何将netcat作为一款即时通讯工具呢

  1. 首先,我们需要在需要建立通讯的主机上安装netcat工具,使用linux自带的包管理器安装即可。

  2. 然后选择一台已经安装好netcat的机器,在终端中执行如下命令:

    1
    nc -l -vv -p 12345

    其中-lp表示在本机的12345端口进行监听,并创建一个TCP连接。-vv表示尽可能的展示运行过程中的系统消息,-p表示要监听的端口号。

  3. 选择要与监听主机建立连接的机器,在终端中执行如下命令:

    1
    nc 步骤2中创建监听的主机ip 步骤2中创建的监听端口
  4. 执行完2、3之后,一条连接已经创建完成,可以开始互发消息了。

需要注意的是,连接双方发送的消息会全部展示在各自的屏幕上,如果有多于两个以上的连接方则无法区分消息的来源。

使用netcat传输文件

netcat还可以用来传输文件

  1. 对接收方执行如下命立:

    1
    nc -l -vv -p 12345 > received_file
  2. 在发送方执行如下命令

    1
    nc 接收方的ip地址 12345 < received_file

需要注意的是,这里创建监听的动作是由接收方发起的,而发送方需要和接收方建立连接并发送文件。

archlinux安装指南

Arch Linux是什么

Arch Linux是一款滚动更新的GNU/Linux发行版,致力于提供最新的稳定版软件,相较于其他图形界面的发行版,Arch Linux只能在命令行界面进行安装,且默认不带任何桌面环境。(非特别说明,后文将GNU/Linux简称为Linux)

Arch Linux有什么优势

相较于其他基于Debian或者Redhat的发行版,Arch Linux提供了自己的包管理器——pacman,而且支持用户软件仓库(AUR)。基于这个特性,大大增加了Arch Linux系统原生软件的数量。而良好的软件生态正是Arch Linux的一大利器。

Arch Linux的安装

对于大部分非专业人士而言,习惯了Windows的图形界面之后,突然使用命令行操作软件往往变得非常困难,更不用说安装系统了,尽管Arch Linux拥有详细的由社区维护的安装指南Wiki,但也因此劝退了一些习惯了windows之后想要尝试linux系统的新手,基于此,本文特地将自己安装Arch Linux过程中的经历以及出现的问题做个说明,作为Arch Linux安装wiki的补充,不失为帮助更多的人能够接触到linux的一种方法(windows固然很优秀,但自由/开源软件才是软件开发的未来)。

1、获取最新版镜像

官方下载网站:https://archlinux.org/download/

2、制作启动盘

准备一个空的U盘,和一台已安装好linux系统的机器,使用如下命令进行写盘:

1
sudo dd bs=4MB if=你的安装镜像路径 of=你的U盘路径 status=progress

of参数通常是/dev/sdb,其中sdb是你的U盘路径,注意不要带数字后缀,类似sdb1。另外,写盘之前必须使用umount命令卸载的U盘(如果被自动挂载的话)。

3、从U盘启动,开始安装

需要注意的是,为了确保可以正常从启动盘引导,需要关闭主板的安全启动选项(可以在安装完成之后重新打开),关闭方式因主板厂商不同而有所差异。具体如何关闭可以自行百度。

重启主机之后,进入BIOS或者直接通过功能键选择启动顺序,将USB设备作为第一启动项,启动之后选择Arch Linux install medium进入系统安装界面。

4、验证启动模式

如果使用的是UEFI模式,则可以使用如下命令验证:

1
ls /sys/firmware/efi/efivars

如果命令正常打印出一系列文件和目录,且没有任何错误,则表明当前是以UEFI模式启动。否则则是以BIOS或者CMS模式启动。

5、联网

一般来说,我们可以直接插入网线联网,或者使用外置网卡。比如手机的USB网络共享。

6、调整时区

使用timedatectl可以查看并设置时区。

1
2
3
4
5
6
# 启用ntp(网络时间协议)
timedatectl set-ntp true
# 列出当前可用的时区
timedatectl list-timezones
# 设置选择的时区
timedatectl set-timezone Asia/Shanghai

7、磁盘分区

查看当前可用磁盘

1
fdisk -l

选择将要使用的磁盘,假设是/dev/sda,执行如下命令

1
fdisk /dev/sda

进入分区界面之后,使用m查看具体的分区指令。一般步骤如下:

1
2
# 创建分区表

bash中的常用快捷方式

alt为辅助键的快捷键

  1. alt+A 跳转到行首
  2. alt+B 跳转到光标后面一个单词长度的位置
  3. alt+C 中断bash中正在执行的任务
  4. alt+D 删除位于光标后面的所有字符
  5. alt+F 移动到光标前面一个单词长度的位置
  6. alt+T 交换光标位置前后的两个单词的位置
  7. alt+U 将位于光标位置后面的第一个单词全部转换成大写字母
  8. alt+L 和alt+U相反,将位于光标位置后面的第一个单词全部转换成小写字母
  9. alt+R 撤销当前命令所有的改变(等同于清空当前所有手动输入过的字符)
  10. alt+. 使用上一个命令的最后一个单词(以空格来区分)

ctrl为辅助键的快捷键

  1. ctrl+A 移动到行首
  2. ctrl+B 向光标后面移动一个字符
  3. ctrl+C 终止正在执行的任务
  4. ctrl+D 向光标后面删除一个字符
  5. ctrl+E 移动到行尾
  6. ctrl+H 删除光标前面的一个字符,相当于退格键
  7. ctrl+J 相当于enter
  8. ctrl+K 删除所有位于光标后面的字符
  9. ctrl+L 清空屏幕
  10. ctrl+R 查询历史命令
  11. ctrl+O 执行ctrl+R查询出来的命令
  12. ctrl+T 交换最后两个字符
  13. ctrl+U 删除位于光标位置前的字符
  14. ctrl+W 删除光标位置前的一个单词

其他

  1. !! 重复执行上一条命令
  2. ESC+T 交换最后两个单词的位置

gzip操作手册

gzip工具

gzip采用了最流行的压缩算法,可以让你缩小文件的大小,并且保留原始的文件模式,属主和时间戳。
使用gzip工具压缩的文件一般使用.gz的文件名后缀,并且gzip也可以用来解压缩文件。

命令格式以及说明

通常的语法格式如下:

1
gzip [可选项] ... [文件]...

gzip只能压缩单个文件,并为给定的文件创建一个压缩之后的文件。根据惯例,压缩之后的文件的命令一把使用.gz或者.z
如果你想将多个文件或者目录压缩到一个文件中,首先你需要创建一个tar包,然后对这个tar包进行压缩。这样的文件一般会使用.tar.gz或者.tgz作为后缀来表明这个文件是使用了gzip压缩之后的tar包。
gzip最常用作压缩文本文件,tar包或者网页,尽量不要使用gzip去压缩图片,音频,pdf文档或者其他的二进制文件,因为他们已经被压缩过了。
gzip只能压缩常规文件,符号链接文件会被忽略。

使用gzip压缩文件

  • 不带任何参数的压缩
    1
    gzip 你的文件
    该命令将会创建一个你的文件.gz文件,然后删除原始文件。
    默认情况下,gzip会保留原始文件的时间戳,模式,属主和文件名。
  • 保留原始文件
    1
    gzip -k 你的文件
    另外一种保留原始文件的方法是使用-c选项,告诉gzip将原始文件写入到标准输出,然后重定向到指定的文件
    1
    gzip -c 你的文件 > 你的文件.gz
  • 查看冗余信息
    1
    gzip -v 你的文件
    该命令将会输出压缩进度信息
  • 压缩多个文件
    1
    gzip 文件1 文件2 文件3
    该命令将会生成文件1.gz文件2.gz文件3.gz这3个文件。
  • 压缩目录
    1
    gzip -r 你的目录
    该命令会递归压缩你的目录下的所有文件,分别生成.gz文件。
  • 改变压缩等级
    gzip允许我们指定文件的压缩等级,范围是1-9,而-1或者--fast则代表使用最小的压缩率以达到最快的压缩速度;而-9或者--best则代表使用最高的压缩率,相应的,也会有最慢的压缩速度。默认的压缩级别是6;
    1
    gzip -9 你的文件
    压缩是CPU密集型的任务,压缩等级越高,压缩过程越长。
  • 使用标准输入
    为了从标准输入创建.gz文件,使用管道命令重定向到gzip。
    1
    mysqldump database_name | gzip -c > database_name.sql.gz
    该命令将会把mysqldump的输出内容作为输入传递给gzip。

使用gzip解压缩

  • 使用-d作为解压缩选项
    1
    gzip -d 你的文件.gz
    另一个可以用于解压缩的命令是gunzip,它可以算作是gzip -d的别名。
    1
    gunzip 你的文件.gz
  • 保留原始压缩文件
    1
    gzip -dk 你的文件.gz
  • 解压缩多个文件
    1
    gzip -d 你的文件1.gz 你的文件2.gz 你的文件3.gz
  • 解压缩目录下的所有压缩文件
    1
    gzip -dr 你的目录
  • 查看压缩文件的内容
    1
    gzip -l 你的文件
    使用-v可以得到更加详细的信息。

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 = 计算器启动时执行