Linux运维中处理Windows文件换行符不兼容问题,核心是用dos2unix/unix2dos精准转换:先用cat -A/file/hexdump识别CRLF,再按场景选择覆盖、备份或新文件输出,避免误操作二进制文件,并注意Git的core.autocrlf设置。

Linux 运维中处理 Windows 传来的脚本或配置文件时,最常见却容易被忽略的问题就是换行符不兼容——Windows 的 \r\n(CRLF)在 Linux 下会被解释为非法字符,导致脚本报错:/bin/bash^M: bad interpreter,或者 sed、awk 处理异常、git diff 显示大量空白行变更。解决核心是用 dos2unix 和 unix2dos 做精准、安全的格式转换。
确认问题:快速识别文件换行符类型
别猜,先看真实编码:
- 用
cat -A filename:若每行末尾显示^M$,说明是 Windows 格式(\r\n);只显示$则是标准 Linux 格式(\n) - 用
file filename:输出含CRLF line terminators即为 DOS/Windows 风格 - 用
hexdump -C filename | head -5:查找0d 0a(CR+LF)组合,出现即为 Windows 换行
dos2unix:把 Windows 文件转成 Linux 可执行格式
这是运维最常使用的命令,尤其用于修复 shell 脚本、Ansible Playbook、crontab 配置等。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
dos2unix script.sh:直接覆盖原文件,转为 Unix 格式(\n) -
dos2unix -b script.sh:带-b参数会自动备份为script.sh.bak,推荐生产环境使用 -
dos2unix -k -n old.sh new.sh:用-k保留原始时间戳,-n不改原文件,输出到新文件,适合审计或灰度验证 -
find /opt/app/conf -name "*.conf" -exec dos2unix {} \;:批量修复整个目录下的配置文件
unix2dos:反向转换,适配 Windows 端查看或交付
当需要把日志、导出报表、部署清单等发给 Windows 用户时,用它确保换行正常显示。
-
unix2dos deploy-list.txt:默认就地修改 -
unix2dos -n input.log output.log:生成新文件,避免污染源数据 -
unix2dos -k *.log:批量转换并保持原始修改时间,便于后续比对
避坑要点:这些细节决定是否真正解决问题
工具好用,但用错方式反而引入新问题:
- 不要对二进制文件(如
.zip、.so、.png)运行dos2unix,它可能损坏内容;可用--skip-bom或配合file命令预判 - 混合换行符文件(部分行
\r\n,部分行\n)dos2unix能自动识别并统一处理,而sed 's/\r$//'可能漏掉中间的\r或误删内容 - Git 用户注意:
core.autocrlf设置会影响检出行为。建议服务端统一设为input(提交时转\n,检出不转换),避免依赖人工转换 - 如果系统没装
dos2unix,Ubuntu/Debian 执行sudo apt install dos2unix,CentOS/RHEL 用sudo yum install dos2unix或dnf install dos2unix










