Linux常用的一些配置

date
Dec 23, 2021
slug
linux
status
Published
tags
Linux
Nginx
Springboot
summary
Linux
type
Post
 

用户相关

修改密码

passwd  # 默认修改root
passwd wangjiahao # 修改指定用户

创建用户

adduser wangjiahao
passwd wangjiahao

添加docker执行权限

# 将普通用户加入docker组
gpasswd -a $USER docker
# 刷新docker组
newgrp docker
# 重启docker
systemctl restart docker

禁止root用户远程登录

# 修改配置文件
vim /etc/ssh/sshd_config
# 修改
PermitRootLogin no 
# 重启
service sshd restart

设置sudo -i


vim /etc/sudoers

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL

设置链接超时

# 修改配置文件
vim /etc/ssh/sshd_config

ClientAliveInterval 600 # 指定服务器向客户端检测是否活动状态的间隔时间,默认为0,将它修改为60,就是每60秒检测一次。
ClientAliveCountMax 3 # 指定服务器向客户端检测无响应最大次数,达到次数断开连接,默认为3,该项无需修改。
# 重启
service sshd restart

su: Authentication failure问题

su命令不能切换root,提示su: Authentication failure,只要你sudo passwd root过一次之后,下次再su的时候只要输入密码就可以成功登录了。
sudo passwd root
# 设置密码
root

修改hostname

vim /etc/hostname # 修改
reboot # 重启

离线下载yum包

应用场景
通常生产环境由于安全原因都无法访问互联网。此时就需要进行离线安装,主要有两种方式:源码编译、rpm包安装。源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线 rpm 包安装。
  1. 需要安装yumdownload软件
  1. destdir后要写下载的包放到的位置
  1. 后面跟下载的软件,这样就会把这个软件的依赖一同下载
可以使用“yum deplist”命令来查找 rpm 包的依赖列表。例如,要查找“ansible”rpm的依赖包:
yum deplist ansible
软件包:ansible.noarch 2.9.3-1.el7
依赖:/usr/bin/env
provider: coreutils.x86_64 8.22-24.el7
依赖:/usr/bin/python2
provider: python.x86_64 2.7.5-86.el7
依赖:PyYAML
provider: PyYAML.x86_64 3.10-11.el7
依赖:python(abi) = 2.7
provider: python.x86_64 2.7.5-86.el7
依赖:python-httplib2
provider: python-httplib2.noarch 0.9.2-1.el7
依赖:python-jinja2
provider: python-jinja2.noarch 2.7.2-4.el7
依赖:python-paramiko
provider: python-paramiko.noarch 2.1.1-9.el7
依赖:python-setuptools
provider: python-setuptools.noarch 0.9.8-7.el7
依赖:python-six
provider: python-six.noarch 1.9.0-2.el7
依赖:python2-cryptography
provider: python2-cryptography.x86_64 1.7.2-2.el7
依赖:python2-jmespath
provider: python2-jmespath.noarch 0.9.0-3.el7
依赖:sshpass
provider: sshpass.x86_64 1.06-2.el7

方案一(推荐):repotrack

# 安装yum-utils
yum -y install yum-utils
# 下载 ansible 全量依赖包
repotrack ansible

方案二:yumdownloader

# 安装yum-utils
yum -y install yum-utils
# 下载 ansible 依赖包
#参数说明:
#—destdir:指定 rpm 包下载目录(不指定时,默认为当前目录)
#—resolve:下载依赖的 rpm 包。
# 仅会将主软件包和基于你现在的操作系统所缺少的依赖关系包一并下载。
yumdownloader --resolve --destdir=/tmp ansible
# 离线安装
$ rpm -Uvh --force --nodeps *.rpm

方案三:yum 的 downloadonly 插件

# 安装插件
yum -y install yum-download
# 下载 ansible 依赖包
yum -y install ansible --downloadonly --downloaddir=/tmp

注意

与 yumdownloader 命令一样,也是仅会将主软件包和基于你现在的操作系统所缺少的依赖关系包一并下载。

离线安装 rpm

# 离线安装
rpm -Uvh --force --nodeps *.rpm
参考资料
  • https://serverfault.com/questions/470964/yumdownloader-vs-repotrack

找不到命令了

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
export PATH=/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:/bin:/sbin
source /etc/profile
 

find

 

文件统计

 
1、统计当前目录下文件的个数(不包括目录)
ls -l | grep "^-" | wc -l
2、统计当前目录下文件的个数(包括子目录)
ls -lR| grep "^-" | wc -l
3、查看某目录下文件夹(目录)的个数(包括子目录)
ls -lR | grep "^d" | wc -l
4、统计当前文件夹下叫某某的文件的数量
find . -name filename | wc -l
5、统计当前文件夹下指定类型的文件的数量
例如这里需要找 js 文件的数量:
find -name "*.js" | wc -l
6、 快速查看文件名
ll -1 -f
这里再对使用到的 3 个命令做个介绍。
1、ls -l
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR 是列出所有文件,包括子目录。
2、grep “^-”
过滤ls的输出信息,只保留一般文件,只保留目录是 grep “^d”。
3、wc -l
统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数。

安装Clash

 
gunzip clash-linux-amd64-v1.10.0.gz
sudo mv clash-linux-amd64-v1.10.0 /usr/local/bin/clash
sudo chmod +x /usr/local/bin/clash
mkdir /ect/clash

## 然后吧yaml和Country.mmdb 放到/ect/clash下面 ,
## 如果电脑本身没梯子,容易下载出错,所以建议是拖上来。避免错误
ls
Country.mmdb config.yaml
# 当这两个文件都下载好了就行了

## 新增clash系统服务
vim /etc/systemd/system/clash.service
#放入如下内容
[Unit]
Description=Clash Daemon
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/clash -d /etc/clash/

[Install]
WantedBy=multi-user.target
启用 clash service:
sudo systemctl enable clash.service  #设置开机自启动
sudo systemctl daemon-reload
sudo systemctl start clash.service  #手动启动
去GitHub下载最新版yacd
# 解压
tar -xvJf yacd.tar.xz
# 并改名为dashboard。
mv public dashboard
/etc/clash 下的 config.yaml加入以下配置
external-controller: :9090
# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `${API}/ui`
# 参数应填写配置目录的相对路径或绝对路径。
external-ui: 'dashboard' 
# RESTful API 的口令 (可选)
secret: "123456"
重启服务
systemctl restart clash
访问页面:ip:9090/ui就可以看到控制台了

# 新增配置
sudo vim .bashrc

function proxy_off() {
	unset http_proxy
	unset https_proxy
	unset no_proxy
	echo -e "Proxy Off"
}

function proxy_on(){
	export http_proxy="http://127.0.0.1:7890"
	export https_proxy=$http_proxy
	export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
	echo -e "Proxy On"
}
# 执行proxy_off,即默认关闭代理
proxy_off

source .bashrc  #使配置生效
proxy_on 开启代理 proxy_off 关闭代理
 
 

查看cpu信息

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU= 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
 
 

linux ulimit 和 fs.file-max

概要:
文件句柄:在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读/写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读/写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使得进程与文件之间的连接断开。
 
Linux/proc/sys/fs/file-max 决定了当前内核可以打开的最大的文件句柄数。
linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够。这就需要修改ulimit和file-max。特别是提供大量静态文件访问的web服务器,缓存服务器(如squid), 更要注意这个问题。 网上的教程,都只是简单说明要如何设置ulimit和file-max, 但这两者之间的关系差别,并没有仔细说明。
说明:
  1. file-max的含义。man proc,可得到file-max的描述: /proc/sys/fs/file-max This file defines a system-wide limit on the number of open files for all processes. (See also setrlimit(2), which can be used by a process to set the per-process limit, RLIMIT_NOFILE, on the number of files it may open.) If you get lots of error messages about running out of file handles, try increasing this value: 即file-max是设置 系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。 也就是说,这项参数是系统级别的。
  1. ulimit Provides control over the resources available to the shell and to processes started by it, on systems that allow such control. 即设置当前shell以及由它启动的进程的资源限制。 显然,对服务器来说,file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题

查看当前的值

cat /proc/sys/fs/file-max
这个值在kernel的文档里是这样描述的:
The valuein  file-max  denotes  the  maximum numberof filehandles that the
Linux kernel will allocate.When youget a lotoferror messages about running
outof  filehandles, you might wantto raise this limit. Thedefault value is
10%of  RAMin kilobytes.To  change it, just  write the new numberinto the
file:
意思是file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算:
grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
一般我们不需要主动设置这个值,除非这个值确实较小(可能有各种其他原因导致file-max没有设置为内存的10%)

如何查看当前kernel的句柄:

cat /proc/sys/fs/file-nr
file-nr在内核文档里得解释如下:
Historically, the three valuesin file-nr denoted the numberof allocated file
handles,  the numberof  allocated but  unused filehandles, and  the maximum
numberof filehandles. Linux 2.6 always  reports 0as the numberof free file
handles -- this  is not anerror,  it just means that the  numberof allocated
filehandles exactly matches the numberof used filehandles.
max-file:表示系统级别的能够打开的文件句柄①的数量。是对整个系统的限制,并不是针对用户的。 ulimit -n:控制进程级别(比如 Nginx 进程、MySQL 进程)能够打开的文件句柄的数量。提供对 shell 及其启动的进程的可用文件句柄的控制。这是进程级别的。 一边情况下,服务器上的 ulimit 都需要我们自己设置,而不能使用系统默认的,否则会出现文件描述符耗尽的问题。文件句柄达到上限之后的常见错误有:Too many open files 或者 Socket/File: Can’t open so many files 等。
查看 max-file
$ sysctl -a | grep 'fs.file-max'
fs.file-max = 6553560

$ cat /proc/sys/fs/file-max
6553560
设置的方式有两种,一种是临时生效,重启后恢复默认。另一种永久生效。
file-max 的修改:
# echo 102400 > /proc/sys/fs/file-max 
# sysctl -w "fs.file-max=102400"

# 前面2种重启机器后会恢复为默认值
或
vim /etc/sysctl.conf
# 加入以下内容,重启生效
fs.file-max=102400
net.nf_conntrack_max = 1024000
net.netfilter.nf_conntrack_max = 1024000
# 立即生效,此方式永久生效
$ sysctl -p 
ulimit open files  修改:
// 这只是在当前终端有效,退出之后,open files 又变为默认值。当然也可以写到 /etc/profile 中,因为每次登录终端时,都会自动执行 /etc/profile
$ ulimit -HSn 102400// 加入以下配置,重启即可生效
$ vim /etc/security/limits.conf  
* soft nofile 102400 
* hard nofile 102400

// 如果需要设置当前用户 session 立即生效,可以执行:
$ ulimit -n 102400 
附录: 附录1. 为了让一个程序的open files数目扩大,可以在启动脚本前面加上ulimit -HSn 102400命令。但当程序是一个daemon时,可能这种方法无效,因为没有终端。
附录2. 如果某项服务已经启动,再动态调整ulimit是无效的,特别是涉及到线上业务就更麻烦了。 这时,可以考虑通过修改/proc/’程序pid’/limits来实现动态修改!!!
 

s-tui 监控

首先保证有python环境
设置镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python2 & python3
pip install s-tui
s-tui 
notion image
安装stress 查看电脑功耗
  • todo

linux shell脚本获取当前的ip

方法一:ifconfig -a

ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"

命令解释

  1. ifconfig -a 和window下执行此命令一样道理,返回本机所有ip信息
  1. grep inet 截取包含ip的行
  1. grep -v 127.0.0.1 去掉本地指向的那行
  1. grep -v inet6 去掉包含inet6的行
  1. awk { print $2} $2 表示默认以空格分割的第二组 同理 $1表示第一组
  1. tr -d "addr: 删除"addr:"这个字符串
notion image
 

多网卡情况

倘若有多个网卡,可能会出现多个不同网段的IP,这个时候如果还是执行上述命令就会返回多个IP,如下:
假设某个机器有192.*.*.8和10.*.*.*网段的IP,现在要实现不同网段的IP地址打印不同的输出,shell脚本如下
#!/bin/sh
ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
echo $ip
if [[ $ip == "10."* ]];then
  echo "该网段是10.*.*.*网段"
else
  echo "该网段是192.*.*.*网段"
fi
#!/bin/sh
local_ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"<200b>`
echo "${local_ip}"

for var in ${local_ip[@]}
do
  echo "多网卡IP:$var"
done

array=(`echo $local_ip | tr '\n' ' '` )
num=${#array[@]}                          #获取数组元素的个数。
echo "IP数目:$num"
for var in ${array[@]}
do
  echo "ip:$var"
done
function getIpAddr(){
	# 获取IP命令
	ipaddr=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
	array=(`echo $ipaddr | tr '\n' ' '` ) 	# IP地址分割,区分是否多网卡
	#array=(172.20.32.214 192.168.1.10);
	num=${#array[@]}  						#获取数组元素的个数
 
	# 选择安装的IP地址
	if [ $num -eq 1 ]; then
		#echo "*单网卡"
		local_ip=${array[*]}
	elif [ $num -gt 1 ];then
		echo -e "\033[035m******************************\033[0m"
		echo -e "\033[036m*    请选择安装的IP地址		\033[0m"
		echo -e "\033[032m*      1 : ${array[0]}		\033[0m"
		echo -e "\033[034m*      2 : ${array[1]} 		\033[0m"
		echo -e "\033[035m******************************\033[0m"
		#选择需要安装的服务类型
		input=""
		while :
		do
			read -r -p "*请选择安装的IP地址(序号): " input
			case $input in
				1)
					local_ip=${array[0]}
					#echo "选择网段1的IP为:${local_ip}"
					break
					;;
				2)
					local_ip=${array[1]}
					#echo "选择网段2的IP为:${local_ip}"
					break
					;;
				*)
				echo "*请输入有效的数字:"
					;;
			esac
		done
	else
		echo -e "\033[31m*未设置网卡IP,请检查服务器环境! \033[0m"
		exit 1
	fi
} 
 
# 校验IP地址合法性
function isValidIp() {
	local ip=$1
	local ret=1
 
	if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
		ip=(${ip//\./ }) # 按.分割,转成数组,方便下面的判断
		[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
		ret=$?
	fi
	return $ret
}
 
local_ip=''
getIpAddr	#自动获取IP
isValidIp ${local_ip}	# IP校验
if [ $? -ne 0 ]; then
	echo -e "\033[31m*自动获取的IP地址无效,请重试! \033[0m"
	exit 1
fi
echo "*选择安装的IP地址为:${local_ip}"

方法二:ip addr

ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'
 
 

字符串处理

最近写脚本,需要对脚本中函数传递的路径参数进行截取,发现了以下比较好用的方法,记录下:
file=/dir1/dir2/dir3/my.file.txt
我们可以用${ }分别替换获得不同的值:
${file#*/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条/及其左边的字串:my.file.txt
${file#*.}:拿掉第一个.及其左边的字串:file.txt
${file##*.}:拿掉最后一个.及其左边的字串:txt
${file%/*}:拿掉最后条/及其右边的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条/及其右边的字串:(空值)
${file%.*}:拿掉最后一个.及其右边的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个.及其右边的字串:/dir1/dir2/dir3/my
 

Shell中EOF界定符用法

 
解析变量
$可解析变量 = 'abc';
$str = <<<EOF
echo '$可解析变量';
EOF;
不解析变量
EOF加上单引号
$变量 = 'abc';
$str = <<<'EOF'
echo '$变量';
EOF;
 

防火墙配置

 

CentOS7下打开关闭firewalld防火墙

firewalld打开关闭及其他常用命令:
  • 启动:systemctl start firewalld
  • 关闭:systemctl stop firewalld
  • 查看状态:systemctl status firewalld
  • 开机禁用:systemctl disable firewalld
  • 开机启用:systemctl enable firewalld
systemctl是CentOS7的服务管理工具中主要的工具,systemctl融合servicechkconfig的功能于一体:
  • 启动一个服务:systemctl start firewalld.service
  • 关闭一个服务:systemctl stop firewalld.service
  • 重启一个服务:systemctl restart firewalld.service
  • 显示一个服务的状态:systemctl status firewalld.service
  • 在开机时启用一个服务:systemctl enable firewalld.service
  • 在开机时禁用一个服务:systemctl disable firewalld.service
  • 查看服务是否开机启动:systemctl is-enabled firewalld.service
  • 查看已启动的服务列表:systemctl list-unit-files|grep enabled
  • 查看启动失败的服务列表:systemctl --failed

firewalld-cmd配置命令

  • 查看版本:firewall-cmd --version
  • 查看帮助:firewall-cmd --help
  • 显示状态:firewall-cmd --state
  • 查看所有打开的端口:firewall-cmd --zone=public --list-ports
  • 更新防火墙规则:firewall-cmd --reload
  • 查看区域信息:firewall-cmd --get-active-zones
  • 查看指定接口所属区域:firewall-cmd --get-zone-of-interface=eth0
  • 拒绝所有包:firewall-cmd --panic-on
  • 取消拒绝状态:firewall-cmd --panic-off
  • 查看是否拒绝:firewall-cmd --query-panic

firewall-cmd开启端口实例

  • 添加命令:firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
  • 重新载入:firewall-cmd --reload
  • 查看:firewall-cmd --zone= public --query-port=80/tcp
  • 删除:firewall-cmd --zone= public --remove-port=80/tcp --permanent
 

设置静态ip

 
 

cd /etc/sysconfig/network-scripts
vim ifcfg-enp3s0
注释部分为更改静态ip
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
#BOOTPROTO="static" 
#IPADDR=192.168.31.10 
#NETMASK=255.255.255.0
#GATEWAY=192.168.31.1
#DNS1=8.8.8.8
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp3s0"
UUID="7e82905f-6753-4cab-b50a-55c62f7f3d20"
DEVICE="enp3s0"
ONBOOT="yes"

© WangJiaHao 2022 - 2023

豫ICP备18022029号