基础命令
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¶m2=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 可以执行以下操作:
- 查询域名对应的IP地址:输入域名后,nslookup 会返回该域名的IPv4和/或IPv6地址。
- 查询IP地址对应的域名:输入IP地址后,nslookup 会尝试查找与之相关联的域名。
- 指定DNS服务器进行查询:用户可以选择特定的DNS服务器来进行查询,以获取不同服务器的解析结果。
- 查看不同类型的DNS记录:例如A记录、MX记录、CNAME记录等,以了解域名指向的具体信息。
- 诊断DNS问题:当网络连接出现问题时,使用nslookup 可以帮助确定问题是出在本地计算机还是DNS服务器上。
nslookup 支持交互模式和非交互模式两种使用方式:
- 非交互模式:直接在命令行中输入完整的命令和参数,如
nslookup www.example.com
,然后得到查询结果。 - 交互模式:先运行
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 > 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 是端口号
第四列:箭头 >, 表示数据流向
第五列:接收方的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<数据包数目>:收到指定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<表达文件>:指定内含表达方式的文件;
适合表达式长期维护
more fileter_rule
tcp port 80
tcpdump -F filter_rule
-i<网络界面>:使用指定的网络截面送出数据包;默认是第一块网卡
-l:使用标准输出列的缓冲区,在实时查看时,同时可以保存到文件
tcpdump -l | tee dat
tcpdump -l > dat & 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<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小;
默认是262144bytes
tcpdump -s 50 超出50字节就会被截断
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间;
-tt:在每列倾倒资料上显示未经格式化的时间戳记;
-ttt:输出每两行打印的时间间隔
-tttt:在每行的时间戳之前添加打印日期,此种方式输出的时间最直观
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-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<=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<=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 donefor菜单创建
#!/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<${#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 > /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo -e "\033[32;1m$Network.$Host is up \033[0m"
echo "$Network.$Host" >> /tmp/up.txt
else
echo -e "\033[;31m$Network.$Host is down \033[0m"
echo "$Network.$Host" >> /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
暂无评论内容