linux

基础命令

awk

参数

NR当前行数
NF当前列数
$n$0当前整行 ,$1表示第一列,$2表示第二列
F明确分隔符
RS记录分隔符,默认记录分隔符为\n
FS列分隔符,于-F功能类似
OFS与FS对应,指定print函数输出时的列分隔符,默认空格
ORS与RS对应,指定print函数输出时的记录分隔符,默认\n

取日志

#取出2023-10-16到2023-10-21时间所有日志 $0表示整个文本数据
[root@localhost ~]# awk '/2023-10-16/,/2023-10-19/ {print $0}' 1.txt 
2023-10-16 123  456 789 异常
2023-10-17 223  456 789 异常
2023-10-18 323  456555 789 
2023-10-19 4236  456 78966 异常
#取出2023-10-16到2023-10-21时间包含异常的日志 ~表示 匹配正则表达式操作
[root@localhost ~]# awk '/2023-10-16/,/2023-10-21/ {if ($0 ~ /异常/) print}' 1.txt 
2023-10-16 123  456 789 异常
2023-10-17 223  456 789 异常
2023-10-19 4236  456 78966 异常
2023-10-20 5236  4566 789 异常

合并文件

[root@localhost ~]# more 1.txt 
123
[root@localhost ~]# more 2.txt 
456
[root@localhost ~]# awk '{print $0}' 1.txt 2.txt > 3.txt
[root@localhost ~]# more 3.txt 
123
456

查看文件有多少行

[root@wj ~]# awk 'END{print NR}' 1.log 
6

取某列

#F以:为分隔符,取第三列 值等于0的
[root@localhost ~]# awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#取第一列和第三列
awk '{print $1,$3}'

取文件名

[root@localhost ~]# echo http.zip | awk -F "." '{print $1}'
http

删除前几个字符

[root@wj-7 ~]# echo a123456 | awk '{print substr($1,2)}' #删除第一个
123456
[root@localhost ~]# echo a123456 | awk '{print substr($1,3)}' #删除前两个
23456

删除第一行

df -h | awk 'NR>1 {print }'  或者NR!=1

修改某个值

[root@wj ~]# echo "wo shi wang"|gawk '{$3="haha"; print $0}'
wo shi haha

添加拼接

[root@wj ~]# eco "123" | awk '{print "hah" $NF}'hah123

计算

#计算2*4
[root@localhost ~]# awk 'BEGIN{print 2*4}'
8
#求奇数的和以及偶数和
[root@wj ~]# seq 3 |awk 'BEGIN{print "JiShuHe","OuShuHe" } NR%2==1{JiShuHe+=$0} NR%2==0{OuShuHe+=$0}  END{print JiShuHe,OuShuHe}'
JiShuHe OuShuHe
4 2

引用shell变量变量

[root@localhost ~]# s=:
[root@localhost ~]# awk -v FS=$s '{print$1FS$3}' /etc/passwd
root:0
bin:1
daemon:2
adm:3

输出格式

以;格式输出
[root@wj ~]# awk -F: -v OFS=";" '{print $1,$3}' /etc/passwd 
root;0 bin;1 daemon;2 

RS输入记录

[root@wj ~]# cat test.txt 
a,b,c;
1,2,3;
x,y, zzz;
aaa,b bb,ccc vvv;
bbb 
[root@wj ~]# awk -F"," -v RS=";" '{print $2}' test.txt 
b 2 y b bb 

综合案例

[root@wj ~]# echo -n '1,2,3|4,5,6|7,8,9'| awk 'BEGIN{RS="|";FS=","} {print $1,$2,$3}'
1 2 3
4 5 6
7 8 9

b

cat

#写入内容
cat > output.txt <<EOF
this is test eof
this is test eof2
EOF

#追加内容
cat >>2.txt <<EOF
456
789
EOF

#等特殊字符$时,须利用转义字符 \
cat > file <<EOF
export ORACLE_SID=yqpt 
export PATH=\$PATH:\$ORACLE_HOME/bin  
EOF

#显示行号
cat -n 1.txt

crontab定时

服务启停

systemctl start/stop/reload/status  crond

参数解释

第1列表示分钟0~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

特殊 符号 含义
*    表示任意时间都可以
-    表示取值范围
/ 每过多少个数字
,散列数字

相关命令

查看当前的crontab 任务
crontab -l

添加crontab任务
crontab -e

删除所有的crontab 任务
crontab  -r

查看其他用户/编辑 crontab 任务
只有root 用户才可以使用
crontab -u username -l # 查看
crontab -u username -e # 编辑

示例说明

实例1:每1分钟执行一次myCommand
* * * * * myCommand

实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand

实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2  *  * myCommand

实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand

实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb
0 */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart

示例13:每天8点和16点执行一次
0 8,16 * * *

示例14:每天03点 执行
00 03 * * * sh /root/back/bf.sh

cut

cut是一个很有用的 Linux 命令,当我们要截取文件的指定部分并打印到标准输出,当文本区域以及文件本身很大时,这个命令很有用。

#截取文件的前10列
cut -c1-10 txt_linuxmi

#截取该文件中的第二,第五和第七列
cut -d;-f2 -f5 -f7 txt_linuxmi

curl

参数解释:

-s/–silent #静音模式不输出任何东西
-S/–show-error #显示错误
-L 参数来跟踪URL重定向
-o 小写的欧 #重命名
-C#(大写的)断点续传

#默认使用查看网页源代码
[root@wj ~]# curl wangjian.run

#发送POST请求
curl -X POST -d "param1=value1&param2=value2" http://example.com/api

#使用HTTP认证
curl -u username:password http://protected.site


只下载文件

#-O 是大写的欧
curl -O https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm

下载文件并重新命名且支持断点续传

#-o 小写的欧,可以重新定义文件名
curl -Co /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

测试网站速度

curl -s -w \
     '\nLookup time:\t%{time_namelookup}\nConnect time:\t%{time_connect}\nAppCon time:\t%{time_appconnect}\nRedirect time:\t%{time_redirect}\nPreXfer time:\t%{time_pretransfer}\nStartXfer time:\t%{time_starttransfer}\n\nTotal time:\t%{time_total}\n' \
     -o /dev/null wangjian.run

执行的结果如下:
Lookup time:    0.012
Connect time:   0.031
AppCon time:    0.000
Redirect time:  0.000
PreXfer time:   0.031
StartXfer time: 0.852

Total time:     0.912

批量下载图片

从站点当前页面下载所有 PNG 文件(使用GNU grep)

curl https://example.com | \
grep --only-matching 'src="[^"]*.[png]"' | \
cut -d\" -f2 | \
while read i; do curl https://example.com/"${i}" \
-o "${i##*/}"; done

curl wangjian.run | \
grep --only-matching 'src="[^"]*.[png]"' | \
cut -d\" -f2 | \
while read i; do curl wangjian.run/"${i}" \
-o "${i##*/}"; done

e

find

#删除两天之前的
find ./ -name 1.txt +2 -exec rm -rf {} \;   

#删除三天之前的文件,其实就是保留最近4天的时间
find /root/back/ -name "*" -type f -mtime +3 -delete

#查找后,只显示最后两个
[root@wj 20211007]# find /var/log/ *.log | tail -2

#只打印第一级目录
find . -maxdepth 1 -name "*.sh

grep

不看注释和空行

[root@wj 1]# grep -v '#' 1.log -n #-n 可以显示行号
4:123
5:235
#不看注释和空行
[root@wj ~]# cat nginx-ln.conf | grep -v "#" | grep -v "^$"

或查询

grep 'pattern1\|pattern2' filename  方式1
grep -E 'pattern1|pattern2' filename  方式2
egrep 'pattern1|pattern2' filename  方式3
grep -e pattern1 -e pattern2 filename  方式4

且查询

方式1
grep -E 'pattern1.*pattern2' filename  
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename  
第一个例子如下:(其中两个pattern的顺序是指定的)
第二个例子:(两个pattern的顺序不是固定的,可以是乱序的)
方式2
grep -E 'pattern1' filename | grep -E 'pattern2'

Grep NOT操作

使用选项 grep -v

使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines。

grep -v 'pattern1' filename

head

#取第一行
head -n1  



history

#清除所有历史记录
[root@wj ~]# history -c

iptables

解释说明

iptables 使用三个不同的链来允许或阻止流量:输入(input)、输出(output)和转发(forward)

  • 输入(input) —— 此链用于控制传入连接的行为
  • 输出(output) —— 此链用于传出连接
  • 转发(forward) —— 这条链用于传入的连接,这些连接实际上不是在本地传递的,比如路由和 NATing

CentOS 7 上默认安装了 firewalld 作为防火墙,使用 iptables 建议关闭并禁用 firewalld。

systemctl stop firewalld
systemctl disable firewalld

安装 iptables

yum install -y iptables-services
systemctl enable iptables
systemctl stop iptables    
systemctl start iptables
systemctl status iptables

systemctl restart iptables
systemctl disable iptables 
systemctl stop iptables   

# 任何改动之前先备份,请保持这一优秀的习惯
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables

#默认文件配置信息
[root@localhost sysconfig]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]  #该规则表示INPUT表默认策略是ACCEPT
:FORWARD ACCEPT [0:0] #该规则表示FORWARD表默认策略是ACCEPT
:OUTPUT ACCEPT [0:0] #该规则表示OUTPUT表默认策略是ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #对于已经建立连接的数据,是允许访问的
-A INPUT -p icmp -j ACCEPT #允许icmp协议的访问,主要就是ping
-A INPUT -i lo -j ACCEPT #接受本地的所有请求
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #允许22端口被外部访问
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
# 上面两条的意思是在INPUT表和FORWARD表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机。
COMMIT

[root@localhost sysconfig]# more iptables.bak 
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

实例

#解释说明:
-A:在规则链的末尾加入新规则,input output forward
-p:指定协议可以是tcp、udp、icmp中的一个或 者全部all
-m state --stats:NEW表示包为新的连接  ESTABLISHED:已经联机成功的联机状态 
--dport:22 要通过的端口
-j:ACCEPT 接受 DROP 拒绝

#查看所有规则
iptables -L  或者 iptables -L -nv 或者 iptables -L -nv --line-number

#清空所有的防火墙规则(无任何限制,随意进出)
iptables -F 

#删除限制(本质就是删除记录)
iptables -t filter -D INPUT 1  #删除input的第1条规则

#配置文件修改
systemctl restart iptables
vim /etc/sysconfig/iptables
#以下端口对所有人开放,外部都可以访问到
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT


#网络知识
123.0.0.1到123.255.255.254  简写:123.0.0.0/8 
123.45.0.1到123.45.255.254  简写:124.45.0.0/16
123.45.6.1到123.45.6.254    简写:123.45.6.0/24


mail邮件邮箱

安装

yum install mailx -y

发送邮件

发送邮件
命令格式:echo '邮件内容' | mail -s '主题' <收件人>
内容直接用echo写出来
echo "内容123" |mailx -s "标题测试" root

使用文件进行邮件发送
mail -s "Hello from jsdig.com by file" admin@jsdig.com < mail.txt

配置个人邮箱

[root@localhost ~]# vim /etc/mail.rc
将下面配置添加到文件尾部
set smtp=smtp.163.com # 邮箱服务器地址
set smtp-auth=login # 认证方式:采用用户名和密码登录方式
set smtp-auth-user=xxx@163.com # 用户名
set smtp-auth-password=xxx # 密码(邮箱授权码)
set from=xxx@163.com # 绑定发件人

发送一个测试下
[root@localhost ~]# echo 'hello world!' | mail -s '你好' xxx@qq.com

journalctl日志

检索 systemd 日志,是 CentOS 7 才有的工具。

查看某个服务的日志

[root@wj ~]# journalctl -xeu sshd.service

journalctl 不带参数从旧到新

journalctl -r 从新到旧

journalctl -f 实时日志

journalctl –since 1 hour ago 查看1小时前到现在的日志

journalctl –since “2016-08-04 20:00:00” –until “2016-08-04 20:15:00” 查看8月4日晚上的日志

k

lsof

查看某个端口是被哪个服务使用

[root@wj ~]# lsof -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1000 root    3u  IPv4  21050      0t0  TCP *:ssh (LISTEN)
sshd    1000 root    4u  IPv6  21059      0t0  TCP *:ssh (LISTEN)
sshd    1592 root    3u  IPv4  22675      0t0  TCP wj:ssh->192.168.15.1:54887 (ESTABLISHED)

ln软连接

#链接文件,方便在root家目录下快速启动nginx
[root@wj ~]# ln -s /opt/nginx-1.24.0/sbin/nginx /root/nginx_start

#链接目录
ln -s /path/to/source/directory /path/to/link
#删除软连接
rm /path/to/link

#备注:
不加-s 表示创建硬链接

more

空格 显示下一屏
回车 显示下一行
b 显示上一屏
f 显示下一屏
q 退出

nslookup网络工具

nslookup 是一个用于查询域名系统(DNS)的命令行工具,它能够帮助用户诊断网络问题和解析域名或IP地址。

[root@rudder ~]# nslookup baidu.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   baidu.com
Address: 123.125.114.144
Name:   baidu.com
Address: 220.181.111.85
Name:   baidu.com
Address: 220.181.111.86

具体来说,nslookup 可以执行以下操作:

  1. 查询域名对应的IP地址:输入域名后,nslookup 会返回该域名的IPv4和/或IPv6地址。
  2. 查询IP地址对应的域名:输入IP地址后,nslookup 会尝试查找与之相关联的域名。
  3. 指定DNS服务器进行查询:用户可以选择特定的DNS服务器来进行查询,以获取不同服务器的解析结果。
  4. 查看不同类型的DNS记录:例如A记录、MX记录、CNAME记录等,以了解域名指向的具体信息。
  5. 诊断DNS问题:当网络连接出现问题时,使用nslookup 可以帮助确定问题是出在本地计算机还是DNS服务器上。

nslookup 支持交互模式和非交互模式两种使用方式:

  1. 非交互模式:直接在命令行中输入完整的命令和参数,如nslookup www.example.com,然后得到查询结果。
  2. 交互模式:先运行nslookup命令进入交互界面,然后可以逐步输入命令进行查询。

此外,除了命令行版本,还有基于网页的nslookup工具,如Nslookup.io,它允许用户在浏览器中选择不同的DNS服务器并查看各种类型的DNS记录。

总的来说,nslookup 是一个非常有用的工具,无论是网络管理员还是普通用户,都可以通过它来获取域名解析的相关信息,帮助解决网络连接问题。

o

pgrep

#查找名为ssh的进程
pgrep ssh
#查找包含字符串nginx的进程
pgrep -f nginx
#查找用户www-data运行的所有进程
pgrep -u www-data
#查找名为crond的最老进程的PID
pgrep -o crond

pkill杀死进程

pkill 命令:是ps命令和kill命令的结合,用来杀死指定进程

#杀死所有nginx的进程
pkill nginx 

ping

参数解释

  • -c ping的次数
  • -i 每次ping的间隔时间
  • -w 每次ping的等待时间,如果超过这个时间就不ping了

指定次数和时间,间隔ping

[root@localhost ~]# ping -c 5 -i 0.5 baidu.com
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=54 time=2.92 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=54 time=2.97 ms
64 bytes from 123.125.114.144: icmp_seq=3 ttl=54 time=2.99 ms
64 bytes from 123.125.114.144: icmp_seq=4 ttl=54 time=6.98 ms
64 bytes from 123.125.114.144: icmp_seq=5 ttl=54 time=3.14 ms

指定次数,时间,等待的时间

[root@wj ~]# ping -c1 -i1 -w1 192.168.15.129
PING 192.168.15.129 (192.168.15.129) 56(84) bytes of data.
64 bytes from 192.168.15.129: icmp_seq=1 ttl=64 time=0.220 ms

--- 192.168.15.129 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.220/0.220/0.220/0.000 ms

q

rpm

查看系统安装时间

[root@wj ~]# rpm -qi basesystem 
Name        : basesystem
Version     : 10.0
Release     : 7.el7.centos
Architecture: noarch
Install Date: 2024年01月24日 星期三 09时50分18秒   #系统安装时间
Group       : System Environment/Base
Size        : 0
License     : Public Domain
Signature   : RSA/SHA256, 2014年07月04日 星期五 08时46分57秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : basesystem-10.0-7.el7.centos.src.rpm
Build Date  : 2014年06月27日 星期五 18时37分10秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
Summary     : The skeleton package which defines a simple CentOS Linux system
Description :
Basesystem defines the components of a basic CentOS Linux
system (for example, the package installation order to use during
bootstrapping). Basesystem should be in every installation of a system,
and it should never be removed.

rsync同步备份

[root@wj ~]# yum -y install rsync
[root@wj ~]# rsync -av /home/  /backupdata/  #将/home/下面的文件,备份到/backupdata/

sed

日志查看

sed -n '/2019-07-30 20:00:00/,/2019-07-30 21:30:00/'p gateway.log

修改文件同时备份

[root@wj 1]# sed -i_bak 's/a/1/' 1.txt
[root@wj 1]# ls
1.txt  1.txt_bak
[root@wj 1]# more 1.txt
1bc
[root@wj 1]# more 1.txt_bak 
abc

查找以开头

#查找以<Directory 开头的
[root@wj conf]# sed -n '/^<Directory .*/p' httpd.conf
<Directory />
<Directory "/var/www">
<Directory "/root/data/sharefile">
<Directory "/var/www/cgi-bin">

在上面添加一行

#在以a开头的行前面添加一个行666
[root@wj 1]# more 1.txt
abc
dvf
ghy
[root@wj 1]# sed -i '/^a/i\666' 1.txt
[root@wj 1]# more 1.txt
666
abc
dvf
ghy



---修改---
#案例:修改默认端口,-i就直接修改了原文件
[root@wj ~]# sed -i 's/^#Port .*/Port 1022/' /etc/ssh/sshd_config

#案例:把DocumentRoot "/var/www/html",换成为 DocumentRoot "/root/data/sharefile"
[root@wj conf]# sed -n 's/^DocumentRoot .*/DocumentRoot "\/root\/data\/sharefile"/p' httpd.conf
DocumentRoot "/root/data/sharefile"

#案例:执行多个命令 用-e参数,同时把a变成A,把b换成B
sed -e 's/a/A/;s/b/B/' test.log

#案例:也可也把脚本写成文件,使用文件方式执行,把sed的命令写入文本中,为了方便识别,我们把文件的名字以.sed结尾
[root@wj ~]# more 1.sed 
s/a/A/
s/b/B/
[root@wj ~]# sed -f 1.sed test.log 
ABcd z34
ABcd 1244tt

SELinux

查看selinu是否关闭

[root@wj ~]# sestatus
SELinux status:                 disabled

ssh

端口测试

#这是不通的  Connection refused 连接被拒绝
[root@wj ~]# ssh -vp 221 192.168.15.128
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.15.128 [192.168.15.128] port 221.
debug1: connect to address 192.168.15.128 port 221: Connection refused
ssh: connect to host 192.168.15.128 port 221: Connection refused

#这是通的  看这个 debug1: Connection established.  已建立连接
[root@wj ~]# ssh -vp 3306 192.168.15.128
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.15.128 [192.168.15.128] port 3306.
debug1: Connection established.

#简单粗暴不看过程
[root@wj ~]# ssh -p 3306 192.168.15.128
ssh_exchange_identification: Connection closed by remote host
[root@wj ~]# ssh -p 13306 192.168.15.128
ssh: connect to host 192.168.15.128 port 13306: Connection refused
[root@wj ~]# 

ss

查看已启动的端口

[root@wj ~]# ss -tlwn
Netid State      Recv-Q Send-Q                                               Local Address:Port                                                              Peer Address:Port              
raw   UNCONN     0      0                                                             [::]:58                                                                        [::]:*                  
tcp   LISTEN     0      128                                                              *:22                                                                           *:*                  
tcp   LISTEN     0      100                                                      127.0.0.1:25                                                                           *:*                  
tcp   LISTEN     0      128                                                           [::]:22                                                                        [::]:*                  
tcp   LISTEN     0      128                                                           [::]:3000                                                                      [::]:*                  
tcp   LISTEN     0      100                                                          [::1]:25                                                                        [::]:*                  
tcp   LISTEN     0      128                                                           [::]:9090                                                                      [::]:*                  
tcp   LISTEN     0      80                                                            [::]:3306                                                                      [::]:*                  
tcp   LISTEN     0      128                                                           [::]:9100                                                                      [::]:*    

tail

查看最后一行信息

tail -n 1 file.txt

tar

参数解释:

-c	建立新的备份文件
-C	切换到指定的目录
-d	对比备份文件内和文件系统上的文件的差异
-x	解压缩归档文件
-v	显示指令执行过程
-f	指定归档文件的文件名
-t	查看归档文件内容
-j	通过 bzip2 指令处理备份文件
-z	通过 gzip 指令处理备份文件
-r	向现有存档文件追加或更新文件或目录
-v	显示指令执行过程
-W	验证归档文件
--totals	备份文件建立后,列出文件大小
--delete	从备份文件中删除指定的文件
--wildcards	在 unix tar 命令中指定匹配模式

只打包不压缩tar

#打包
tar -cvf archive.tar /home/cyberpunk/testdir/
#解包
tar -xvf Archive.tar -C /home/cyberpunk/testdir/

压缩的 tar.gz 归档文件 gzip

#打包
tar -cvzf compressedArchive.tar.gz /home/cyberpunk/testdir

#解包
tar -xvf Archive.tar.gz

生成压缩率更高的 tar.bz2 文件

tar 的 bz2 压缩,可以创建比 gzip 文件小的归档。Bz2 模式执行归档压缩和解压所需的时间比 gzip 模式多。
通常,这个时间差可以忽略不计,但如果文件非常大,或者是文件数量非常多,那么时间差就会非常大。

#打包
tar -cvfj Archive.tar.bz2 /home/cyberpunk/testdir
tar -jcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql #备份mysql

#解包
tar -xvf Archive.tar.bz2

从 tar 归档文件中提取单个文件

tar --extract --file=archive.tar file1.txt

从 tar 归档文件中提取多个文件

tar -xvf Archive.tar "file 1" "file 2"

使用通配符提取文件组

# tar -xvf Archive.tar --wildcards *.txt'

/home/cyberpunk/testdir/file1.txt
/home/cyberpunk/testdir/file2.txt
/home/cyberpunk/testdir/file3.txt

添加文件或目录到 tar 存档中

#要向现有的 tar 文件中添加文件或目录,可以使用 r 选项。
#例如,我们将 xyz.txt 文件和 php 目录添加到现有的 tecmint-14-09-12.tar 归档文件中。
tar -rvf Archive.tar xyz.txt  #add file
or
tar -rvf Archive.tar php      # add directory

tcpdump抓包

yum -y install tcpdump
yum -y install pv

网速测试

[root@wj ~]# tcpdump -i ens32 -w - | pv -bert >/dev/null
tcpdump: listening on ens32, link-type EN10MB (Ethernet), capture size 262144 bytes
66MiB 0:00:14 [23.9kiB/s]  #66表示总传输数据量,23.9kiB/s表示接口的网速
3269 packets captured
3272 packets received by filter
0 packets dropped by kernel

抓取所有的包

#-s 0 代表不限制包大小 ,0是数字0
#-w 代表输出文件
[root@wj ~]# tcpdump -s 0 -w out.pcap

IP过滤
默认网卡是eth0 如果不是这个需要指定网卡此方式收发都显示信息比较多
tcpdump -i ens32 host 192.168.67.131
如果只想看收,或者发 ,只需用dst 或者src即可 (dst目地  src源地址) 
tcpdump -i ens32 dst/src XXX   
网段过滤
tcpdump -i ens32 192.168.67.0/24
tcpdump -i ens32 192.168.67
端口过滤
tcpdump -i ens32 port 80
tcpdump -i ens32 dst port 80
多个端口
tcpdump -i ens32 port 80 or prot 22 
tcpdump -i ens32 port 80 or 22
端口范围
tcpdump -i ens32 portrange 8000-8080
tcpdump -i ens32 dst/src portrange 8000-8080
常用协议可直接写协议名称
tcpdump -i ens32 port http
tcpdump icmp(ping的协议) 
监听所有网卡
tcpdump -i any 
-w输出保持到文件中,可以保存为cap或者pacp格式,方便wireshark工具打开
tcpdump -i ens32 port http -w 1.pcap
抓取字段解释说明
这里以我随便抓取的一个 tcp 包为例来看一下
21:26:49.013621 IP 172.20.20.1.15605 &gt; 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
从上面的输出来看,可以总结出:
第一列:时分秒毫秒 21:26:49.013621
第二列:网络协议 IP
第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
第四列:箭头 &gt;, 表示数据流向
第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
第六列:冒号
第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面
Flags 标识符
使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种:
[S] : SYN(开始连接)
[P] : PSH(推送数据)
[F] : FIN (结束连接)
[R] : RST(重置连接)
[.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG
-a:尝试将网络和广播地址转换成名称;
-A:以ASCII格式打印输出
tcpdump -A -r tt.cap
tcpdump -A |grep baidu
-c&lt;数据包数目&gt;:收到指定20个数据包数目后,就停止进行倾倒操作;
tcpdump -c 20 -w tt.cap
-C: 指定一个1M的交换文件,-W 最多写3个文件,名字为abc0 abc1 abc2 默认从0开始
如果超过3个就循环的覆盖安装
tcpdump -C 1 -W 3 -w abc
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-D:显示所有可用的网络列表
[root@localhost ~]# tcpdump -D
1.virbr0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.ens32
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]
-e:在每列倾倒资料上显示连接层级的文件头,也会显示源和目的MAC地址
-f:用数字显示网际网络地址;
-F&lt;表达文件&gt;:指定内含表达方式的文件;
适合表达式长期维护
more fileter_rule
tcp port 80
tcpdump -F filter_rule
-i&lt;网络界面&gt;:使用指定的网络截面送出数据包;默认是第一块网卡
-l:使用标准输出列的缓冲区,在实时查看时,同时可以保存到文件
tcpdump -l | tee dat
tcpdump -l &gt; dat &amp; tail -f dat
-L:列出网络接口的已知数据链路
[root@localhost ~]# tcpdump -L
Data link types for virbr0 (use option -y to set):
  EN10MB (Ethernet)
  DOCSIS (DOCSIS) (printing not supported)
-n:不把主机的网络地址转换成名字;直接显示IP,避免执行DNS lookups 的过程,速度会快很多。
tcpdump -n 
-nn:不把协议和端口转化为名字,
tcpdump -nn
-N:不列出host的域名地方;将会打印nic 而不是nic.ddn.mil
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :简洁输出打印
-Q: 选择入方向还是出方向的数据包可选in out inout
tcpdump -Q in
tcpdump -Q out
tcpdump -Q inout
-r&lt;数据包文件&gt;:从指定的文件读取数据包数据;
-s&lt;数据包大小&gt;:设置每个数据包的大小;
默认是262144bytes
tcpdump -s 50  超出50字节就会被截断
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间;
-tt:在每列倾倒资料上显示未经格式化的时间戳记;
-ttt:输出每两行打印的时间间隔
-tttt:在每行的时间戳之前添加打印日期,此种方式输出的时间最直观
-T&lt;数据包类型&gt;:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-vvv:更加详细的显示
-x:用十六进制和ascii字码列出数据包资料;
tcpdump -X -r tt.cap
-r 读取数据,然后分析,也可以使用过滤分析。不用wireshark
tcpdump -r 1.log

ulimit

列出所有限制

[root@wj ~]# ulimit -a
core file size          (blocks, -c) 0  #0代表没有限制,每个文件的最大容量
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited #可建立的单一文件的大小
pending signals                 (-i) 7621
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024 #可同时开启的文件数量
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7621
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

修改同时开启的文件数量

cp /etc/security/limits.conf /etc/security/limits.conf.bak
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

修改完成后重新登陆即可。注销再次登陆即可

限制仅能建立10兆以下的文件

[root@wj ~]# ulimit -f 10240
[root@wj ~]# ulimit -a | grep 'file size'
core file size          (blocks, -c) 0
file size               (blocks, -f) 10240
[root@wj ~]# dd if=/dev/zero of=123 bs=1M count=20
文件大小超出限制
[root@wj ~]# dd if=/dev/zero of=123 bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.0193712 秒,541 MB/秒
[root@wj ~]# ll -h
总用量 105M
-rw-r--r--   1 root root  519 2月   6 23:04 -
drwxr-xr-x   2 root root 4.0K 2月   6 23:26 1
-rw-r--r--   1 root root  10M 3月  10 23:27 123

想要解除,需要注销再次登陆即可

wget

#默认直接下载
wget http://tel.mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso 

#综合应用 -b:后台下载 -c:支持断点下载
wget -bc http://192.168.1.10/abc.zip
备注:如果切换到后台下载了需要使用tail -f wget-log 查看进度情况

#下载重命名
wget -O wordpress.zip http://192.168.1.10/abc.zip 

#获取远程文件内容,不用保存到本地,以标准输出
wget -O- http://example.com/file.txt 
wget -O- http://xx.bashcommand.com/test.sh | sh #目前验证有问题

#下载指定格式文件
wget -r -A.pdf http://192.168.1.10/  

#下载整站到本地的download文件夹
wget --mirror -p --convert-links -P /root/download http://192.168.1.10/     
 
#指定目录下载
wget -P /home/download http://tel.mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso    

#限定最大下载字节数
wget -Q 1M http://tel.mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso    

#下载 http://tel.mirrors.163.com/centos/6.4/os/x86_64/ 目录中的所有文件
wget -r -np -nd http://tel.mirrors.163.com/centos/6.4/os/x86_64/   

#限速
wget --limit-rate=300k http://192.168.1.10/abc.zip    

伪装代理名称下载
wget --user-agent="Mozilla/5.0 (Windows NT 6.1; en-US) Chrome/10.0.648.204 Safari/534.16" http://192.168.1.10/abc.zip

#测试下载链接 正常会返回200
wget --spider wangjian.run    

#重试次数,默认20次
wget --tries=40 http://192.168.1.10/abc.zip    

#文件太大,存成多个小文件
wget -i http://192.168.1.10/abc.zip   

#下载FTP服务器的文件
wget --ftp-user=USERNAME --ftp-password=PASSWORD ftp://192.168.1.10/   

whereis

是一个命令行工具,用于查找文件或目录的位置。

[root@wj ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz

xargs

用于将标准输入数据转换为命令行参数,与find命令的-exec选项不同,xargs命令可以每次只获取一部分文件而不是全部,并且只为一个进程提供参数,避免因参数过长导致的溢出错误。特别是需要执行类似kill、rm等命令时。

#查找某个进程并杀死
ps -aux|grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9

#查找文件并删除
find /root/ -type f -name "*.txt" | xargs rm -rf

#把前面的结果,当做后面的参数,xargs后面默认是echo
[root@localhost ~]# echo "123" | xargs
123
[root@localhost ~]# echo "123" | xargs echo
123

#-n 1  一次打印一个,默认以空格当做分隔符
[root@localhost ~]# echo "123 456 789" | xargs -n 1
123
456
789

#-d 自定分隔符
[root@localhost ~]# echo -n "123456789" | xargs -d "2"
1 3456789

#-n  不输出换行
[root@localhost ~]# echo -n "123#456#789" | xargs -d "#"
123 456 789

#-p 确认是否要执行,先预览执行的结果 确认全部
[root@localhost ~]# echo -n "123456789" | xargs -d "2" -p
echo 1 3456789 ?...y
1 3456789
# -p -n 1 一次确认一个 
[root@localhost ~]# echo -n "123456789" | xargs -d "2" -p -n 1
echo 1 ?...y
1
echo 3456789 ?...y
3456789

#-t 把每次的执行结果打印出来
[root@localhost ~]# echo -n "123456789" | xargs -d "2" -t -n 1
echo 1 
1
echo 3456789 
3456789

#把管道之前的结果,保存给一个{} ,当做第二个括号的结果
[root@localhost ~]# echo -n "123456789" | xargs -I {} echo {}
123456789

#-r 空参数,不输出
[root@localhost ~]# echo | xargs echo 

[root@localhost ~]# echo | xargs -r echo 
[root@localhost ~]# 

#输出为一行
[root@localhost ~]# cat 2.txt
123
abc
789
\a \n
[root@localhost ~]# cat 2.txt | xargs echo
123 abc 789 a n
#每行显示2个
[root@localhost ~]# cat 2.txt | xargs -n 2 echo
123 abc
789 a
n

#批量创建文件
[root@localhost 2]# cat 2.txt | xargs touch
[root@localhost 2]# ls
123  2.txt  789  a  abc  n

#批量删除文件
[root@localhost 2]# cat 2.txt
123
abc
789
\a \n
[root@localhost 2]# cat 2.txt | xargs touch
[root@localhost 2]# ls
123  2.txt  789  a  abc  n
[root@localhost 2]# cat 2.txt | xargs rm
[root@localhost 2]# ls
2.txt
#是否确认删除 -p,全部确认
[root@localhost 2]# cat 2.txt | xargs -p rm
rm 123 abc 789 a n ?...y
[root@localhost 2]# ls
2.txt
#是否确认删除 -n,一个一个的确认
[root@localhost 2]# cat 2.txt | xargs -p -n 1 rm
rm 123 ?...y
rm abc ?...y
rm 789 ?...y
rm a ?...y
rm n ?...y
[root@localhost 2]# ls
2.txt

yum

常用命令

#查找软件
yum search 包名
安装桌面或者软件组 先把语言临时设置为英文
#6版本
yum -y groupinstall "GNOME Desktop"  
#7版本
yum -y groupinstall "Server with GUI"
#只下载包不安装
mkdir -p /root/mysql
yum -y install --downloadonly --downloaddir=/root/mysql/ mysql-community-server
#下载 docker-ce 的更新包到 docker 目录下
yum update docker-ce --downloadonly --downloaddir=/root/docker
下载所有系统/软件更新相关的包
yum update --downloadonly --downloaddir=/root/packages/centos/7/x86_64/updates

本地yum源配置

光盘挂载

mount -t iso9660 /dev/sr0 /mnt
mount /dev/sr0 /mnt  

卸载光盘

umount /dev/sr0  

本地IOS挂载

mount -o loop /root/wj/rhel-server-6.8-x86_64-dvd.iso /mnt

挂载U盘

linux默认是不支持NTFS文件系统的
fdisk -l  查看U盘设备文件名
mkdir /mnt/usb
mount -t vfat /dev/sdb1 /mnt/usb   sdb1是U盘的名称

配置文件修改

##6和7版本
cat > wj.repo <<EOF
[wj] 
name=wj 
baseurl=file:///mnt 
enabled=1 
gpgcheck=0
EOF

#8版本
[BaseOS] 
name=wj 
baseurl=file:///mnt/BaseOS/ 
enabled=1 
gpgcheck=0 
[AppStream] 
name=wj 
baseurl=file:///mnt/AppStream/ 
enabled=1 
gpgcheck=0


相关配置参数说明
[rhel] ---要有或者[InstallMedia]  仓库名称
name=Red 随便写   仓库描述
baseurl=file:///media/RHEL-6.8 Server.x86_64   media是挂载的目录
baseurl=ftp://192. 168. 0. 6/pub/Server   ftp的配置
enabled=1 --是否启用仓库  1代表启用
gpgcheck=0 ---是否检查包的签名  0代表不检查

开机自启

注意:7.x版本需要给/etc/rc.d/rc.local 加执行权限

echo "mount -o loop /root/rhel-server-7.9-x86_64-dvd.iso /mnt" >> /etc/rc.local
chmod a+x /etc/rc.local

yum源更换

sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo

z

综合应用

编码格式转换

:set ff=unix

语言修改

#临时修改英文
export LANG=en_US.utf-8
#临时修改中文
export LANG=zh_CN.utf-8

#centos8 修改方式
#修改英文
echo "export LC_ALL=en_US.UTF-8" >> /etc/profile 

系统启动级别

centos7版本
#命令行模式
sudo systemctl set-default multi-user.target

#图形模式
sudo systemctl set-default graphical.target

#快捷指令
要进入图形界面,只需要输入命令 startx
从图形界面切换回命令行:ctrl+alt+F7
从命令行切换到图形界面:ctrl+alt+F7
要进入命令行模式:ctrl+alt+F2



免密码登录

方式1:公钥方式

A\B机器,如果A访问B免密,就把A的公钥给B,反之亦然

ssh-keygen 或 ssh-keygen -t rsa 或 ssh-keygen -t dsa

  • 用ssh-keygen生成私钥和公钥,没加参数默认没有加密
  • ssh-keygen -t rsa 使用rsa方式加密
  • ssh-keygen -t dsa 使用dsa方式加

步骤1:创建公钥 执行完成后,一路回车即可,执行后,会在/root当前用户/.ssh目录下找到id_rsa(私钥)和id_rsa.pub(公钥)

ssh-keygen -t rsa

步骤2:复制公钥到其它机器,一路回车即可。192.168.67.131是需要远程访问的机器

 [root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [192.168.67.131]

常见错误:
-bash: ssh-copy-id: command not found //提示命令不存在
解决办法:yum -y install openssh-client

以下没做测试


root用户远程非root用户(普通用户),第一次需要密码登录
[root@linuxidcjustyumserver ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub test@192.168.2.2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
test@192.168.2.2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'Oracle@192.168.2.2'"
and check to make sure that only the key(s) you wanted were added.

方式2:通过scp将内容写到对方的文件中
命令:scp -p ~/.ssh/id_rsa.pub root@<remote_ip>:/root/.ssh/authorized_keys

举例:

# scp -p ~/.ssh/id_rsa.pub root@192.168.2.5:/root/.ssh/authorized_keys
#root@10.40.34.183's password:
id_rsa.pub
# ssh root@192.168.2.5
Last login: Thu Nov 15 16:54:59 2018 from 192.168.2.3
也可以分为两步操作:

# scp ~/.ssh/id_rsa.pub root@<remote_ip>:pub_key //将文件拷贝至远程服务器
# cat ~/pub_key >>~/.ssh/authorized_keys //将内容追加到authorized_keys文件中, 不过要登录远程服务器来执行这条命令


方式3:
id_rsa.pub里是公钥,如果需要登录到远程主机,需要到远程主机/root/root/.ssh目录下,
新建authorized_keys文件,并将id_rsa.pub里的内容复制进去:
# touch /root/.ssh/authorized_keys
这个操作看要不要登录到远程的机器上,如果需要,就添加,不需要,可以不建。

注意:新建后,需要更改authorized_keys文件的用户权限,不然文件无法生效,ssh公钥生效需满足至少下面两个条件:
1、 .ssh目录的权限必须是700
2 、.ssh/authorized_keys文件权限必须是600
执行下面命令
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys


方式4
每台服务器下都输入命令 ssh-keygen -t rsa,生成 key,一律不输入密码,直接回车,/root 就会生成 .ssh 文件夹。

在 Master 服务器下,合并公钥到 authorized_keys 文件,进入 /root/.ssh 目录,通过 SSH 命令合并:

[root@linuxidc ~]# cd /root/.ssh/
[root@linuxidc .ssh]# cat id_rsa.pub >> authorized_keys
[root@linuxidc .ssh]# ssh root@192.168.2.10 cat ~/.ssh/id_rsa.pub>> authorized_keys 这里的id_rsa.pub是slave服务器的,合并到Mastere服务器的文件中
把 Master 服务器的 authorized_keys复制到 Slave 服务器的 `/root/.ssh 目录

[root@linuxidc.ssh]# scp authorized_keys root@192.168.2.10:/root/.ssh/

完成,ssh root@192.168.2.10 就不需要输入密码登录了

方式2:expect

expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录。

yum install expect -y

scp示例
[root@BS-WORKERMAN-NFS package]# cat scp.sh
#!/bin/bash
src=/package
dsc=/root/
for i in {4,5,6}
do
expect -c "
spawn scp -r $src/scp.sh root@10.20.18.2$i:$dsc
expect {
\"*assword\" {set timeout 300; send \"game2017\.\/\r\";}
\"yes/no\" {send \"yes\r\"; exp_continue;}
}
expect eof"
done

ssh
#!/bin/bash
expect -c "
spawn ssh root@192.168.1.204 \"ls;\"
expect {
\"*assword\" {set timeout 300; send \"password\r\";}
\"yes/no\" {send \"yes\r\"; exp_continue;}
}
expect eof"


以上内容来自:https://www.cnblogs.com/mologa-jie/p/6064815.html

安全强化 SSH 远程连接

  • 禁用 root 用户登录

为此,首先,禁用 root 用户的 SSH 访问并创建一个具有 root 权限的新用户。关闭 root 用户的服务器访问是一种防御策略,可以防止攻击者实现入侵系统的目标。例如,你可以创建一个名为 exampleroot 的用户,如下所示:

useradd -m exampleroot
passwd exampleroot
usermod -aG sudo exampleroot

以下是上述命令的简要说明:

  • useradd 创建一个新用户,并且 – m 参数在你创建的用户的主目录下创建一个文件夹。
  • passwd 命令用于为新用户分配密码。请记住,你分配给用户的密码应该很复杂且难以猜测。
  • usermod -aG sudo 将新创建的用户添加到管理员组。

在用户创建过程之后,需要对 sshd_config 文件进行一些更改。你可以在 / etc/ssh/sshd_config 找到此文件。使用任何文本编辑器打开文件并对其进行以下更改:

# Authentication: 
#LoginGraceTime 2m 
PermitRootLogin no 
AllowUsers exampleroot

PermitRootLogin 行将阻止 root 用户使用 SSH 获得远程访问。在 AllowUsers 列表中包含 exampleroot 会向用户授予必要的权限。
最后,使用以下命令重启 SSH 服务:

> sudo systemctl restart ssh
  • 更改默认22端口

默认的 SSH 连接端口是 22。当然,所有的攻击者都知道这一点,因此需要更改默认端口号以确保 SSH 安全。尽管攻击者可以通过 Nmap 扫描轻松找到新的端口号,但这里的目标是让攻击者的工作更加困难。

要更改端口号,请打开 / etc/ssh/sshd_config 并对文件进行以下更改:

Include /etc/ssh/sshd_config.d/*.conf
Port 22099

在这一步之后,使用 sudo systemctl restart ssh 再次重启 SSH 服务。现在你可以使用刚刚定义的端口访问你的服务器。如果你使用的是防火墙,则还必须在此处进行必要的规则更改。在运行 netstat -tlpn 命令时,你可以看到你的 SSH 端口号已更改。

  • 禁止使用空白密码的用户访问

在你的系统上可能有你不小心创建的没有密码的用户。要防止此类用户访问服务器,你可以将 sshd_config 文件中的 PermitEmptyPasswords 行值设置为 no。

PermitEmptyPasswords no
  • 限制登录 / 访问尝试

默认情况下,你可以根据需要尝试多次输入密码来访问服务器。但是,攻击者可以利用此漏洞对服务器进行暴力破解。通过指定允许的密码尝试次数,你可以在尝试一定次数后自动终止 SSH 连接。

为此,请更改 sshd_config 文件中的 MaxAuthTries 值。

MaxAuthTries 3
  • 使用 SSH 版本 2

SSH 的第二个版本发布是因为第一个版本中存在许多漏洞。默认情况下,你可以通过将 Protocol 参数添加到 sshd_config 文件来启用服务器使用第二个版本。这样,你未来的所有连接都将使用第二个版本的 SSH。

Include /etc/ssh/sshd_config.d/*.conf 
Protocol 2
  • 关闭 TCP 端口转发和 X11 转发

攻击者可以尝试通过 SSH 连接的端口转发来访问你的其他系统。为了防止这种情况,你可以在 sshd_config 文件中关闭 AllowTcpForwarding 和 X11Forwarding 功能。

X11Forwarding no 
AllowTcpForwarding no
  • 使用 SSH 密钥连接

连接到服务器的最安全方法之一是使用 SSH 密钥。使用 SSH 密钥时,无需密码即可访问服务器。另外,你可以通过更改 sshd_config 文件中与密码相关的参数来完全关闭对服务器的密码访问。

创建 SSH 密钥时,有两个密钥:Public 和 Private。公钥将上传到你要连接的服务器,而私钥则存储在你将用来建立连接的计算机上。

在你的计算机上使用 ssh-keygen 命令创建 SSH 密钥。不要将密码短语字段留空并记住你在此处输入的密码。如果将其留空,你将只能使用 SSH 密钥文件访问它。但是,如果你设置了密码,则可以防止拥有密钥文件的攻击者访问它。例如,你可以使用以下命令创建 SSH 密钥:

ssh-keygen
  • SSH 连接的 IP 限

大多数情况下,防火墙使用自己的标准框架阻止访问,旨在保护服务器。但是,这并不总是足够的,你需要增加这种安全潜力。

为此,请打开 / etc/hosts.allow 文件。通过对该文件进行的添加,你可以限制 SSH 权限,允许特定 IP 块,或输入单个 IP 并使用拒绝命令阻止所有剩余的 IP 地址。

下面你将看到一些示例设置。完成这些之后,像往常一样重新启动 SSH 服务以保存更改。

sshd : 192.168.1.0/24 : ALLOW

中断脚本

我们需要使用exit命令来实现以上描述的情境。exit命令被强制输出非0值时,脚本会报错并退出。在 Unix 环境下的 shell 脚本中,0值表示成功执行。因此,在脚本终止前执行一个不带引号的exit -1命令将使脚本中止。


#!/bin/bash
echo "Hello"
exit -1
echo "bye"

执行结果
[root@localhost ~]# sh 1.sh 
Hello

权限管理

文件夹管理

假如你是一个员工组的团队领导,为xyz公司工作。公司要求你创建一个dir_xyz目录,让该组成员都能在该目录下创建或访问文件,但是除了文件创建者之外的其他人不能删除文件,你会怎么做?


# mkdir dir_xyz
# chmod g+wx dir_xyz
# chmod +t dir_xyz

第一行命令创建了一个目录(dir_xyz),上面的第二行命令让组(g)具有‘写’和‘执行’的权限,而上面的最后一行命令——权限位最后的‘+t’是‘粘滞位’,它用来替换‘x’,表明在这个目录中,文件只能被它们的拥有者、目录的拥有者或者是超级用户root删除。

一般的,在Linux系统中用户只要对某个目录具备w写入权限,便可以删除该目录中的任何文件,而不论这个文件的权限是什么。比较典型的例⼦就是“/tmp”、 “/var/tmp”目录。这两个目录作为Linux系统的临时文件夹,权限为“rwxrwxrwx”,即允许任意用户、任意程序在该目录中进行创建、删除、移动文件或目录等操作。粘滞位权限便是针对此种情况设置,当目录被设置了粘滞位权限以后,即便用户对该目录有写入权限,也不能删除该目录中其他用户的文件数据,而是只有该文件的所有者和root用户才有权将其删除。设置了粘滞位之后,正好可以保持一种动态的平衡:允许各用户在目录中任意写入、删除数据,但是禁止随意删除其他用户的数据。需要注意的是,粘滞位权限只能针对目录设置,对于文件无效。

磁盘管理lvm

物理卷PV

最底层的物理卷

PV命令
pvcreate /dev/vdb #将物理分区vdb磁盘建立成为PV
pvscan 查找目前系统里面任何具有PV的磁盘
pvdisplay /dev/vda5 显示目前系统上面的PV状态
pvremove 将PV 属性删除,让该分区不具有 PV 属性。

卷组 VG

就是将多个最底层的物理卷 pv,整合成一个 vg

物理扩展块PE

lvm 模式使用 4MB的 pe 数据库。

逻辑卷 lv

最终的 vg 还会被切成 lv,通常文件名为/dev/vgname/lvname的格式

磁盘相关命令

df -Th 这个命令会显示文件系统的磁盘空间利用率以及文件系统类型。
blkid 这个命令可以显示块设备的UUID和文件系统类型。
lsblk 这个命令会显示块设备和分区上的文件系统类型。lsblk -f会显示更详细的
mount 这个命令会显示已经挂载的文件系统以及它们的类型。
parted -l 这个命令用于显示磁盘分区信息,包括每个分区的文件系统类型。

磁盘挂载组LVM

1:pvcreate /dev/vdb #将物理分区vdb磁盘建立成为PV
2:vgextend VolGroup /dev/vdb #用vgs看组名 例如:centos
3:lvextend -L +49G /dev/mapper/VolGroup-lv_root 
4: 若根分区为ext,则执行resize2fs /dev/mapper/VolGroup-lv_root
若为其他,则执行 xfs_growfs /dev/mapper/VolGroup-lv_root

错误1:由于系统为centos7系统,文件格式为xfs
[root@jituan-xiaofei-docker01 ~]# resize2fs /dev/centos/root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/centos/root
Couldn't find valid filesystem superblock.

文件解决
所以需要使用以下命令刷新lv
xfs_growfs  /dev/centos/root

LVM实战演练

##原系统信息 有两个盘sda sdb
[root@wj ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0  199G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0  147G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
sr0              11:0    1  988M  0 rom  
[root@wj ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  898M     0  898M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M  9.5M  901M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        50G  4.3G   46G    9% /
/dev/sda1               xfs      1014M  153M  862M   16% /boot
/dev/mapper/centos-home xfs       147G   33M  147G    1% /home
tmpfs                   tmpfs     182M     0  182M    0% /run/user/

##开始扩容
[root@wj ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.
[root@wj ~]# vgs
  VG     #PV #LV #SN Attr   VSize    VFree
  centos   1   3   0 wz--n- <199.00g 4.00m
[root@wj ~]# vgextend centos /dev/sdb
  Volume group "centos" successfully extended
[root@wj ~]# lvextend -L +20G /dev/mapper/centos-root
  Size of logical volume centos/root changed from 50.00 GiB (12800 extents) to 70.00 GiB (17920 extents).
  Logical volume centos/root successfully resized.
[root@wj ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 13107200 to 18350080
[root@wj ~]# df -h  #已增加20G扩容到了70G
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 898M     0  898M    0% /dev
tmpfs                    910M     0  910M    0% /dev/shm
tmpfs                    910M  9.5M  901M    2% /run
tmpfs                    910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root   70G  4.3G   66G    7% /
/dev/sda1               1014M  153M  862M   16% /boot
/dev/mapper/centos-home  147G   33M  147G    1% /home
tmpfs                    182M     0  182M    0% /run/user/0

swap

使用文件创建内存交换文件
#先看原来的大小
[root@wj ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1993         101        1677           8         214        1808
Swap:          2047           0        2047

#使用dd这个命令创建一个128MB文件
[root@wj ~]# dd if=/dev/zero of=/root/swap bs=1M count=128
记录了128+0 的读入
记录了128+0 的写出
134217728字节(134 MB)已复制,0.0754787 秒,1.8 GB/秒
[root@wj ~]# ll -h /root/swap 
-rw-r--r-- 1 root root 128M 3月  11 01:49 /root/swap

#使用mkswap将swap文件格式化为内存交换文件的文件格式
[root@wj ~]# mkswap /root/swap 
正在设置交换空间版本 1,大小 = 131068 KiB
无标签,UUID=ada0c3e6-84c0-46e6-a1f2-a505faa4511e

#使用swapon来讲swap启动
[root@wj ~]# swapon /root/swap
swapon: /root/swap:不安全的权限 0644,建议使用 0600。

#列出目前使用的内存交换分区设备有哪些
[root@wj ~]# swapon -s
文件名                          类型            大小    已用    权限
/dev/dm-1                               partition       2097148 0       -2
/root/swap                              file    131068  0       -3

#设置开机自启,不要用uuid,因为系统仅会查块设备,不会去查文件
[root@wj ~]# more /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 15 20:55:52 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/ao-root     /                       xfs     defaults        0 0
UUID=4d6381ae-3f76-442b-ad85-a1de2e776b61 /boot                   xfs     defaults        0 0
UUID=CD81-1E9E          /boot/efi               vfat    umask=0077,shortname=winnt 0 0
/dev/mapper/ao-swap     swap                    swap    defaults        0 0
/root/swap              swap                    swap    defaults        0 0

#关闭swap file
[root@wj ~]# swapoff /root/swap 
[root@wj ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1993         101        1553           8         338        1807
Swap:          2047           0        2047
[root@wj ~]# 

使用物理分区创建内存交换分区

书上有,待学习。

shell脚本

常见的shell

# 常见的shell 有哪些
 Bourne Shell(/usr/bin/sh或/bin/sh)
 Bourne Again Shell(/bin/bash)
 C Shell(/usr/bin/csh)
 K Shell(/usr/bin/ksh)
 Shell for Root(/sbin/sh)
# 最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境

重定向

python hello.py > output.txt   # 标准输出到(文件)
python hello.py >> output.txt  # 标准输出到(文件),追加
python hello.py 2> error.log   # 标准错误到(文件)
python hello.py 2>&1           # 标准错误到标准输出
python hello.py 2>/dev/null    # 标准错误到(空null)
python hello.py &>/dev/null    # 标准输出和标准错误到(空null)
python hello.py < foo.txt      # 将 foo.txt 提供给 python 的标准输入

系统环境变量

#Shell常见的系统环境变量
PATH    命令所示路径,以冒号为分割;
HOME    打印用户家目录;
SHELL   显示当前Shell类型;
USER    打印当前用户名;
ID      打印当前用户id信息;
PWD     显示当前所在路径;
TERM    打印当前终端类型;
HOSTNAME    显示当前主机名;
PS1         定义主机命令提示符的;
HISTSIZE    历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
RANDOM      随机生成一个 0 至 32767 的整数;

颜色输出

-e  启用反斜杠转义的解释
#字体颜色31-37 默认=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,紫色=35,天蓝色=36,白色=3
echo -e "\e[31m红色文字\e[0m"
echo -e "\e[32m绿色文字\e[0m"

#举例说明
echo -e "\e[1;33;41m test content \e[0m"
\e 转义起始符,定义一个转义序列, 可以使用 \033代替

[ 表示开始定义颜色

1表示高亮,33表示字体颜色为黄色,45表示背景色为红色

“test content” 属于文字内容

m 转义终止符,表示颜色定义完毕

再次使用 \e[ ,表示再次开启颜色定义,0表示使用默认的颜色,m表示颜色定义结束,所以 \e[0m 的作用是恢复之前的配色方案

#背景颜色41-47

# 显示方式1-8
0	普通字符(复位或正常)	关闭所有属性
1	粗体字	
2	弱化(降低强度)	未广泛支持
3	斜体	未广泛支持有时为反相显示
4	下划线	
5	缓慢闪烁	
6	快速闪烁	
7	反显	
8	隐藏	未广泛支持。
9	划除	

常见运算符

判断用户是否存在

if id -u "nginx" >/dev/null 2>&1; then
    echo "nginx用户存在"
else
    echo "nginx用户不存在"
fi

for 循环

while 循环


while  (表达式)
do
  语句1
done

#求 1-100 的总和
j=0
i=1
while ((i&lt;=100))
do
     j=`expr $i + $j`
     ((i++))
done
echo $j

break 和 continue 语句

break 和 continue 语句
  break 是终止循环。
  continue 是跳出当前循环。
#示例 1:在死循环中,满足条件终止循环
while true; do
  let N++
  if [ $N -eq 5 ]; then
    break
fi
  echo $N
done
输出:1 2 3 4
#示例 2:举例子说明 continue 用法
N=0
while [ $N -lt 5 ]; do
  let N++
if [ $N -eq 3 ]; then
  continue
fi
  echo $N
done
输出:1 2 4
# 打印 1-100 数字
i=0
while ((i&lt;=100))
do
        echo  $i
        i=`expr $i + 1`
done

case 选择语句

>#Case选择语句,主要用于对多个选择条件进行匹配输出 case 模式名 in 模式 1) 命令 ;; 模式 2) 命令 ;; *) 不符合以上模式执行的命令 esac # 每个模式必须以右括号结束,命令结尾以双分号结束。

使用 case 编写一个 httpd 服务启动脚本

while true do echo -e ” \033[31m start \033[0m \033[32m stop \033[0m \033[33m status \033[0m \033[34m quit \033[0m ” read -p “请输入你的选择start|stop|quit:” char case $char in start) systemctl start httpd && echo “httpd服务已经开启” || echo “开启失败” ;; stop) systemctl stop httpd && echo “httpd服务已经关闭” || echo “关闭失败” ;; restart) systemctl restart httpd && echo “httpd服务已经重启” || echo “重启失败 ” ;; status) systemctl status httpd && echo -e ” httpd 的服务状态 ;; quit)

select 选择语句菜单创建

select 是一个类似于 for 循环的语句 #Select语句一般用于选择,常用于选择菜单的创建 #可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾: select i in (表达式) do 语句 done

案例

# 选择mysql 版本 #!/bin/bash PS3=”Select a number: ” while true; do select mysql_version in 5.1 5.6 quit; do case $mysql_version in 5.1) echo “mysql 5.1” break ;; 5.6) echo “mysql 5.6” break ;; quit) exit ;; *) echo “Input error, Please enter again!” break esac done done

案例

#!/bin/bash #by author rivers on 2021-9-27 PS3=”Please enter you select install menu:” select i in http php mysql quit do case $i in http) echo -e ” \033[31m Test Httpd \033[0m” ;; php) echo -e “\033[32m Test PHP\033[0m” ;; mysql) echo -e “\033[33m Test MySQL.\033[0m” ;; quit) echo -e “\033[32m The System exit.\033[0m” exit esac done

for菜单创建

#!/bin/bash
echo "欢迎使用菜单选项"
echo "请选择你要执行的操作:"
options=("选项1" "选项2" "选项3" "退出")
# 循环显示菜单选项
for option in "${options[@]}"
do
    echo "$option"
done
# 读取用户的选择
read -p "请选择一个选项 (输入选项编号): " choice
# 判断用户的选择
if [[ $choice -eq 1 ]]; then
    echo "你选择了选项1"
    # 在这里添加选项1的逻辑代码
elif [[ $choice -eq 2 ]]; then
    echo "你选择了选项2"
    # 在这里添加选项2的逻辑代码
elif [[ $choice -eq 3 ]]; then
    echo "你选择了选项3"
    # 在这里添加选项3的逻辑代码
elif [[ $choice -eq 4 ]]; then
    echo "你选择了退出"
    # 在这里添加退出的逻辑代码
else
    echo "无效的选择,请重新输入"
fi

函数数组

函数

Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号 # 函数语法 func() { command1 command1 …… } func # 直接调用函数名 #实例 #!/bin/bash func() { VAR=$((1+1)) return $VAR echo “This is a function.” } func echo $?

数组

数组是相同类型的元素按一定顺序排列的集合。 格式:array=(元素 1 元素 2 元素 3 …) 用小括号初始化数组,元素之间用空格分隔。 定义方法 1:初始化数组 array=(a b c) 定义方法 2:新建数组并添加元素 array[下标]=元素 定义方法 3:将命令输出作为数组元素array=($(command))

遍历数组

#方法 1:
#!/bin/bash
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
for ((i=0;i&lt;${#IP[*]};i++)); do
echo ${IP[$i]}
done
# bash test.sh
10.0.0.1
10.0.0.2
10.0.0.3
#方法 2:
#!/bin/bash
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
for   IP   in ${IP[*]}; do
echo $IP
done</code></pre>

脚本语法检查

自带功能检查

Shell本身提供一些调试方法选项:

-n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
-v,一边执行脚本,一边将执行过的脚本命令打印到标准输出。
-x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
使用这些选项有三种方法(注意:避免几种调试选项混用)

1.在命令行提供参数:sh -x script.sh 或者 bash -n script.sh
2.脚本开头提供参数:#!/bin/sh -x 或者 #!/bin/bash -x
3.在脚本中用set命令启用或者禁用参数,其中set -x表示启用,set +x表示禁用

按照软件检查

Debian/Ubuntu:

apt-get install shellcheck

centos/rhel:

yum -y install epel-release
yum -y install ShellCheck

使用:
shellcheck 脚本名字

判断服务器是否可以联网

#判断是否可以联网,如果不能联网,就退出操作
if ping -c 1 baidu.com &>/dev/null ; then    
echo -e "\e[32m连接互联网正常\e[0m"
else    
echo -e "\e[5;31m连接互联网失败\e[0m"    
exit
fi

判断当前用户是否是root用户

#判断当前用户是否是root用户,如果不是就退出操作
yonghuid=`id | awk '{print $1}' | awk -F "=" '{print $2}' | awk -F "(" '{print $1}'`
dangqianyonghu=`id | awk '{print $1}' | awk -F "(" '{print $2}' | awk -F ")" '{print $1}'`
if [[ 0 != $yonghuid ]];then	
	echo "你的当前的用户是【$dangqianyonghu】不是【root】用户,请切换用户后在操作"	
	break
else
	echo "++++++++当前是root用户,开始执行操作++++++++"
fi

查询IP访问情况

#查看nginx访问IP数
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /var/log/nginx/access.log |sort |uniq -c
#httpd
#查询IP的访问访问数量,提取前10个访问次数最多的IP
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/httpd/logs/ssl_access_log |sort |uniq -c | sort -rn | head -10
</code></pre>

查看系统账号情况

<pre class="wp-block-zibllblock-enlighter"><code class="gl" data-enlighter-language="shell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#/bin/bash#查询系统多少个账号zhanghao=`more /etc/passwd | wc -l`shellid=`more /etc/passwd | grep "/bin/bash" | wc -l`bunengid=`more /etc/passwd | grep -v "/bin/bash" | wc -l`wumima=`more /etc/passwd | grep "/bin/bash" | awk -F ":" '{print $1}'`mimabiao=`more /etc/shadow | awk -F ":" '{print $1}'`#echo $wumimac=`more /etc/shadow | grep "$wumima" | awk -F ":" '{print $2}' | grep "!!" | wc -l`echo "系统共有$zhanghao个账号;"echo "用于登录的账号有$shellid个;"echo "不能用于登录的账号有$bunengid个;"if [ $c = 0 ];then	echo "可以登录但是没有设置密码的账号有$c个,此处没有账号安全风险;"else	echo "可以登录但是没有设置密码的账号有$c个,此处存在安全风险;"fi</code></pre>

执行结果

[root@localhost ~]# sh id.sh 系统共有23个账号;用于登录的账号有3个;不能用于登录的账号有20个;可以登录但是没有设置密码的账号有1个,此处存在安全风险;</code></pre>

随机点名

该脚本,需要提前准备一个user.txt的文件
#文件中一行一个姓名
while : 
do
  line=`cat user.txt | wc -l`
  num=$[RANDOM%line+1]
  sed -n "${num}p" user.txt
  sleep 0.2
  clear
done
</code></pre>

主机是否存活

Network=$1
for Host in $(seq 120 130)
	do
		ping -c 1 $Network.$Host &gt; /dev/null &amp;&amp; result=0 || result=1
		if [ "$result" == 0 ];then
  			echo -e "\033[32;1m$Network.$Host is up \033[0m"
  			echo "$Network.$Host" &gt;&gt; /tmp/up.txt
		else
  			echo -e "\033[;31m$Network.$Host is down \033[0m"
  			echo "$Network.$Host" &gt;&gt; /tmp/down.txt
		fi
	done</code></pre>

执行结果

[root@localhost ~]# sh 1.sh 192.168.67
192.168.67.120 is down 
192.168.67.121 is down 
192.168.67.122 is down 
192.168.67.123 is down 
192.168.67.124 is down 
192.168.67.125 is down 
192.168.67.126 is down 
192.168.67.127 is down 
192.168.67.128 is down</code></pre>

每10秒循环判断用户是否登录系统

USERS="wj"
while true
do
        echo "The Time is `date +%F-%T`"
        sleep 10
        NUM=`who|grep "$USERS"|wc -l`
        if [[ $NUM -ge 1 ]];then
                echo "The $USERS is login in system."
        fi
done</code></pre>

猜数字游戏

#!/bin/bash
# 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
# 猜小了或猜大了,直至用户猜对脚本结束。
# RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
# 使用取余算法将随机数变为 1‐100 的随机数
num=$[RANDOM%100+1]
#echo "$num"
# 使用 read 提示用户猜数字
# 使用 if 判断用户猜数字的大小关系:
#‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
# ‐lt(小于),‐le(小于等于)
while :
do 
 read -p "系统随机生成了一个1‐100的随机数,你猜是几: " cai  
    if [ $cai -eq $num ]   
    then     
        echo "恭喜,猜对了"     
        exit  
     elif [ $cai -gt $num ]  
     then       
            echo "猜大了,继续猜"    
       else      
            echo "猜小了,继续猜" 
  fi
done

九九乘法表

#!/bin/bash
for i in `seq 9`
do 
 for j in `seq $i`
 do 
 echo -n "$j*$i=$[i*j] "
 done
    echo
done

打印国际棋盘

#!/bin/bash
# 打印国际象棋棋盘
# 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
# i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
# i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
# 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
# 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块
for i in {1..8}
do
   for j in {1..8}
   do
    sum=$[i+j]
  if [  $[sum%2] -eq 0 ];then
    echo -ne "\033[46m  \033[0m"
  else
   echo -ne "\033[47m  \033[0m"
  fi
   done
   echo
done

速查表定时任务

[root@hcss-ecs-7aee ~]# more SuChaBiao.sh 
#!/bin/bash
#速查表定时获取最新版本脚本
#查找容器
rongqiid=$(docker ps | awk 'NR!=1{print }' | awk '{print $1}')
#停止容器
docker stop "$rongqiid"
#查看所有容器
rongqiids=$(docker ps -qa)
docker rm "$rongqiids"
#查找镜像删除
JiangXiangId=$(docker images | awk 'NR!=1{print }' | awk '{print $3}')
docker rmi -f "$JiangXiangId"
#下载镜像并启动容器
docker pull wcjiang/reference
docker run --name reference --rm -d -p 9667:3000 wcjiang/reference:latest

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容