2022年5月

嵌入式、物联网技术交流分享

Linux 邮件

mail mail 是 mailx 的软连接,它相当于邮箱客户端(例如 foxmail 客户端),可以单独使用通过 smtp 发送邮件或查看邮箱(/var/spool/mail/[用户名])中的邮件。单独使用 mail 发邮件需要配置 smtp: /etc/mail.rc set from=xxx@163.com set smtp=smtp.163.com set smtp-auth-user=xxx@163.com set smtp-auth-password=*** set smtp-auth=login 发邮件测试: echo "test" |mail -v -s "subjuct" xxx@qq.com -v:显示发送过程 公司使用的是阿里的企业邮箱,感觉不稳定(可能是被某种策略过滤),有时候发送会出错: SMTP: Connection reset by peer Unexpected EOF on SMTP connection 换成 163 邮箱测试就很稳定。 查阅邮件:mail d* #删除所有邮件 d n #删除编号n的邮件 sendmail/postfix sendmail/postfix 则是邮件服务器程序,类似 163、qq 邮箱。 配置 postfix 使用代理 stmp 发送邮件: vim /etc/postfix/main.cf # Enable auth smtp_sasl_auth_enable = yes # Set username and password smtp_sasl_password_maps = static:gitlab@example.com:passwordstring smtp_sasl_security_options = noanonymous smtp_tls_security_level = encrypt smtp_tls_wrappermode = yes relayhost = [smtp.qiye.aliyun.com]:465 systemctl restart postfix 这样 cron 就可以通过 postfix 发送邮件了。没有 postfix 时 cron 不会通过 mail.rc 配置的 stmp 发送邮件的。 在已经配好 postfix 时可以不用通过配 mail.rc 来使用 mailx 发信了测试命令如下: echo "test" |mailx -v -s "subjuct" -r "gitlab@example.com(Gitlab)" xxx@qq.com 需要注意的是必须包括发件人(用 -r 定义的(可以只写邮箱 -r gitlab@example.com),且必须与 smtp 代理的账户是一致的(通常邮件服务器都是这样要求的)),否则会提示错误: 440 mail from account doesn't conform with authentication (Auth Account:gitlab@example.com|Mail Account:root@gitserver.localdomain) (in reply to MAIL FROM command) 怀疑 cron 不是使用 mailx 发邮件的,而是直接通过 sendmail/postfix 来发的。 crontab 的配置开头除了 MAILTO="xxx@qq.com" 还要有 MAILFROM="gitlab@example.com",否则邮件不能被正常发送。 vim /var/spool/cron/root MAILTO="xxx@qq.com" MAILFROM="gitlab@example.com" */10 * * * * /root/script/backup-svn-authz.sh 0 2 * * * /root/script/backup-svn-gitlab.sh 0 6 1 * * /root/script/backup-svn-monthly.sh postfix 小于 3.0 的版本不支持 465 加密端口,需要注意。 CentOS 7 安装 postfix 3 查看版本: postconf -d | grep mail_version mail_version = 2.10.1 milter_macro_v = $mail_name $mail_version 或 rpm -qa | grep postfix postfix-2.10.1-9.el7.x86_64 删除 postfix 2: yum remove postfix 添加 postfix 3 源: vim /etc/yum.repos.d/gf.repo [gf] name=Ghettoforge packages that won't overwrite core distro packages. mirrorlist=http://mirrorlist.ghettoforge.org/el/7/gf/$basearch/mirrorlist enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-gf.el7 failovermethod=priority [gf-plus] name=Ghettoforge packages that will overwrite core distro packages. mirrorlist=http://mirrorlist.ghettoforge.org/el/7/plus/$basearch/mirrorlist # Please read http://ghettoforge.org/index.php/Usage *before* enabling this repository! enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-gf.el7 failovermethod=priority 安装 postfix 3: yum install postfix3 重新配置后就可以启动...

Ubuntu 20.04 的 Cron 不支持 MAILFROM

Ubuntu 20.04 的 Cron 竟然不支持 MAILFROM,而且查了一下,之前的版本据说也不支持,有人说 22.04 开始支持了。好吧,但是我的 R740 服务器不能正常安装这个月才刚发布的 22.04,真是尴尬呀。cron 直接使用系统账户作为发件人 root@gitlab,直接被邮件服务器退信了,不能发邮件。 gitlab@example.com: host smtp.qiye.aliyun.com[59.82.14.215] said: 500 Error: bad syntax (in reply to MAIL FROM command) 当然如果每个任务通过重定向到 mail 客户端也可以发信,不过不能像在 CentOS 中那样在开头指定收发信人了。搜索了一番,可以安装 cronie,它是 CentOS 等发行版系统选择的 cron 实现程序。 卸载掉 cron,安装 cronie cronie 下载地址:https://github.com/cronie-crond/cronie/releases 下载后编译: ./configure --prefix= #注意为空 make make install 安装服务: vim /usr/lib/systemd/system/crond.service [Unit] Description=Command Scheduler After=auditd.service systemd-user-sessions.service time-sync.target [Service] EnvironmentFile=/etc/crond.sysconfig ExecStart=/usr/sbin/crond -n $CRONDARGS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=30s [Install] WantedBy=multi-user.target 从程序根目录拷贝 crond.sysconfig 到 /etc systemctl enable crond.service systemctl start crond OK,又可以像在 CentOS 中那样用 cron 的 MAILFROM 了。 后记: 发现与 at 的目录结构有冲突(都混在 /var/spool/cron/ 中,而 Ubuntu 自带的 cron 文件夹是在 /var/spool/cron/crontabs/),所以还是换成了系统原装的 cron。 暂时就不用 crontab 自带的发信功能了,改用 ssmtp: 删除 postfix apt install ssmtp ssmtp 也提供了 sendmail 供 cron 使用。 配置: vim /etc/ssmtp/ssmtp.conf mailhub=smtp.qiye.aliyun.com:465 AuthUser=gitlab@example.com AuthPass=xxx AuthMethod=LOGIN UseTLS=YES FromLineOverride=NO #Debug=YES vim /etc/ssmtp/revaliases root:gitlab@example.com:smtp.qiye.aliyun.com:46...

Linux 访问 bitlocker 加密分区

安装 dislocker: apt install dislocker 创建两个挂载点: mkdir /mnt/{bitlocker,disk} fdisk -l 查看分区,确定设备文件 /dev/sdb1 解密: dislocker -V /dev/sdb1 -u -- /mnt/bitlocker 如果成功解密可以在挂载点 /mnt/bitlocker 看到加密分区的平面文件 dislocker-file 将其作为一个回环设备挂载: mount -o loop /mnt/bitlocker/dislocker-file /mnt/disk 用完后卸载: umount /mnt/disk umount /mnt/bitlocke...

Ubuntu 20.04 SWAP 分区扩容

系统安装后自动从镜像文件挂载的分区: /etc/fstab /swap.img none swap sw 0 0 swapon --show NAME TYPE SIZE USED PRIO /swap.img file 1.9G 0B -2 停止 SWAP 分区: swapoff /swap.img 调整大小: fallocate -l 16G /swap.img 或: dd if=/dev/zero of=/swap.img bs=1G count=16(蜗牛一样的速度) # fallocate 是预分配,所以速度比 dd 快的多得多。 chmod 600 /swap.img 格式化: mkswap /swap.img Setting up swapspace version 1, size = 16 GiB (17179865088 bytes) no label, UUID=f65b4da2-53cd-46a7-a782-aee321cd4329 # mkswap 可将磁盘分区或文件设为 Linux 的交换区 启用 SWAP 分区: swapon /swap.img swapon --show NAME TYPE SIZE USED PRIO /swap.img file 16G 0B -2 free -h total used free shared buff/cache available Mem: 31Gi 265Mi 23Gi 1.0Mi 7.6Gi 30Gi Swap: 15Gi 0B 15G...

Linux at 命令详解:一次性定时任务调度工具

at 命令是 Linux 系统中用于在指定时间点执行一次性任务的经典工具。与周期性任务调度器 cron 不同,at 任务执行一次后便会自动从队列中移除,适用于临时的、单次的自动化操作。 核心机制 at 命令的运行依赖于后台守护进程 atd。其工作流程如下: 用户通过 at 命令提交一个包含指令或脚本的任务及其执行时间。 atd 进程在后台运行,默认每 60 秒检查一次作业队列。 当系统时间与任务设定的时间匹配时,atd 会调用相应的 shell 来执行该任务。 使用前请务必确保 atd 服务已启动,可使用以下命令检查: systemctl status atd # 查看服务状态 # 或 ps -ef | grep atd # 检查进程是否存在 命令格式与常用选项 基本命令格式: at [选项] [时间] 任务内容可以在输入命令后,在随后的交互式提示中逐行输入,最后按 Ctrl + D 结束并提交。 常用选项速查表: 选项 功能描述 等效命令 -m 任务完成后,无论是否有输出,都向用户发送邮件通知。 -l 列出当前用户所有待执行的 at任务。 atq -d <编号> 删除指定编号的 at任务。 atrm <编号> -c <编号> 查看(cat)指定编号任务的具体命令内容。 -f <文件> 从指定的脚本文件中读取任务命令,而非标准输入。 -t <时间> 使用 [[CC]YY]MMDDhhmm[.ss]格式直接指定时间。 -v 显示任务的详细计划执行时间。 时间参数的指定方法 at 的强大之处在于其高度灵活的时间设定方式。 类别 格式示例 说明 标准时间 08:30 当天 8:30。若已过时,则顺延至次日。 模糊时间 midnight, noon, teatime 分别代表午夜 (00:00)、中午 (12:00)、下午茶 (通常 16:00)。 12小时制 11:00 PM, 9:30am 需明确标注 AM/PM 或 am/pm。 具体日期 11:00 2025-12-25 11:00 12/25/2025 在时间后加上日期。支持 YYYY-MM-DD、MM/DD/YY等格式。 相对计时 now + 2 hours now + 30 minutes now + 1 week 从当前时间算起。单位可为 minutes、hours、days、weeks。 自然日期 tomorrow 17:00 next Monday 使用自然语言指定。 实战应用案例 1、5 天后下午 5 点,列出 /home 目录内容 at 5pm +5 days # 进入交互输入模式 /bin/ls -la /home # 按 Ctrl + D 提交 2、查看当前排队中的任务 atq # 或 at -l 输出示例: 7 Sat Mar 15 17:00:00 2025 a username 3、明天下午 5 点,将当前时间写入日志文件 at 5pm tomorrow date >> /root/date.log # 按 Ctrl + D 提交 4、通过脚本文件提交复杂任务 首先创建脚本 myscript.sh,然后: at -f /path/to/myscript.sh 09:00 next Monday 5、删除已计划的任务 假设通过 atq 查得任务编号为 7: atrm 7 # 或 at -d 7 重要注意事项与技巧 权限管理:系统管理员可以通过 /etc/at.allow 和 /etc/at.deny 文件来控制允许或禁止使用 at 命令的用户。 环境变量:at 任务在执行时会继承当前用户的环境变量,包括当前的工作目录 (PWD)。 输出处理:任务的标准输出和错误默认会通过邮件发送给提交者。如果希望静默执行,可以在命令末尾重定向输出,例如:command > /dev/null 2>&1。 at 与 cron 的选择: 用 at:一次性的、临时的任务(如“2 小时后重启服务”、“明天早上下载文件”)。 用 cron:周期性的、固定频率的任务(如“每天凌晨备份”、“每周一清理日志”)。 总结 at 命令是 Linux 系统管理工具箱中一个轻巧而强大的“定时单次执行”工具。掌握其灵活的时间设定语法和任务管理选项(atq, atrm),可以高效地自动化处理各种临时性后台作...