在我看来,Linux是一个对软件开发非常友好的操作系统。它去除了很多windows下的杂质,保留了非常干净的系统。Mac系统也是与它有很多相似的地方,才这样好用。

  

下载与安装

​ 以linux为内核的有Ubuntu,Debian、Centos,操作方式大同小异

​ 因为linux是开源系统,所以在百度或者谷歌直接搜索ubuntu16.0,就能找到安装包。安装的时候找阿里镜像源,会下载的快一些。

修改镜像源和网络

清华大学镜像源网站:https://mirrors.tuna.tsinghua.edu.cn/

常用命令

查看进程

ps aux
ps -elf

查看端口状态

lsof -i:端口号
##查看tcp udp端口和进程等情况
netstat -tunlp | grep 端口号
netstat -ntlp ## 查看当前所有tcp端口
netstat -ntulp | grep 80 ##查看所有80端口使用情况
netstat -l ##只显示监听端口
netstat -lt ## 只列出所有监听TCP端口
netstat -lu ## 只列出所有监听UDP端口
netstat -lx ## 只列出所有监听UNIX端口
netstat -pt ## 在netstat输出中显示PIC和进程名称
netstat -an | grep ':80' ##找出运行在指定端口的进程

服务器常用端口

21 ftp ftp服务器所开放的端口,用于上传下载

22 ssh 22端口就是ssh端口,用于通过命令行模式远程连接Linux系统的服务器

25 SMTP SMTP服务器所开放的端口,用于发送邮件

80 HTTP 用于网站服务例如IIS、Apache、Nginx等提供对外访问

113 POP3 110端口是为POP3服务开放的

143 IMAP 143端口主页用于Internet Message

443 HTTPS 网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP

3306 MySQL 3306端口是MySQL数据库的默认端口,用于MySQL对外提供服务

8080 代理端口 8080端口同80端口,是被用于www代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器时会加上8080端口,此外Apache Tomcat web server默认服务端口就是8080

清除端口进程

kill [信号] PID//pid号

kill信号

kill -0:程序退出时收到该信息
kill -1:挂掉电话线或者终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化
kill -2:表示结束进程,但不是强制性的,常用的ctrl+c就是发出一个kill -2命令
kill -3:退出
kill -9:杀死进程,即强制结束进程,有可能会导致程序崩溃等
kill -11:段错误
kill -15:正常结束进程,是kill命令段默认信号

删除文件/文件夹

rm -f filename

rm -rf filename

set

set命令用于设置shell

关机/重启

## 立即关机
shutdown -h now
## 10分钟后关机
shutdown -h 10
## 立刻关机
power off
## 重启
reboot
## 重启
shutdown -r now

传输文件

## 从服务器上下载文件
scp username@servernama:/path/filename /var/www/local_dir

## 上传文件到服务器
scp /path/filename username@servernama:/path

## 下载目录
scp -r username@servernama:/path/ /var/www/local_dir

## 上传目录
scp -r /var/www/local_dir username@servernama:/path

修改文件

sed 's/properties/property/g' build.xml
## 批量替换
grep -ilr 'log(' *|xargs-|@ sed -i "'s/print(///Log(/g'@
## 
sed -i "s/hello/hi/g" test.txt
## 删除行首空格
sed -i 's/^ //g'test
## 删除行尾空格
sed -i 's/$//g' test
## 替换当前目录中所有含有hello字符的文件中的hello为hi
sed -i "s/hello/hi/g" `grep "hello" -rl ./`
## 批量操作当前目录以m开头的文件
sed -i 's/foo/bar/g' ./m*
## 查找所有子目录中m开头的文件并进行替换
sed -i 's/foo/bar/g' `grep foo -rl --include="m*" ./`

systemd

历史上,linux的启动一直采用init进程

init进程有两个缺点:

启动时间长、启动脚本复杂

systemd就是为解决这个问题而生的,d是守护进程daemon的缩写。

systemd取代了initd,成为了系统的第一个进程(pid等于1),其他进程都是它的子进程

systemd的优点是功能强大,使用方便,缺点是体系庞大,非常复杂

systemd的常用命令

## 重启系统
sudo systemctl reboot
## 关闭系统,切断电源
sudo systemctl poweroff
## cpu停止工作
sudo systemctl halt
## 暂停系统
sudo systemctl suspend
## 让系统进入冬眠状态
sudo systemctl hibernate
## 让系统进入交互式休眠状态
sudo systemctl hybrid-sleep
## 启动救援状态
sudo systemctl rescue

查看本机信息

## 查看当前主机信息
hostnamectl

## 设置主机名
sudo hostnamectl set-hostname rhel7

## 查看本地化设置
localectl

## 设置本地化参数
sudo localectl set-locale LANG=en_GB.utf8
sudo lccalectl set-keymap en_GB

## 查看当前登陆的用户
loginctl list-users

## 列出当前session
loginctl list-sessions

## 列出显示指定用户的信息
loginctl show-user ruanyf

## 查看当前时区设置
timedatectl 

## 显示所有可用的时区
timedatectl list-timezones

## 设置当前时区
sudo timedatectl set-timezone America/New_York
sudo timedatectl set-time YYYY-MM-DD
sudo timedatectl set-time HH:MM:SS

查看Unit信息

nohup命令

nohup命令用于在后台不挂断地运行命令,挂起进程,退出终端不会影响程序的运行

nohup命令在默认情况下,也就是非重定向时,会输出一个名叫nohup。out的文件到当前目录,如果当前目录到nohup。out文件不可写,输出到HOME/nohu。pout文件中

nohup ./nebula-httpd &

node应用的systemd启动

创建配置文件,后缀为service

[Unit]
Description=node simple server

[Service]
##启动命令
ExecStart=
Restart=always
User=nobody
Group=nobody
Environment=PATH=/usr/bin:/user/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/tmp/node-systemd-demo

[Install]
WantedBy=multi-user.target

将配置文件拷贝到systemd之中

sudo cp node-server.service /etc/systemd/system

重载配置文件

sudo systemctl daemon-reload

内存信息

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一

free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略

-b 以Byte为单位显示内存使用情况。

-k 以KB为单位显示内存使用情况。

-m 以MB为单位显示内存使用情况。

-g 以GB为单位显示内存使用情况。

-o 不显示缓冲区调节列。

-s<间隔秒数> 持续观察内存使用状况。

-t 显示内存总和列。

-V 显示版本信息。

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

Wget

Wget是一个网络命令行工具,可以让你下载文件并与REST APIs互动。它支持HTTP,HTTPS,FTP, 和FTPS 互联网协议。Wget可以处理不稳定和缓慢的网络连接。在下载失败的情况下,Wget会继续尝试,直到整个文件被检索出来。Wget还可以让你恢复被中断的文件下载,而不必从头开始。

你还可以使用Wget与REST APIs互动,而不需要安装任何额外的外部程序。你可以在终端中用单个或多个头文件提出GETPOSTPUTDELETEHTTP 等请求。

Wget可以对Restful API进行请求

wget -O- https://jsonplaceholder.typicode.com/posts?_limit=2

输入命令行后显示HTTP request sent, awaiting response... 200 OK ,这意味着你已经成功地向JSONPlaceholder发送了一个GET 请求。

Wget让你通过运行类似下面的命令来发送POST

wget --method=post -O- -q --body-data='{"title": "Wget POST","body": "Wget POST example body","userId":1}' --header=Content-Type:application/json https://jsonplaceholder.typicode.com/posts

上面的命令,用wget ,向JSON Placeholder发送一个POST 请求,以创建一个新帖子。你把method 设为post ,把Header 设为Content-Type:application/json ,并向其发送以下request body{"title": "Wget POST","body": "Wget POST example body","userId":1}

输出结果为

Output{
  "title": "Wget POST",
  "body": "Wget POST example body",
  "userId": 1,
  "id": 101
}

Wget让你通过运行类似下面的命令来发送PUT

wget --method=put -O- -q --body-data='{"title": "Wget PUT", "body": "Wget PUT example body", "userId": 1, "id":1}' --header=Content-Type:application/json https://jsonplaceholder.typicode.com/posts/1 

在上面的命令中,你用wget ,向JSON Placeholder发送一个PUT 请求,以编辑这个REST API中的第一个帖子。你把method 设为put ,把Header 设为Content-Type:application/json ,并向其发送以下request body{"title": "Wget PUT", "body": "Wget PUT example body", "userId": 1, "id":1}

Output{
  "body": "Wget PUT example body",
  "title": "Wget PUT",
  "userId": 1,
  "id": 1
}

Wget让你通过运行一个类似下面的命令来发送DELETE 请求

wget --method=delete -O- -q --header=Content-Type:application/json https://jsonplaceholder.typicode.com/posts/1

wget ,向JSON Placeholder发送一个DELETE 请求,删除这个REST API中的第一个帖子。你把method 设为delete ,并在URL中把你要删除的帖子设为1

什么命令都不能用了

环境变量配置错误造成的,输入

export PATH=/usr/local/sbin:usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

或者手动在/etc/profile中添加此行

用户

普通用户可以用sudo

如果提示不再sudoers文件中,在sudoers文件中添加用户

vim /etc/sudoers

添加语句

username ALL=(ALL)  ALL

连接

linux最重要的用途还是服务器吧,目前绝大多数服务器都是linux系统。centos或者ubuntu、debian,在本地可以远程连接服务器进行操作

通过密码连接服务器

直接输入命令

ssh 用户名@IP地址 -p 端口号

运行后会要求输入密码,输入即可登录

通过密钥连接服务器

首先在服务器端创建密钥对,下载私钥

将私钥保存在.ssh文件下,如果没有.ssh目录,创建一个

cd ~
mkdir .ssh

修改密钥权限

cd ~/.ssh
chmod 400 密钥文件名

通过ssh密钥方式连接服务器

ssh -i ~/.ssh/mac root@192.168.0.1

~/.ssh/mac为下载的私钥的路径和文件名

root是服务器端管理员账号,一般是root

192.168.0.1是服务器的公网ip

终端变成root就说明连接成功

让mac终端始终保持与远程连接状态(Broken pipe)

sudo vim /etc/ssh/ssh_config

添加设置

# 断开时重试连接的次数
ServerAliveCountMax 5
# 每隔5s发送一个空请求以保持连接
ServerAliveInterval 5

快捷键

  启动终端:ctrl+alt+T

​ 创建目录:mkdir

​ 返回上层目录:cd ..

​ 停止运行:Ctrl+c

​ 关闭终端 Ctrl+alt+Q

​ 新建终端 Ctrl+alt+N

增加CPU占有率

for i in `seq 1 $(cat/proc/cpuinfo |grep "physical id" |wc -l)`;do dd if=/dev/zero of=/dev/null & done

centos

查找操作系统的内核版本

uname -r

更新系统底层的库文件

yum update

Vim

vim命令

:w 保存文件但不退出vim 
:w! 强制保存文件但不退出vim 
:wq 保存文件并退出vim
:wq!强制保存文件并退出vim
:q 不保存文件直接退出
:q! 不保存文件强制退出vim
:e! 放弃所有修改,从上次保存文件开始再编辑命令历史

linux下软件包

linux下应用程序的软件包按内容类别分为两类:

1.可执行文件(编译后的二进制软件包)

解压包之后就可以直接运行,类似于windows下的软件包,安装完可以直接使用,但是看不到源程序,而且下载时要注意这个软件是否是你所使用的平台,否则无法正常安装,如centos与ubuntu

优点:使用简单,只需要几个命令就能实现软件包的安装、卸载、升级、查询,安装速度快

缺点:不能看源代码,功能选择不如源代码灵活,依赖性

2.源程序(源码包)

解开包之后你还需要使用编译器将其编译为可执行文件,这是linux独有的,windows的思想是不开放源程序

优点:开源,可以自由选择所需功能,可看源码,卸载方便

缺点:安装步骤过多,编译时间过长

二进制软件包与源码包区别:

与直接从源代码安装相比,软件包管理易于安装和卸载,易于更新已安装的软件包,易于保护配置文件,易于跟踪已安装文件

通常用tar打包的都是源程序,用rpm、dpkg打包的则常是可执行程序,一般来说,自己动手打包源程序更具灵活性,但是容易遇到各种问题,而可执行程序包更容易安装,但是灵活性会差很多,所以一般一个软件会提供多种打包格式的安装程序。

linux下应用程序的软件包按格式分类:

linux下的软件安装包主要有rpm、deb、tar.gz三种格式

软件后缀为.rpm最初是Red Hat Linux提供的一种包封装格式,rpm较deb发行早,所以现在许多linux发行版本都使用。rpm包本质就是一个可以在特定机器上运行的Linux软件,可以在红帽Linux、Suse、Fedora直接进行安装,但在Ubuntu上无法识别

软件后缀为.deb是Debian linux提供的包封装格式。deb的包管理器dpkg只在debian上有,ubuntu也支持,可以在ubuntu上进行安装

软件后缀.tar.gz、tar.Z、tar.bz2、.tgz是使用unix系统打包工具tar打包的。tar包在所有Linux版本中都能运行,但是安装过程也最麻烦,tar包就是一个压缩包,是为了便于传输所产生的一种专门用于网络流通的文件格式,tar包与deb、rpm包相比,tar包不一定是软件,也可能是图片、文本等等

软件后缀为.bin的一般是一些商业软件

安装方法

rpm包:

查询系统中所有的rpm包

rpm -qa

## 查询所有包含某个字符串sql的软件包
rpm -qa |grep sql

安装

rpm -i your-package.rpm
## 强制安装
rpm -i --force your-package.rpm

卸载(后缀不能包含rpm)

rpm -e your-package

升级软件包

rpm -Uvh your-package.rpm

安装rpm-build

yum list |grep rpm-build
yum install -y rpm-build.x86_64

tar包:

下载方法

wget可以下载整个页面和文件

wget会遵守robots.txt文件。

 wget -r -p -e robots=off http://www.example.com

安装cmake

准备编译环境

yum -y install gcc gcc-c++

获取源码并解压

wget https://github.com/Kitware/CMake/releases/download/3.15.5/cmake-3.15.5.tar.gz
## 备用下载地址 https://down.24kplus.com/linux/cmake/cmake-3.15.5.tar.gz

tar -zxf cmake-3.15.5.tar.gz

cd cmake-3.15.5

编译安装

./bootstrap --prefix=/usr --datadir=share/cmake --docdir=doc/cmake && make 
sudo make install

验证安装

cmake --version

rpm-build

如果你想打包rpm包,可能还需要rpm-build包

sudo yum install rpm-build 

Selinux

安全增强型 Linux(SELinux)是一种采用安全架构的 Linux® 系统,它能够让管理员更好地管控哪些人可以访问系统。它最初是作为 Linux 内核的一系列补丁,由美国国家安全局(NSA)利用 Linux 安全模块(LSM)开发而成。

SELinux 于 2000 年发布到开源社区,并于 2003 年集成到上游 Linux 内核中。

SELinux 定义了每个人对系统上的应用、进程和文件的访问权限。它利用安全策略(一组告知 SELinux 哪些能访问,哪些不能访问的规则)来强制执行策略所允许的访问。

当应用或进程(称为主体)发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存(AVC),其中缓存有主体和对象的访问权限。

查看selinux状态

## 命令1
/usr/sbin/sestatus -v
## SELinux status:                 enabled
## 命令2
getenforce

临时关闭

setenforce 0 ##设置SELinux 成为permissive模式
##setenforce 1 设置SELinux 成为enforcing模式

也可以修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

firewalld和utf

全局端口转发

iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。 术语 iptables 也经常代指该内核级防火墙。 iptables 用于 ipv4,ip6tables 用于 ipv6。 需要root账户执行以下操作

开启iptables

echo 1 >/proc/sys/net/ipv4/ip_forward

默认值0是禁止ip转发,修改为1即开启ip转发功能。

简单转发

#-- 把访问本机 8091 端口的请求转发到 8090端口
$ iptables -t nat -A PREROUTING -p tcp --dport 8091 -j REDIRECT --to-ports 8090
#-- 把访问本机 8093 端口的请求转发到 192.168.1.3 的 8090端口
$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8093 -j DNAT --to 192.168.1.3:8090

定时执行脚本

crontab可以在指定的时间执行一个shell脚本以及一系列Linux命令

常用于定时备份数据库、日志等

常用命令

crontab -e     ##修改crontab文件,
crontab -l     ##显示crontab文件
crontab -r     ##删除crontab文件
crontab -ir    ##删除crontab文件之前提醒用户

service crond status
service crond start
service crond stop
service crond restart
service crond reload

基本格式

* * * * * command
#分 时 日 月 周 + 命令
10 0 * * * command ./a.sh
## 每天0点10分执行命令

Apache

apache在linux下的文件是httpd,centos自带apache,文件目录为cd/etc/init.d

启动apache服务

service httpd start
service httpd restart
service httpd stop

部署项目

react

system limit for number of file watchers reached

文件监控数量超过了系统限制,直接修改系统参数

cat /proc/sys/fs/inotify/max_user_matches
##8192
sudo vim /etc/sysctl.conf

## 添加语句 fs.inotify.max_user_watches=524288

sudo sysctl -p 

cat /proc/sys/fs/inotify/max_user_matches
##524288

Node

运行命令

## 14.*
curl -sL https://rpm.nodesource.com/setup_14.x | bash -
## 12.*
curl -sL https://rpm.nodesource.com/setup_12.x | bash -

yum -y install nodejs

## 安装gcc插件
yum install gcc-c++ cmake

服务器翻墙GitHub太慢问题

使用代理网址https://github.com.cnpmjs.org/

linux端口无法访问问题排查

1.确认服务器的项目部署成功

2.确认访问地址是否存在。访问地址和端口是否正常。

3.确定服务器安全规则是否添加了要访问的端口。在控制台检查安全规则。

4.连接服务器的用户。一般服务器有root管理员,和其他个人创建用户。

5.服务器防火墙问题。服务器一般配置80端口为开放端口,在外网访问服务器80端口

使用telnet判断端口是否可以访问

telnet 47.49.182.93:7001

docker

Docker作为容器管理的平台,早已在服务部署等领域有非常广泛的应用。容器是轻量级的虚拟化方案,依托于overlayfs、Linux下的namespace、cgroups等OS级别的虚拟化技术,性能相比于基于VM的虚拟化更加突出。

更重要的是,通过Docker安装和配置软件更加方便

移除可能有旧的Docker版本

yum erase -y docker docker-common docker-engine

安装工具包和依赖,设置仓库源

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \ 
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

使用yum安装docker-ce

##最新稳定版
yum install docker-ce docker-ce-cli containerd.io
##指定版本
yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io

启动docker服务

systemctl start docker

检查docker的信息和版本

docker version
docker info

验证docker,通过下载镜像和创建容器来看看Docker是否可以运转起来。可以使用下面的命令从Docker的镜像仓库下载名为hello-world的镜像文件。

docker pull hello-world

docker安装容器

docker pull gitlab/gitlab-ce

如果docker拉取较慢更换docker源,docker默认为docker国内镜像,可以腾讯源、中科大源或者dcloud

启动容器

docker run 

查看容器

V2ray

一键安装脚本

bash <(curl -s -L https://git.io/v2ray.sh)

运行后自动安装,安装过程中:

输入1进行安装

选择tcp协议(默认)

选择端口号:为了不和别的软件冲突,推荐使用10000以上不超过65535的端口号,我选的10086

广告拦截:是否开启广告拦截,推荐不要开启,开启广告拦截会消耗服务器资源,且国外环境略由于国内环境

配置shadowsocks:选择开启,后面使用游戏加速器会用上

选择shadowsocks端口号:随意,不要和上面v2ray一样,我选2333

ss连接密码:123456

ss加密协议:选择默认

然后继续回车,直到安装完毕

开启BBR加速:google BBR是一款免费开源的TCP拥塞控制传输协议,可以使linux服务器显著提高吞吐量和减少TCP连接的延迟

修改系统变量

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >>/etc/sysctl.conf

保存生效

sysctl -p

检查BBR是否开启

sysctl net.ipv4.tcp_available_congestion_control

返回变量==bbr则说明开启成功

检查BBR是否启动成功

lsmod | grep bbr

如果返回tcp_bar 20480说明启动成功

客户端使用

windows客户端使用v2rayN

​ 在服务器端输入v2ray url,复制vmess链接

​ 下载v2rayN软件,打开软件点击服务器,点击从剪贴板批量导入url

​ 右键点击刚刚导入的服务器,测试服务器延迟,表示连接成功

​ 在小图标点击右键,选择pcahttp代理模式,表示只有被墙的网站才会启用代理,全局模式是所有链接都走代理

mac端使用v2rayU

ios端使用shadowsocks扫描

Android端使用v2rayNG

在服务器端输入

v2ray qr

打开二维码链接,然后在手机上下载v2rayNG,打开客户端用扫一扫扫描二维码就能添加到节点

路由器端

在服务器段输入

v2ray url

复制链接,代开路由器端openwrt,勾选代理开关,点击服务器列表,在通过vmess链接添加节点处粘贴刚刚复制的链接

然后点击账号设置,代理模式选择gtwlist模式,服务器选择刚刚添加的服务器,点击提交就完成

https://noobyy.com/31.html

Frp

frp是做内网穿透反向代理的软件

https://github.com/fatedier/frp/blob/dev/README_zh.md

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

frp 支持多种代理类型来适配不同的使用场景。

类型 描述
tcp 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
udp 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
http 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。
https 针对 HTTPS 应用定制了一些额外的功能。
stcp 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
sudp 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
xtcp 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。
tcpmux 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。

Nextcloud个人网盘服务器

如果你觉得我的文章对你有帮助的话,希望可以推荐和交流一下。欢迎關注和 Star 本博客或者关注我的 Github