目录
1.首先,来到这个路径下/etc/systemd/system
前言
Linux开机获得本机ip地址,发送给指定邮箱。一般是为了在一些不方便且没有显示屏连接,采用ssh连接的情况。刚刚好,我也遇到了这种问题,所以这篇文章来了。我们需要干什么去实现它呢?我来告诉你!
下面是本文使用的材料:
- 一块或者一台linux系统的板子或者电脑
- 一个发送邮件的账号(这里我选择的网易邮箱,要开启SMPT)
- 一个接收邮件的邮箱(这里我选择的qq邮箱)
- 我提供的shell脚本
开启接收邮件邮箱的SMPT
网易邮箱的SMPT很容易开,进去设置一些就好了。也就一开始接一下手机验证码。
来到网易邮箱,然后注册或者登陆。163网易免费邮-你的专业电子邮局
开启的过程,你会得到一个授权码。这个授权码只会显示一次,你务必记住或者忘记,你下次重开算了。
反手贴出代码
你唯一需要改的地方就是下面三个地方。
#!/bin/bash
# File: automail.sh
###############################
########### 配置区 ############
###############################
SMTP_HOST="smtp.163.com"
SMTP_PORT="465"
SENDER_EMAIL="你的发送邮箱@163.com"
SENDER_PASSWORD="发送邮箱的授权码"
RECIPIENT_EMAIL="接收邮箱@qq.com"
IPV4_API=("http://ip.3322.net" "http://4.ipw.cn")
IPV6_API=("http://6.ipw.cn" "http://v6.ip.zxinc.org")
CURL_TIMEOUT=3
NETWORK_RETRY=5
###############################
####### 系统初始化模块 ##########
###############################
init_system() {
echo "[系统初始化] 正在配置环境..."
# 时间同步
if ! sudo ntpdate -u ntp.aliyun.com 2>/dev/null; then
command -v apt &>/dev/null && sudo apt install -y ntpdate
command -v yum &>/dev/null && sudo yum install -y ntpdate
sudo ntpdate -u ntp.aliyun.com
fi
# 安装依赖
local deps=("curl" "msmtp" "msmtp-mta" "mailutils" "mutt" "gnutls" "gnutls-utils" "libidn" "libidn-devel" "ncurses-devel" "gcc" "gcc-c++")
for dep in "${deps[@]}"; do
if ! command -v "$dep" &>/dev/null; then
command -v apt &>/dev/null && sudo apt install -y "$dep"
command -v yum &>/dev/null && sudo yum install -y "$dep"
fi
done
# 生成MSMTP配置
cat > ~/.msmtprc << EOF
defaults
auth on
tls on
logfile ~/.msmtp.log
account auto_config
host ${SMTP_HOST}
port ${SMTP_PORT}
from ${SENDER_EMAIL}
user ${SENDER_EMAIL}
password ${SENDER_PASSWORD}
tls_starttls off
account default : auto_config
EOF
chmod 600 ~/.msmtprc
}
###############################
####### 网络检测模块 ###########
###############################
get_network_info() {
# 连接类型
local conn_type="有线连接 (Wired)"
local ssid=$(iwgetid -r 2>/dev/null)
[ -n "$ssid" ] && conn_type="WiFi (${ssid})"
# IPv4检测
local ipv4_internal=$(ip -4 -o addr show scope global | awk '{print $4}' | cut -d/ -f1 | head -1)
local ipv4_external=$(curl -4 -s --connect-timeout $CURL_TIMEOUT ${IPV4_API[0]})
# IPv6检测
local ipv6_info=""
if ip -6 addr show scope global &>/dev/null; then
local ipv6_internal=$(ip -6 addr show scope global | awk '/inet6/{print $2}' | cut -d/ -f1 | head -1)
local ipv6_external=$(curl -6 -s --connect-timeout $CURL_TIMEOUT ${IPV6_API[0]})
ipv6_info="内网IPv6: ${ipv6_internal:-未检测到}\n外网IPv6: ${ipv6_external:-未检测到}"
else
ipv6_info="IPv6状态: 未启用"
fi
# 组装信息
echo -e "=== 网络检测开始 ==="
echo -e "连接类型: ${conn_type}"
echo -e "内网IPv4: ${ipv4_internal:-未检测到}"
echo -e "外网IPv4: ${ipv4_external:-未检测到}"
echo -e "${ipv6_info}"
echo -e "=== 网络检测结束 ==="
}
wait_network() {
echo "等待网络连接..."
for ((i=1; i<=$NETWORK_RETRY; i++)); do
ping -c1 -W2 223.5.5.5 &>/dev/null && return 0
sleep 2
done
echo "警告:网络连接超时"
return 0
}
###############################
######## 邮件发送模块 ##########
###############################
send_mail() {
# 获取网络信息
local ipv4_internal=$(ip -4 -o addr show scope global | awk '{print $4}' | cut -d/ -f1 | head -1)
local ipv4_external=$(curl -4 -s --connect-timeout $CURL_TIMEOUT ${IPV4_API[0]})
# IPv6检测
local ipv6_internal=$(ip -6 addr show scope global 2>/dev/null | awk '/inet6/{print $2}' | cut -d/ -f1 | head -1)
local ipv6_external=$(curl -6 -s --connect-timeout $CURL_TIMEOUT ${IPV6_API[0]} 2>/dev/null)
# 连接类型处理
local ssid=$(iwgetid -r 2>/dev/null)
if [ -n "$ssid" ]; then
en_conn_type="WiFi (${ssid})"
zh_conn_type="WiFi (${ssid})"
else
en_conn_type="Wired"
zh_conn_type="有线连接"
fi
# 构建邮件内容
local en_content="System Boot Notification\n$(date +"%Y-%m-%d %H:%M:%S %Z")\nHostname: $(hostname)\nConnection Type: ${en_conn_type}\nInternal IPv4: ${ipv4_internal:-Not detected}\nExternal IPv4: ${ipv4_external:-Not detected}\nInternal IPv6: ${ipv6_internal:-Not detected}\nExternal IPv6: ${ipv6_external:-Not detected}"
local zh_content="系统启动通知\n$(date +"%Y-%m-%d %H:%M:%S %Z")\n主机名称: $(hostname)\n连接类型: ${zh_conn_type}\n内网IPv4: ${ipv4_internal:-未检测到}\n外网IPv4: ${ipv4_external:-未检测到}\n内网IPv6: ${ipv6_internal:-未检测到}\n外网IPv6: ${ipv6_external:-未检测到}"
local full_content="To: ${RECIPIENT_EMAIL}\nSubject: 【$(hostname) Boot Alert】系统启动通知\n\n${en_content}\n\n----------------\n\n${zh_content}"
echo -e "=== 正在发送邮件 ==="
echo -e "$full_content" | msmtp --from="${SENDER_EMAIL}" "${RECIPIENT_EMAIL}"
echo -e "=== 发送邮件成功 ==="
}
###############################
######## 主执行流程 ###########
###############################
[ -f ~/.msmtprc ] || init_system
wait_network
get_network_info
send_mail
设置开机自启动
这个脚本的作用就是发邮件,邮件内容就是运行机器联网时的ipv4地址,内网地址与外网地址都会发送。运行一次,发一次。但是我们要实现的是开机自动发邮件,所以我们要设置开机只后,自动执行一次这个脚本。
我假设你把shell脚本的名字设置为automail.sh.下面操作我都会以这个标准命名。
我们要设置开机自动运行这个脚本,这样就可以做到开机自动发送邮件的作用。
1.首先,来到这个路径下/etc/systemd/system
cd /etc/systemd/system/
2.然后创建一个任务automail.service
vim automail.service
或者直接
sudo nano /etc/systemd/system/automail.service
sudo vim /etc/systemd/system/automail.service
3.任务内容,即automail.service文件的内容
[Unit]
Description=Automail Service - Send network info on boot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=orangepi
ExecStart=/home/orangepi/automail/automail.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
注意
这里的ExecStart里面的内容是你脚本文件放在linux系统中的绝对路径。比如,这里我就是把文件放在/home/orangepi/automail/automail.sh
还有User这里的内容是linux的真实用户名,比如我这里就是orangepi。你要是喜欢,你也可以填root。
你需要根据你的情况进行修改,对了。你最好自己给文件加上可执行权限,不然可能会设置失败。
chmod +x /home/orangepi/automail.sh
4.设置开机自启
重新加载服务配置
sudo systemctl daemon-reload
启动服务
sudo systemctl start automail.service
启动开机自启
sudo systemctl enable automail.service
重启服务
sudo systemctl restart automail.service
关闭服务
sudo systemctl stop automail.service
检测服务状态
sudo systemctl status automail.service
如果提示如下,则设置成功!
查看日志
下面都可以查看
sudo journalctl -u automail.service -b
sudo journalctl -u automail.service -b --no-pager
sudo journalctl -u automail.service -f
cat ~/.msmtp.log
tail -f ~/.msmtp.log
查看配置
cat ~/.msmtprc
注意
这里脚本其实利用了下面的环境才实现的,不过脚本会在一开始去检测机器有没有安装这些环境。如果没有则去安装,如果有就跳过安装!
sudo apt update
sudo apt install msmtp mailutils msmtp-mta curl
好了!愉快的去部署吧!