Shell脚本执行报错“No such file or directory”及dzdo用途咨询
一、dzdo的用途
dzdo是Centrify推出的权限管理工具,功能和sudo类似,允许普通用户以指定用户(通常是root)身份执行命令。它主打企业级集中化权限管控,整合身份认证与授权流程,比sudo更侧重统一权限管理场景。
二、"No such file or directory"报错的排查与解决
错误提示显示找不到文件,但实际可能是以下几种原因,逐一排查:
1. 脚本缺少可执行权限
你本地执行前可能已给脚本添加了执行权限,但客户操作时遗漏了这一步。让客户先检查权限:
ls -l MemoryUsage.sh
如果输出中没有x权限位,执行以下命令添加权限:
chmod +x MemoryUsage.sh
之后再用dzdo执行脚本。
2. 相对路径导致的工作目录问题
./MemoryUsage.sh是相对路径,dzdo执行时的工作目录可能和客户当前所在目录不一致。解决办法是使用绝对路径执行脚本,比如:
dzdo /home/user/scripts/MemoryUsage.sh
可以先用pwd命令确认脚本所在的绝对目录,再拼接脚本名称。
3. Shebang解释器路径不匹配
脚本开头的#!/bin/bash假设bash位于/bin目录,但部分Linux发行版或Unix系统中,bash的路径是/usr/bin/bash,这会导致系统找不到解释器,进而抛出“找不到文件”的错误。
修改脚本开头为通用兼容写法:
#!/usr/bin/env bash
这种写法会自动在系统PATH中查找bash的位置,适配更多环境。
4. 安全模块限制
如果客户系统开启了SELinux或AppArmor,可能会阻止dzdo执行该脚本。可以临时关闭SELinux测试:
dzdo setenforce 0
执行脚本后再恢复SELinux状态:
dzdo setenforce 1
如果临时关闭后能正常执行,需要给脚本添加对应的SELinux上下文规则,比如:
dzdo chcon -t bin_t MemoryUsage.sh
补充说明
你的脚本需要读取/proc/[0-9]*/status文件,普通用户对部分进程的status文件可能没有读取权限,因此客户需要用dzdo获取root权限执行;而你本地可能本身是root用户或已有足够权限,所以无需dzdo即可运行。
内容的提问来源于stack exchange,提问作者Suyog

