【问题标题】:Is it possible to Look at the the original content of a running but modified bash script?是否可以查看正在运行但已修改的 bash 脚本的原始内容?
【发布时间】:2013-04-10 19:09:49
【问题描述】:

假设我在后台运行一个 bash 脚本 run.sh,然后我修改了 run.sh。 有没有办法查看run.sh脚本的原文内容?

例如:

echo "echo a1; sleep 120; echo a2" > run.sh; bash run.sh& 
aPid=$!
echo "echo bbbbbb" > run.sh

我期待像cat {magic file/path} 这样的东西,它会打印出来

echo a1; sleep 120; echo a2

我正在四处寻找 /proc/$aPid ,但找不到任何东西。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    bash 似乎试图将它当前正在解释的脚本放在文件描述符 255 上,至少在我的系统上,对文件描述符最大值没有任何活动的非默认约束等......这可能无法保证,所以您可能需要稍微尝试一下,但鉴于正在运行的bash /some/script/sh 进程的 PID,您可以在文件描述符链接处查看/proc/<PID>/fd/ - 0、1 和 2 当然是预定义的 stdin/stdout/stderr一个,并且可能还有其他取决于您的脚本的作用,但是筛选该目录的内容以找出哪个文件描述符对应于您的脚本文件应该不难,您可以比cat或随便什么(例如cat /proc/12345/fd/255)来查看原始脚本。

    【讨论】:

    • 哇,没有意识到这一点。另见herehere。谷歌透露 ksh 将 fd 10 用于相同目的(因此它们似乎实际上是固定的,但是是的,不要依赖它。+1!
    • 谢谢@twalberg,这就是我想要的。但是,如果有后台子shellecho '(echo a; sleep 120; echo a)&' > run.sh 就不行了
    【解决方案2】:

    首先确保您的 ulimit 设置为允许核心文件。试试

    ulimit -c unlimited
    

    接下来,运行你的脚本

    ./run.sh
    

    在您的脚本运行时,修改或删除run.sh 脚本文件。

    执行ps ax 以查找第一个run.sh 脚​​本的进程ID (PID)。你应该会看到类似

    19365 pts/5    S+     0:00 /bin/bash ./run.sh
    

    那就做吧

    kill -SIGSEGV 19365
    

    你应该看到类似的东西

    Segmentation fault (core dumped)
    

    在您第一次运行 run.sh 的终端窗口中。

    最后,做

    strings core
    

    core 文件上。在字符串中的某处,您应该会看到原始 run.sh 文件的文本。

    致谢:此答案改编自 Retrieve plain text script from compiled bash script

    【讨论】:

    • Bash(有点奇怪)在执行期间会重新读取脚本,因此如果您在运行时删除脚本文件,它可能会终止或死亡。
    • @tripleee:你有具体的例子吗?我删除了几个在 bash 解释器中运行的脚本文件,没有看到你提到的内容。
    • @tripleee:你说的有些道理。见stackoverflow.com/questions/7834667/self-deleting-bash-script
    • 所以我的意思是,有证据表明 Bash 在执行它之前可能只读取下一个块,因此您不会在任何时候发现整个脚本加载到核心中,除了非常琐碎的脚本。
    • @tripleee:在我看来,bash 首先解析整个脚本文件,打印任何错误,然后执行。进行编辑,mvrm 对您在核心转储中看到的脚本没有影响。你能举个反例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多