如果 ld-2.17.so 沒有可執行權限,為什麼 while 迴圈可以從終端運行?

如果 ld-2.17.so 沒有可執行權限,為什麼 while 迴圈可以從終端運行?

在我之前的問題中,執行“chmod 666 ld-2.17.so” - 我該如何恢復?我問如果我更改ld-2.17.so讀取權限,我怎麼能恢復它,因為它不允許我執行任何需要這些庫的操作?

我得到的答案如下:

如果您有一個可以寫入的可執行文件,您可以使用 bash 的讀取將 ld.so 的內容複製到該文件:

while IFS= read -d '' -r line; do printf "%s\0" "$line"; done > executable-file < /lib64/ld-2.17.so

我嘗試了一下,並且成功了。但我感到困惑的是,while如果這個循環/bin/bash本身需要lib64/ld-2.17.so庫,為什麼它會起作用,如下所示,

ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007ffc54dee000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f6fb9bbe000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f6fb99ba000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6fb95f6000)
    /lib64/ld-linux-x86-64.so.2 (0x000055ec142f5000)

有人可以告訴我為什麼bash程式碼可以在沒有 的情況下從終端運行嗎/lib64/ld-2.17.so?這是否也意味著bash即使/lib64/ld-2.17.so沒有權限,我也可以從終端使用建立一個空的可執行檔?

謝謝

答案1

while IFS= read -d '' -r line; do 
    printf "%s\0" "$line"
done > executable-file < /lib64/ld-2.17.so

僅使用 shell 內建函數,因此不需要啟動新進程。復原場景假設您已經有一個正在執行的 shell;因為它已經在運行,所以它在磁碟上的權限及其庫的權限不再重要。

在這種情況下,您將無法啟動新的 shell,但目前正在執行的任何內容都不會受到變更的權限的影響。

如果您嘗試讀取的檔案有權限,只有當您處於 root shell 中時才有效;否則重定向ld-2.17.so將會失敗,因為除非您是 root,否則無法讀取不可讀的檔案。 (我在這裡忽略 SELinux 等。)

相關內容