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部署
创建服务模板:(
centos
位于/usr/lib/systemd/system/xxx.service
,ubuntu
位于/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 # 设置服务在开机时启动
给予服务和脚本程序运行权限
chmod +x /usr/lib/systemd/system/xxx.service chmod +x /path/to/xxx.sh
重载服务,并启动 xxx.service 和 增加开机执行权限
systemctl daemon-reload systemctl start xxx systemctl enable xxx
查看运行状态
systemctl status xxx.service
不依赖 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
交换分区文件)的情况下,重装某软件或流量过大都可能会导致内存不足,轻则难以为继、重则直接宕机(比如测着测着速就失联了),此时便需要设置交换分区。
设置步骤
检查当前的 swap 与存储空间
swapon -s # 查看当前 swap 的使用情况,如果没有返回信息则表示 swap 文件不存在 df -h # 检查文件系统剩余空间
创建 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 了
重启自动挂载 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。