380 lines
11 KiB
Markdown
380 lines
11 KiB
Markdown
<h1><center>shell脚本案例</center></h1>
|
||
|
||
|
||
|
||
------
|
||
|
||
## 一:脚本案例
|
||
|
||
#### 1.配置静态IP案例
|
||
|
||
```shell
|
||
#!/bin/bash
|
||
# This script configures a static IP address on CentOS 7
|
||
|
||
# Define variables for the IP address, netmask, gateway, and DNS servers
|
||
IP_ADDRESS=192.168.1.100
|
||
NETMASK=255.255.255.0
|
||
GATEWAY=192.168.1.1
|
||
DNS_SERVERS="8.8.8.8 114.114.114.114"
|
||
|
||
# Backup the original network configuration file
|
||
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
|
||
|
||
# Modify the network configuration file with the static IP address, netmask, gateway, and DNS servers
|
||
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens33
|
||
TYPE=Ethernet
|
||
BOOTPROTO=none
|
||
NAME=ens33
|
||
DEVICE=ens33
|
||
ONBOOT=yes
|
||
IPADDR=$IP_ADDRESS
|
||
NETMASK=$NETMASK
|
||
GATEWAY=$GATEWAY
|
||
DNS1=${DNS_SERVERS%% *}
|
||
DNS2=${DNS_SERVERS##* }
|
||
EOF
|
||
|
||
# Restart the network service to apply the changes
|
||
systemctl restart network
|
||
|
||
# Display the new network configuration
|
||
ip addr show ens33
|
||
```
|
||
|
||
centos stream 9
|
||
|
||
```shell
|
||
[root@xingdiancloud ~]# bash network.sh
|
||
#!/bin/bash
|
||
#auther:xingdian
|
||
NET_DIR=`ls /etc/NetworkManager/system-connections/`
|
||
NET_PATH="/etc/NetworkManager/system-connections/"
|
||
read -p "请输入IP地址: " ipadd
|
||
read -p "请输入子网掩码,例如24: " netmask
|
||
read -p "请输入默认网关: " gateway
|
||
read -p "请输入dns地址: " dns
|
||
read -p "输入设备名字: " name
|
||
# 备份原配置
|
||
if [ -f ${NET_PATH}${name}.nmconnection.bak ];then
|
||
rm -rf ${NET_PATH}${name}.nmconnection.bak
|
||
else
|
||
cp ${NET_PATH}${NET_DIR} ${NET_PATH}${NET_DIR}.bak
|
||
fi
|
||
cat > ${NET_PATH}${name}.nmconnection <<eof
|
||
[connection]
|
||
id=$name
|
||
uuid=639d6c39-a14a-36f9-b18f-7c1ff3c082d7
|
||
type=ethernet
|
||
autoconnect-priority=-999
|
||
interface-name=$name
|
||
timestamp=1681589526
|
||
|
||
[ethernet]
|
||
|
||
[ipv4]
|
||
method=manual
|
||
address1=$ipadd/$netmask,$gateway
|
||
dns=$dns
|
||
|
||
[ipv6]
|
||
addr-gen-mode=eui64
|
||
method=auto
|
||
|
||
[proxy]
|
||
eof
|
||
|
||
nmcli c reload
|
||
nmcli c up $name
|
||
|
||
#systemctl restart NetworkManager
|
||
```
|
||
|
||
#### 2.系统初始化脚本
|
||
|
||
```shell
|
||
#!/bin/bash
|
||
#centos7: 初始化脚本
|
||
#auther:xingdian
|
||
|
||
# 防火墙设置
|
||
|
||
echo "关闭防火墙和selinux中...."
|
||
|
||
echo
|
||
systemctl stop firewalld && systemctl disable firewalld &> /dev/null
|
||
|
||
if [ $? -eq 0 ];then
|
||
echo "防火墙已经成功关闭....."
|
||
else
|
||
echo "防火墙关闭失败,请手动关闭!!!"
|
||
fi
|
||
|
||
setenforce 0 && sed -i '/^SELINUX/c SELINUX=disabled' /etc/selinux/config
|
||
|
||
if [ $? -eq 0 ];then
|
||
echo "selinux已经成功关闭....."
|
||
else
|
||
echo "selnux关闭失败,请手动关闭!!!"
|
||
fi
|
||
echo
|
||
|
||
# 外网检测
|
||
echo "正在检测网络是否能上外网......"
|
||
|
||
echo
|
||
|
||
ping -c 2 www.baidu.com &> /dev/null
|
||
|
||
if [ $? -eq 0 ];then
|
||
echo "网络正常"
|
||
else
|
||
echo "网络不可达!"
|
||
fi
|
||
echo
|
||
|
||
# 配置yum源-这里选用阿里源
|
||
|
||
echo "配置yum源中....."
|
||
echo
|
||
yum install -y wget &> /dev/null
|
||
if [ $? -ne 0 ];then
|
||
echo "wget 安装失败........."
|
||
systemctl restart network
|
||
yum repolist &> /dev/null
|
||
sleep 2
|
||
fi
|
||
mkdir -p /root/YUM_backup
|
||
mv /etc/yum.repos.d/* /root/YUM_backup
|
||
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
|
||
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
|
||
yum clean all &>/dev/null && yum reppolist &>/dev/null
|
||
echo "你的yum源有:" $(ls /etc/yum.repos.d)
|
||
sleep 2
|
||
|
||
# 配置主机名和host文件
|
||
|
||
echo "正在配置你的主机名..."
|
||
|
||
echo
|
||
read -p "请输入你的主机名:" host
|
||
|
||
hostname(){
|
||
hostnamectl set-hostname $host
|
||
}
|
||
hostname host && echo -e "主机名设置成功!!"
|
||
|
||
echo "正在配置你的hosts文件..."
|
||
ip=$(ip a | grep ens33 |grep inet |awk '{print $2}' | awk -F"/" '{print $1}')
|
||
echo "$ip $host" >> /etc/hosts
|
||
echo "hosts配置完成!!!"
|
||
|
||
# 安装基础软件包
|
||
|
||
echo "安装基础软件包中....."
|
||
echo
|
||
|
||
yum install -y vim wget unzip yum_utils &>/dev/null
|
||
if [ $? -eq 0 ];then
|
||
echo "安装完成....."
|
||
else
|
||
echo "安装失败..... "
|
||
fi
|
||
# 时间同步
|
||
echo
|
||
echo "时间同步中……"
|
||
yum install -y ntpdate &> /dev/null
|
||
ntpdate cn.pool.ntp.org &> /dev/null
|
||
file=$(who | head -1 | cut -d" " -f1)
|
||
echo "* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org" > /var/spool/cron/$file
|
||
if [ $? -eq 0 ];then
|
||
echo "时间同步成功!!!"
|
||
echo "unset MAILCHECK" >> /etc/profile
|
||
source /etc/profile &> /dev/null
|
||
else
|
||
echo "时间同步失败!!!"
|
||
fi
|
||
```
|
||
|
||
#### 3.获取系统信息
|
||
|
||
```shell
|
||
#!/bin/bash
|
||
#此脚本获取系统centos7.x/centos stream9.x
|
||
#auther:xingdian
|
||
|
||
#查看服务器硬件型号
|
||
hard_type=`dmidecode |grep "Product Name"|tr "\n" " "` #获取服务器型号
|
||
sn=`dmidecode |grep -A 3 "Product Name" |grep "Serial Number"|grep -v "None"` #获取硬件序列码
|
||
|
||
##系统信息
|
||
version=`cat /etc/redhat-release` #版本
|
||
kernel=`uname -r` #内核
|
||
|
||
##cpu
|
||
phy_cpu_num=`grep 'physical id' /proc/cpuinfo | sort | uniq | wc -l` #物理CPU数量
|
||
nuclear=`grep vendor_id /proc/cpuinfo|wc -l` #逻辑核数(线程)
|
||
|
||
##内存\Swap
|
||
mem=`free -m|grep Mem|awk '{print $2"M"}'` #内存总大小
|
||
user_mem=`free -m|grep Mem|awk '{print $3"M"}'` #已用内存大小
|
||
swap=`free -m |grep Swap|awk '{print $2"M"}'` #swap总大小
|
||
user_swap=`free -m |grep Swap|awk '{print $3"M"}'` #已用swap大小
|
||
|
||
#最大支持内存数
|
||
max_memory=`dmidecode|grep -P 'Maximum\s+Capacity'`
|
||
|
||
##负载
|
||
loadavg=`uptime |awk -F: '{print $NF}'` #系统负载
|
||
|
||
##网络
|
||
network=`[[ $(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" www.baidu.com) -eq 200 ]] && echo yes || echo no` #根据curl www.baidu.com的返回状态码来判断是否能上网
|
||
ip_addr=`ip address|grep -w "inet"|grep -v "127.0.0.1"|awk -F "[ /]+" '{print $3,$NF}'` #获取除了回环地址之外的所有网卡的ip地址和对应的网卡名
|
||
##磁盘
|
||
disk_zong=`df -Th | grep -w '/' | awk '{print $3}'` #获取系统盘的总大小
|
||
disk_user=`df -Th | grep -w '/' | awk '{print $4}'` #获取系统盘已用大小
|
||
disk_lsbl=`lsblk` #硬盘分区分布
|
||
##其他
|
||
system_time=`awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime` #开机时长
|
||
sys_begin=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"` #开机时间
|
||
##日志
|
||
system_log=`du -sh /var/log/ |awk '{print $1}'` #系统日志大小
|
||
#进程
|
||
tasks=`top -n1 |grep Tasks |awk '{print $2,$4,6}'` #总 运行 休眠
|
||
|
||
system(){
|
||
echo "
|
||
|硬件型号:
|
||
$hard_type
|
||
|序列号:
|
||
$sn
|
||
|版本: $version
|
||
|内核: $kernel
|
||
|
||
|物理CPU个数:$phy_cpu_num 逻辑核数: $nuclear"个"
|
||
|负载:$loadavg
|
||
|
||
|内存: $mem #最大支持内存:$max_memory
|
||
|已用: $user_mem
|
||
|swap: $swap
|
||
|已用: $user_swap
|
||
|
||
|是否可以上网: $network
|
||
|本地IP地址:
|
||
$ip_addr
|
||
|
||
|系统磁盘大小: $disk_zong
|
||
|系统磁盘已用: $disk_user
|
||
|日志: 系统日志大小为$system_log
|
||
|开机: $sys_begin
|
||
|至今: $system_time
|
||
硬盘分区
|
||
----------------------------------------------------------------------
|
||
$disk_lsbl
|
||
----------------------------------------------------------------------
|
||
|
||
----------------------------------------------------------------------
|
||
"
|
||
}
|
||
system
|
||
##端口扫描
|
||
echo "监听的端口扫描
|
||
----------------------------------------------------------------------"
|
||
portarray=(`sudo netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
|
||
length=${#portarray[@]} #统计元素个数
|
||
printf "{\n"
|
||
printf '\t'port":"
|
||
for ((i=0;i<$length;i++))
|
||
do
|
||
printf '\n\t\t{'
|
||
printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
|
||
if [ $i -lt $[$length-1] ];then
|
||
printf ','
|
||
fi
|
||
done
|
||
printf "\n\t\n"
|
||
printf "}\n"
|
||
echo "----------------------------------------------------------------------
|
||
"
|
||
```
|
||
|
||
#### 4.sshpass登录远程服务器与验证
|
||
|
||
```shell
|
||
sshpass安装后,可以在控制台输入sshpass命令查看所有选项参数:
|
||
|
||
$ sshpass
|
||
|
||
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
|
||
|
||
-f filename Take password to use from file
|
||
|
||
-d number Use number as file descriptor for getting password
|
||
|
||
-p password Provide password as argument (security unwise)
|
||
|
||
-e Password is passed as env-var "SSHPASS"
|
||
|
||
With no parameters - password will be taken from stdin
|
||
|
||
-P prompt Which string should sshpass search for to detect a password prompt
|
||
|
||
-v Be verbose about what you're doing
|
||
-h Show help (this screen)
|
||
-V Print version information
|
||
At most one of -f, -d, -p or -e should be used
|
||
如上所示,command parameters为你要执行的需要交互式输入密码的命令,如:ssh、scp等。当sshpass没有指定参数时会从stdin获取密码,几个密码输入相关参数如下:
|
||
-f filename:从文件中获取密码
|
||
-d number:使用数字作为获取密码的文件描述符
|
||
-p password:指定明文本密码输入(安全性较差)
|
||
-e:从环境变量SSHPASS获取密码
|
||
|
||
远程连接指定ssh的端口:
|
||
[root@linuxcool ~]# sshpass -p "password" ssh username@ip
|
||
本地执行远程机器的命令:
|
||
[root@linuxcool ~]# sshpass -p "password" ssh -p 8443 username@ip
|
||
从密码文件读取文件内容作为密码去远程连接主机:
|
||
[root@linuxcool ~]# sshpass -p xxx ssh root@192.168.11.11 "ethtool eth0"
|
||
从远程主机上拉取文件到本地:
|
||
[root@linuxcool ~]# sshpass -p '123456' scp root@host_ip:/home/test/t ./tmp/
|
||
```
|
||
|
||
#### 5.免密脚本
|
||
|
||
```shell
|
||
yum -y install expect
|
||
#生成并拷贝ssh_key到远程机器
|
||
rm -rf /root/.ssh/*
|
||
/usr/bin/expect <<EOF
|
||
set timeout 30
|
||
spawn ssh-keygen
|
||
expect "Enter file in which to save the key (/root/.ssh/id_rsa):"
|
||
send "\n"
|
||
expect "Enter passphrase (empty for no passphrase):"
|
||
send "\n"
|
||
expect "Enter same passphrase again:"
|
||
send "\n"
|
||
spawn ssh-copy-id 172.16.70.251
|
||
expect {
|
||
"yes/no" { send "yes\n"; exp_continue }
|
||
"root@172.16.70.251's password:" { send "uplooking\n"}
|
||
}
|
||
expect eof
|
||
EOF
|
||
ssh-add #将私钥身份添加到 OpenSSH 身份验证代理,从而提高ssh的认证速度
|
||
==========================================
|
||
/usr/bin/expect <<eof
|
||
spawn:生成 spawn ssh 10.18.44.196
|
||
expect:捕获 expect "password"
|
||
send:发送 send "1\n"
|
||
expect eof
|
||
eof
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|