远程通过eval运行DELETEENTRY变量中的sed命令失败,如何解决?
解决远程执行sed删除crontab条目时的eval引号问题
问题描述
我编写了一个bash脚本,用于删除crontab中的指定条目,希望在远程服务器上执行该命令并检查执行结果。尝试的脚本如下:
DELETEENTRY='sed -i ""/# Restarts HP OMO Agent Weekly/d"" /var/spool/cron/root && echo "ok" || echo "error"' DELETERESULT=$(ssh -q $HOST-- eval $DELETEENTRY) if [ "$DELETERESULT" = "ok" ] then ........... fi
单独运行该sed命令时一切正常,但使用eval执行时,遇到以下错误:
sed: -e expression #1, char 2: unterminated address regex
尝试了多种方式为/# Restarts HP OMO Agent Weekly/d字符串添加引号,始终出现相同错误。
问题:如何使用eval成功运行DELETEENTRY变量?
解决方法
方案1:抛弃eval,直接通过ssh传递命令(推荐)
根本问题在于你定义DELETEENTRY时使用了多余的空引号,且ssh本身支持直接传递命令字符串,完全不需要借助eval,这样能避免绝大多数引号解析问题。
修改后的代码:
# 正确定义命令字符串,去掉多余的空引号 DELETEENTRY='sed -i "/# Restarts HP OMO Agent Weekly/d" /var/spool/cron/root && echo "ok" || echo "error"' # 直接把命令字符串传给ssh,无需eval DELETERESULT=$(ssh -q "$HOST" "$DELETEENTRY") if [ "$DELETERESULT" = "ok" ] then # 此处编写执行成功后的逻辑 echo "crontab条目删除成功" fi
方案2:必须使用eval时的写法(不推荐)
如果因特殊需求必须保留eval,需要确保远程服务器能正确解析命令字符串,核心是用嵌套单引号的方式转义:
# 用'\''实现单引号的嵌套转义,确保eval能正确识别完整命令 DELETEENTRY='eval '\''sed -i "/# Restarts HP OMO Agent Weekly/d" /var/spool/cron/root && echo "ok" || echo "error"'\''' DELETERESULT=$(ssh -q "$HOST" "$DELETEENTRY") if [ "$DELETERESULT" = "ok" ] then # 执行成功逻辑 echo "删除成功" fi
额外提示
- 直接编辑
/var/spool/cron/root文件并非操作crontab的官方推荐方式,更安全的做法是使用crontab -l | sed '...' | crontab -的管道方式修改,能避免权限或同步问题。 - 远程执行命令时,尽量避免使用
eval,它会增加命令解析的复杂度,容易引入意外的语法错误。
内容的提问来源于stack exchange,提问作者Buffalosoldier
相关产品推荐
相关产品推荐

