linux常用命令与配置

linux常用命令与配置

screen

screen -S screen_name
# 新建一个名为screen_name的screen
screen -ls
# 显示已创建的screen终端
screen -r xxx
# 连接 screen_id 为 xxx 或者名字为 xxx 的screen 终端
按住Ctrl,先按A键,再按D键
# 退出screen会话

screen 连接不上,提示“There is no screen to be resumed matching xxxxx.” :

screen -D -r xxxx
# 删除前一用户再登录

各类历史记录

项目 位置 相关命令
Bash 命令 ~/.bash_history history
登陆开关机记录 /var/log/wtmp last
登录失败记录 /var/log/btmp lastb
用户登录记录 /var/log/lastlog lastlog
认证相关安全事件信息 /var/log/secure

systemctl

systemctl start xxx    # 启动xxx服务
systemctl restart xxx  # 重启xxx服务(会重启服务,造成服务一瞬间的中断)
systemctl status xxx   # 查看xxx服务的运行状态
systemctl stop xxx     # 停止xxx服务
systemctl reload xxx   # 重载xxx服务(会重新加载配置文件,服务不会中断)
systemctl enable xxx   # 激活xxx服务的开机启动(当然还有disable)
journalctl -u xxx      # 查看xxx服务的出错日志

附上常用的重启命令:

systemctl restart sshd.service  # 重启ssh服务

systemctl 新增 service 服务

案例:minio部署

  1. 创建服务模板:(centos 位于 /usr/lib/systemd/system/xxx.serviceubuntu 位于 /etc/systemd/system/xxx.service

    [Unit]
    Description=服务概述
    Documentation=服务文档
    # Requires=服务在此 daemon 启动后才能够启动
    
    [Service]
    # User=xxx
    # 命令执行用户
    WorkingDirectory=/data
    # 工作目录
    ExecStart=/path/to/xxx.sh
    # 执行此 daemon 的指令或脚本程序
    
    Restart=on-failure
    # 非正常退出时重启
    RestartSec=5
    # 设置在重启服务 (Restart) 前暂停多长时间,默认 100ms,上面设置为 5s
    
    [Install]
    WantedBy=multi-user.target
    # 设置服务在开机时启动
    
  2. 给予服务和脚本程序运行权限

    chmod +x /usr/lib/systemd/system/xxx.service
    chmod +x /path/to/xxx.sh
    
  3. 重载服务,并启动 xxx.service 和 增加开机执行权限

    systemctl daemon-reload
    systemctl start xxx
    systemctl enable xxx
    
  4. 查看运行状态

    systemctl status xxx.service
    
  5. 不依赖 xxx.sh 启动脚本

    启动脚本中 ExecStart= 后可以跟一句含有空格的完整命令,比如 node test.js,但必须为 node 提供确切的目录,写成下面这样:(test.js 是工作目录下的 node.js 脚本)

    ExecStart=/usr/bin/node test.js
    

    否则就会收到 Executable path is not absolute, ignoring: 启动命令 的错误。

    那么如何知道确切的目录呢?使用 type 命令即可:

    type node
    # node is /usr/bin/node
    

参考:Systemd 入门教程:实战篇 - 阮一峰的网络日志 (ruanyifeng.com)

Git(建立仓库并将文件部署到指定文件夹)

安装

# 检查git是否安装
git -v
# 若未安装则安装git
#ubuntu
sudo apt-get install git
#centos
sudo yum install -y git 

账户配置

考虑到安全性,新建一个名为 git 的用户,专门用于执行git的操作:

# 添加用户名为git
sudo adduser git

注:这里也可以使用下面的命令来建立用户,区别在于是否设置密码和在 /home 目录下会自动创建同名文件夹:

# 不会建立同名文件夹
useradd git
passwd git

然后配置git账户的公钥文件(用于使用 SSH 协议提交代码),可以直接将公钥导入(粘贴)服务器的 /home/git/.ssh/authorized_keys 文件中(没有目录和文件就新建),或者在 Windows 下的 Git Bash 进行以下操作:

ssh-copy-id -i ~/.ssh/id_rsa.pub git@server_ip_or_domain

配置好后就可以尝试直接使用 SSH 登录 git 账户,如果可以成功登录,则说明配置成功。
出于安全性考虑,需禁用 git 用户的 shell 登录权限,只能使用 git 命令,这个可以通过编辑 /etc/passwd 文件完成。找到最后一行:(如果 git 用户不是最后新建的则找到 git 所在行)

git:x:10xx:10xx::/home/git:/bin/bash

改为: ( /usr/bin/git-shell 为你的 git-shell 所在的位置,珂以通过 which git-shell 查看)

git:x:10xx:10xx::/home/git:/usr/bin/git-shell

这样,git 用户就只能使用 git 命令,但是一登录就会自动退出,就像下面这样:

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to server_ip closed.

仓库配置(新建仓库参考)

执行以下操作以创建仓库:(按照惯例,仓库文件夹都以 .git 结尾,仓库所在的各层级文件夹最好都拥有git用户读写权限,因为在 root 用户文件夹下新建了一个仓库一直没权限)

cd git_dir # 移动到git仓库所在文件夹
mkdir xxx & cd xxx # 欲新建文件夹,则新建并进入
git init --bare blog.git # 创建一个名为blog.git的裸的仓库文件夹

然后,把 owner 改为 git

然后利用 post-receive 实现自动化部署:

cd blog.git/hooks
vi post-receive

输入以下内容:

#!/bin/sh
git --work-tree=部署文件夹 --git-dir=git仓库文件夹 checkout -f

然后配置权限(可执行权限和 git 用户的读写权限):

chmod +x post-receive 
chown -R git:git /home/git/repos/blog.git 

设置交换分区(虚拟内存)

在 Azure 白嫖的 Linux 服务器只有 1 核 1G,而且默认是不会有交换分区的,在不装宝塔(宝塔会新建 1G 的 /www/swap 交换分区文件)的情况下,重装某软件或流量过大都可能会导致内存不足,轻则难以为继、重则直接宕机(比如测着测着速就失联了),此时便需要设置交换分区。

设置步骤

  1. 检查当前的 swap 与存储空间

    swapon -s    # 查看当前 swap 的使用情况,如果没有返回信息则表示 swap 文件不存在
    df -h        # 检查文件系统剩余空间
    
  2. 创建 swap 文件并激活 swap 文件

    创建的 swap 文件为:/etc/swapfile,当然也可以不放在 /etc 目录,也可以叫其他名字。

    dd if=/dev/zero of=/etc/swapfile bs=1024 count=2048k # 创建大小为 2G 的 swap 文件,可以动态调整 2048k 的值来调整大小,可能需要等待一段时间
    mkswap -f /etc/swapfile # CentOS 系统不需要执行此命令,Ubuntu 需要
    

    然后修改 swap 文件的权限:

    chown root:root /tmp/swapfile
    chmod 600 /tmp/swapfile
    

    之后激活 swap 文件就可以啦

    swapon /etc/swapfile # 激活 swap
    swapon -s # 查看最新的 swap 使用情况,这个是用应该就有刚刚激活的 swap 了
    
  3. 重启自动挂载 swap

    用 vim 打开 /etc/fstab 文件,在最后添加一行:

    /path/to/swapfile    swap    swap    defaults    0 0
    

    即可完成设置。

参考:虚拟内存设置(解决linux内存不够情况) - 玩过熊 - 博客园 (cnblogs.com)

vi 编辑模式下无法删除字符(或编辑模式下按上下左右键会输入乱码)

编辑 /etc/vim/vimrc.tiny 文件,把

set compatible

改掉,并增加一行:

set nocompatible
set backspace=2

保存即可。

参考:debian/ubuntu系统vi无法删除字符的解决办法 - 牧之丨 - 博客园 (cnblogs.com)

OpenWrt 下 socat 配置公网 v6 到内网 v4 端口映射

安装 Socat:

opkg update
opkg install socat

将配置按照如下规则写好放入 启动项 - 本地启动脚本 中:

socat TCP6-LISTEN:{公网端口},reuseaddr,fork TCP4:{内网 v4 地址}:{内网端口} &

OpenWrt 下重启网络端口

下面的命令相当于在 luci 界面 WAN6 接口处点击重启,相比 /etc/init.d/network restart 会需要 2~3 秒,它的速度更快

/sbin/ifup wan6

参考:OpenWRT19.07_命令行_重拨wan_重启路由_wget/curl

远程抓包

ssh user@ip "tcpdump -i  -s 0 -w -" | sudo wireshark -k -i -

Python & pip

在当前目录启动简易 http 服务器:python -m http.server [<port>] [--bind <ip>]

换源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

查看库的基本信息:pip show <库名>

查看所有库:pip list

查看匹配的包 tag:pip debug --verbose

Docker 换源

编辑或新建/etc/docker/daemon.json文件,向其中添加registry-mirrors项:

{
  "registry-mirrors": ["https://docker.mirrors.sjtug.sjtu.edu.cn"]
}

PPPOE 拨号

安装拨号软件包:pppoeconf

配置上网信息:sudo pppoeconf [<网卡名>]

联网:sudo pon dsl-provider

断网:sudo poff

查看 pppoe 日志:plog

开启ipv6支持,在 /etc/ppp/options 文件最后添加 ipv6 ,。注意,在ipv6和“,”之间有一个空格

nf_tables

查看规则集:nft [--handle] list ruleset--handle 表示显示句柄

创建表:nft add table <表类型> <表名>

表类型:

nftables 簇 xtables命令行工具
ip iptables
ip6 ip6tables
inet iptables和ip6tables
arp arptables
bridge ebtables

创建链:nft add chain <表类型> <表名> <链名>

创建基本链:

nft add chain inet <表名> <链名> { type filter hook input priority 0 \; }

其中,priority 采用整数值,可以是负数,值较小的链优先处理。

创建规则:

nft add/insert rule <表类型> <表名> <链名> [index/handle <序号/句柄>] <规则>

其中,add 表示将规则添加到链的末尾,insert 表示将规则添加到链的开头。如果存在序号/句柄,则将规则添加到对应规则的后面/前面。

删除链上的规则:

nft delete rule <表类型> <表名> <链名> handle <规则句柄>

示例:将网桥上的 https 流量包发送到本机 :8443 端口

sudo nft add table bridge t1
sudo nft add chain bridge t1 c1 { type filter hook prerouting priority 0\; }
sudo nft add rule bridge t1 c1 iifname "enP4p65s0" tcp dport 443 meta pkttype set host ether daddr set 62:7e:75:e8:06:5b counter
sudo nft add table inet t2
sudo nft add chain inet t2 c2 { type nat hook prerouting priority 0\; }
sudo nft add rule inet t2 c2 tcp dport 443 counter redirect to 8443

链 c1 先将 https 流量的以太网帧目标地址重写为本地 MAC 地址,接着链 c2 将 tcp 目标端口 443 重定向到 8443。