硅基俊宁.
Skills · 技能体系 ↗
← 返回文章

写给前端的 Linux 实战教程

俊宁 · 2020-03-28
迁自历史博客,保留原文、署名、引用与原始日期;文中的版本、成果与性能结论不代表重新完成了当前验收。
查看原始出处 ↗ · 查看迁移清单
写给前端的 Linux 实战教程封面

笔者使用的是 AliYun 服务器 ECS,镜像选择的是 Ubuntu,Ubuntu的详细版本信息是:Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64),如何购买云服务器不在本文讨论范围内,如果只是学习,那你完全可以使用 virtualbox 安装 Ubuntu。

# 连接服务器
$ ssh <username>@<hostname>
# 更新系统源
$ apt update
# 升级系统源
$ apt upgrade

必备环境及应用

Git

# 安装 git
$ apt install git

命令行配置

# 1、初始化设置
$ git config --global user.name 'youngjuning'
$ git config --global user.email 'youngjuning@aliyun.com'
# 2、将 `color.ui` 设置为 `auto` 可以让命令的输出拥有更高的可读性。
$ git config --global color.ui auto
# 3、git 记住用户名和密码
$ git config --global credential.helper store
# 4、core.autocrlf
$ git config --global core.autocrlf input

Linux或Mac系统使用LF作为行结束符,因此你不想 Git 在签出文件时进行自动的转换;当一个以 CRLF 为行结束符的文件不小心被引入时你肯定想进行修正,把 core.autocrlf 设置成 input 来告诉 Git 在提交时把 CRLF 转换成 LF,签出时不转换: 这样会在 Windows 系统上的签出文件中保留 CRLF,会在 Mac 和 Linux 系统上,包括仓库中保留 LF。

Java

# 安装 jre、jdk
$ apt install openjdk-8-jre-headless openjdk-8-jdk-headless

Node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。我们使用 n 模块来维护 Node 的版本:

$ apt install nodejs npm build-essential
$ sudo npm install -g npm n
# 安装最新版
$ sudo n latest
## 其他命令##
# 安装指定版本
$ sudo n 10.16.0
# 安装最新的稳定版
$ sudo n lts
# 删除指定版本
$ n rm 12.10.0
# 除去当前版本以外的所有缓存版本
$ n prune

oh-my-zsh

修改 ~/.zshrc 之后都需要执行 source ~/.zshrc 命令使之立即生效

echo $SHELL 可以查看当前 Shell

vim

建议使用:https://github.com/amix/vimrc

$ git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
$ sh ~/.vim_runtime/install_awesome_vimrc.sh
$ echo "set number" >> ~/.vimrc
$ echo "set showcmd" >> ~/.vimrc
$ source ~/.vimrc

目录

常用命令

Linux命令搜索引擎:https://git.io/linux

文件管理

文件目录操作

权限管理

正则表达式和数据操作

grep: 筛选数据

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

规则表达式

^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$    # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
.    # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
*    # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.*   # 一起用代表任意字符。
[]   # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^]  # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\)  # 标记匹配字符,如'\(love\)',love被标记为1。
\<      # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\>      # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\}  # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\}   # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\}  # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w    # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W    # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b    # 单词锁定符,如: '\bgrep\b'只匹配grep。

sort 文件排序

对文本文件中所有行进行排序。

主要用途

wc 文件统计

统计文件的行数、字数、字节数

wc命令 统计指定文件中的字节数、字数、行数,并将统计结果显示输出。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。wc同时也给出所指定文件的总统计数。

uniq: 删除文件中的重复内容

显示或忽略重复的行。uniq 命令有点”呆“,只能将连续的重复行变为一行

主要用途

cut: 剪切文件的一部分内容

连接文件并打印到标准输出设备上

输出重定向

黑洞文件 /dev/null,此文件具有唯一的属性,它总是空的。它能使发送到 /dev/null 的任何数据作废

> 重定向到文件

>> 重定向到文件末尾

>>的作用与>是类似的,不过它不会像>那么危险。它会将重定向的内容写入到文件末尾,起到追加的作用。如果文件不存在,则创建文件

2> 、2>>重定向到标准错误输出

$ cat not_exist_file.csv > results.txt 2> errors.log

2>&1 组合符合

stdin、stdout、stderr

输入重定向

< 从文件中读取

<< 从键盘读取

| 管道符号

将一个命令的输出作为另一个命令的输入

进程和系统监测

glances

$ apt install glances -y
原图暂不可用:查看原始图片链接

htop

$ apt install htop -y
原文配图

管理前后台进程

原文配图

& 符号:后台运行进程

nohup: 使进程与终端分离

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。hangup,挂起

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

Ctrl + Z、bg 进程转为后台运行

jobs:显示后台进程状态

fg:使进程转为前台运行

文件的解压和压缩

定时和延时执行

date:显示或设置系统时间与日期

at:在指定时间执行一个任务

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(明天)来指定完成命令的时间。

atq:列出当前用户的at任务列表

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

atrm:删除待执行任务队列中的指定任务

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

sleep:将目前动作延迟一段时间

&&、||、;

crontab 提交和管理用户的需要周期性执行的任务

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

m h dom mon dow command

  • 顺序口诀:分 时 日 月 周

  • m:minute 的缩写,表示”分钟“(0~59)

  • h:hour 的缩写,表示“小时”(0~23)

  • dom:day of month 的缩写,表示“一个月的哪一天”(0~31)

  • mon:month 的缩写,表示”月份“(1~12)

  • dow:day of week 的缩写,表示“星期几”(0~6,星期日是0)

  • command:英语“命令”的意思,表示需要定时执行的命令

特殊字符:

实例

一定要换行,不换行不会生效的 重启 cron 服务:systemctl cron.service restart

每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

*/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

SSH

服务端 config 文件的常用配置参数

客户端 config 文件的配置

$ nano ~/.ssh/config
Host aliyun
  HostName 47.98.152.68
  Port 22
  User root
$ ssh aliyun

配置免密码登录

  1. 在客户机中生成密钥对(公钥和私钥)

    ssh-keygen -t rsa -C "youngjuning@aliyun.com"

    • 在 ~/.ssh/ 目录下,会新生成两个文件

      • id_rsa:私钥
      • id_rsa.pub:公钥
  2. ssh-copy-id:把本地的 ssh 公钥文件安装到远程主机对应的账户下

    $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@47.98.152.68
    

    ssh-copy-id命令 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id 命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。

    • -i:指定公钥文件

设置免密码后仍想使用密码登录:

$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no root@47.98.152.68

测试Github是否正确配置免密码登录:

ssh -T git@github.com

Linux 网络

wget:Linux系统下载文件工具

wget命令 用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

用于从网络上下载资源,没有指定目录,下载资源回默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

  1. 支持断点下传功能 这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;
  2. 同时支持FTP和HTTP下载方式 尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;
  3. 支持代理服务器 对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
  4. 设置方便简单 可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
  5. 程序小,完全免费 程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的。

scp:加密的方式在本地主机和远程主机之间复制文件

scp命令 用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

$ scp file.txt root@192.168.2.195

netstat -ntulp | grep 9001

查看端口占用情况

rsync:远程数据同步工具

rsync命令 是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

用 rsync 备份到同一台电脑的其他目录:

$ rsync -arv Images/ backups

用 rsync 备份到同步本地文件到服务器:

$ rsync -arvz --progress --delete ~/Desktop/blog root@47.98.152.68:/home/yangjunning/

备份到七牛云

安装命令行工具(qshell)

  1. 进入家目录:cd ~
  2. 下载压缩包:wget http://devtools.qiniu.com/qshell-linux-x86-v2.4.1.zip
  3. 解压压缩包:unzip ~/qshell-linux-x86-v2.4.1.zip
  4. 任何位置运行:mv ~/qshell-linux-x86-v2.4.1 /usr/local/bin/qshell
  5. 权限:chmod +x /usr/local/bin/qshell
  6. 删除压缩包:rm -rf ~/qshell-linux-x86-v2.4.1.zip

密钥设置

需要鉴权的命令都需要依赖七牛账号下的 AccessKey 和 SecretKey。所以这类命令运行之前,需要使用 account 命令来设置下 AccessKey ,SecretKey 。

$ qshell account -- ak sk name

注意:ak、sk 在七牛云控制台 -> 个人中心 - > 密钥管理内。

可以连续使用 qshell account 添加账号ak, sk, name信息,qshell会保存这些账号的信息, 可以使用qshell user命令列举账号信息,在各个账号之间切换, 删除账号等

账户管理

使用qshell user子命令可以用来管理记录的多账户信息。

  1. qshell user ls可以列举账户下所有的账户信息
  2. qshell user cu 可以用来切换账户
  3. qshell user cu 不携带的话会切换到最近的上个账户;比如我在A账户做完操作后,使用qshell user cu B到了B 账户,那么使用qshell user cu可以切回到A账户

qupload2

同步数据到七牛空间, 带同步进度信息,和数据上传完整性检查(命令式),详情请查看文档

$ qshell qupload2 --src-dir=/root --bucket=aliyun-server-backup