Cat

為什麼我不能在字元串二進製文件上使用字元串命令?

  • June 4, 2021

我無法strings在二進製文件上執行命令strings(對我來說位於/usr/bin/strings

$ strings $(which strings)
strings

我也無法複製它並在它的副本上嘗試:

$ cp -L $(which strings) /tmp/
$ strings /tmp/strings
strings

我能得到它的唯一方法是擷取輸出cat

$ strings <<< $(cat $(which strings))
...

但是還有其他命令可以使用這種自引用(例如,cat $(which cat))。我查了一下,它可以在其他一些機器上工作[從這裡提取的圖像]。也許這是一個 macOS 的東西?(我目前正在執行 macOS 10.14)。

我知道這是一個可能沒有案例的愚蠢問題,但我只是好奇……

我在 macOS 的 zsh 和 bash 中得到了相同的行為。事實證明,strings在 macOS 中只查看 Mach-O 二進製文件的非文本部分。來自man strings

除非-給出標誌,否則字元串會在目標文件的所有部分中查找,除了 ( __TEXT, __text) 部分。如果沒有指定文件,則讀取標準輸入。

因此,要強制strings將文件視為純二進製而不是 Mach 執行檔,您需要傳遞-標誌。strings - "$(command -v strings)"只要您沒有重新定義string為函式,它將按預期工作。

zsh中,您可以只使用strings - =stringswhere=strings擴展為strings命令的路徑,而不管您是否還具有該名稱的函式(另請參見"$(command -ve strings)"shell 中yash)。

引用自:https://unix.stackexchange.com/questions/646329