最近总是不想动,服务器的安全又不得不考虑,有时候还会忘记修改服务器的端口和密码,就诞生了下面的Shell脚本。

最近总是不想动,服务器的安全又不得不考虑,有时候还会忘记修改服务器的端口和密码,就诞生了下面的Shell脚本。

脚本包含了日志记录,备份SSH文件,修改SSH端口,修改SSH密码,更新防火墙、发送加密邮件,设置定时任务。

脚本目前只在Ubuntu系统测试,其它系统未测试,以下标红的信息一定要看。

注意:在使用脚本之前一定要先进行测试,尤其是发送邮件和接收邮件是否正常,否则会很麻烦。

1、安装依赖库

sudo apt-get update
sudo apt-get install -y ssmtp openssl
  • 1.
  • 2.

2、配置ssmtp

sudo vi /etc/ssmtp/ssmtp.conf
  • 1.

这里的信息都需要修改为你自己的。

root=postmaster
mailhub=smtp.your-email-provider.com:587
AuthUser=your-email@example.com
AuthPass=your-email-password
UseSTARTTLS=YES
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

3、Shell脚本,

#!/bin/bash

# 配置
EMAIL="your-email@example.com"
MIN_PORT=1024
MAX_PORT=65535
MIN_PASS_LENGTH=8
MAX_PASS_LENGTH=16
LOG_FILE="/var/log/auto_update_ssh_password.log"
BACKUP_DIR="/etc/ssh/backup"
SERVER_NAME=$(hostname) # 获取服务器名称

# 创建备份目录
mkdir -p $BACKUP_DIR

# 生成随机端口号
NEW_PORT=$(shuf -i $MIN_PORT-$MAX_PORT -n 1)

# 生成随机密码
PASSWORD_LENGTH=$(shuf -i $MIN_PASS_LENGTH-$MAX_PASS_LENGTH -n 1)
NEW_PASSWORD=$(openssl rand -base64 $PASSWORD_LENGTH | tr -dc 'a-zA-Z0-9' | head -c $PASSWORD_LENGTH)

# 获取当前SSH端口
CURRENT_PORT=$(grep "^Port " /etc/ssh/sshd_config | awk '{print \$2}')

# 备份SSH配置文件
sudo cp /etc/ssh/sshd_config $BACKUP_DIR/sshd_config_$(date +%F_%T)

# 修改SSH端口
if [ -z "$CURRENT_PORT" ]; then
  # 如果没有找到Port配置,添加新的端口配置
  echo "Port $NEW_PORT" | sudo tee -a /etc/ssh/sshd_config
else
  # 替换现有的端口配置
  sudo sed -i "s/^Port $CURRENT_PORT/Port $NEW_PORT/" /etc/ssh/sshd_config
fi

# 检测并更新防火墙规则
if command -v ufw > /dev/null; then
  # 使用ufw
  sudo ufw allow $NEW_PORT/tcp
  if [ ! -z "$CURRENT_PORT" ]; then
    sudo ufw delete allow $CURRENT_PORT/tcp
  fi
elif command -v iptables > /dev/null; then
  # 使用iptables
  sudo iptables -A INPUT -p tcp --dport $NEW_PORT -j ACCEPT
  if [ ! -z "$CURRENT_PORT" ]; then
    sudo iptables -D INPUT -p tcp --dport $CURRENT_PORT -j ACCEPT
  fi
else
  echo "未检测到受支持的防火墙工具 (ufw 或 iptables)。请手动更新防火墙规则。" | tee -a $LOG_FILE
  exit 1
fi

# 重启SSH服务
sudo systemctl restart sshd

# 修改用户密码
echo "root:$NEW_PASSWORD" | sudo chpasswd

# 记录日志
echo -e "$(date +%F_%T) - SSH端口已更改为: $NEW_PORT\n新密码为: $NEW_PASSWORD\n" | sudo tee -a $LOG_FILE

# 发送加密邮件
EMAIL_SUBJECT="SSH端口和密码更新 - $SERVER_NAME"
EMAIL_BODY="SSH端口已更改为: $NEW_PORT\n新密码为: $NEW_PASSWORD"
echo -e "$EMAIL_BODY" | gpg --encrypt --recipient $EMAIL | ssmtp -s "$EMAIL_SUBJECT" $EMAIL

# 设置定时任务
CRON_JOB="0 0 */7-15 * * /path/to/update_ssh_password.sh"
(crontab -l 2>/dev/null; echo "$CRON_JOB") | crontab -
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.

脚本中的your-email@example.com记得修改,/path/to/update_ssh_password.sh路径需要修改为脚本的实际地址,否则无法添加定时任务,

4、赋予脚本可执行权限

chmod +x update_ssh_password.sh
  • 1.

作者:Alone°李道长ご