遇到了个自己难以解决的问题:需要替换 bash 脚本 A 中的 echo 命令,达到修改脚本 echo 输出的内容的目的。 尝试编写一个 echo ( bash 脚本)替换了 /bin/echo,但实际过程中发现,脚本 A 执行的 echo 未受影响。经过排查,原来 echo 是 bash 的 builtin 命令,优先级比外部命令高,但使用 enable -n 禁用 echo 后,脚本 A 执行的 echo 仍未受影响;使用 alias 进行别名替换不起作用,原因 alias 在非交互环境中不起作用。现在没有其他思路了。 背景:不能修改脚本 A 的内容,脚本 A 内有一行"source /etc/profile"
1
redr41n OP 有没有大佬有思路
|
2
seers 2023-02-24 23:49:38 +08:00 via Android
绝对路径 echo 试试
|
3
Syiize 2023-02-24 23:49:55 +08:00 via Android
不知道你这个修改输出是修改什么,感觉可以通过自定义一个子函数,在子函数内操作并打印。
|
4
ysc3839 2023-02-24 23:56:16 +08:00 via Android
怀疑是 X-Y Problem https://coolshell.cn/articles/10804.html
建议说原始需求 |
5
adrianzhang 2023-02-24 23:58:42 +08:00
按我的理解,内置命令的优先级是最高的,在 bash 开始工作的时候,已经将相关的命令载入内存。所以只要 bash 启用了,在 bash 里折腾各种东西都是无效的。
能够解决你问题的方法,我觉得只有自己编译一个 bash 了。 |
6
leonshaw 2023-02-24 23:59:50 +08:00
\echo
|
7
redr41n OP 原始需求就是要 hook 这个脚本的执行,不能修改脚本 A 的内容
|
8
redr41n OP @adrianzhang 有想过重新编译一个 bash ,但是看看有没有更简单的方法
|
9
redr41n OP @ysc3839 提问像 x-y 问题,是因为原始需求不好说哈哈。其实是一个考试系统,他远程检查本地的文件改动,最后通过 echo 返回结果,所以想修改他的 echo 内容,但是检测的脚本是每次重新生成的,所以无法修改脚本。
|
12
adoyle 2023-02-25 00:31:17 +08:00 1
既然脚本 A 引用了 /etc/profile ,那就在 /etc/profile 加一段代码。
``` if [ -n $0 ] && [ "$(realpath $0)" == "脚本 A 的绝对路径" ]; then echo() { command echo "$@" | tee -a log; } fi ``` 不影响 echo 的原本功能,同时把 echo 收到的字符串打印到 log 文件里。command echo 是使用原本的 echo 命令。 匹配绝对路径只是一个例子,只是针对脚本 A 执行 if 里的语句。你也可以匹配文件名,自己改改吧。 |