Shell

從另一個程序獲取未解析的 shell 密碼

  • July 22, 2021

遇到了一個問題,我需要獲取 shell 程序的未解析符號連結。例如,給定一個符號連結~/link-> ~/actual,如果使用$PWDof啟動 bash ~/link,我需要從 bash 程序外部獲取它。

可以使用或在https://unix.stackexchange.com/a/94359/115410中呼叫或呼叫已解決的 cwd,但我開始認為不可能獲得未解決的路徑。lsof``/proc

我曾嘗試使用lsof -b不使用,但日誌顯示該路徑無論如何readlink都不會嘗試使用。readlink似乎可以通過讀取環境/proc/.../environ並解析出來PWD,但這很慢,/proc系統上可能不存在,我相信嘗試讀取程序的環境存在一些安全隱患。

這是我要修復的有問題的程式碼:

lsof在 macOS 上

exec('lsof -OPln -p ' + this._ptyProcess.pid + ' | grep cwd', (error, stdout, stderr) => {
 ...
});

/proc在 Linux 上

Promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`);

目前工作目錄的邏輯值(邏輯 cwd,你稱之為“未解析的 pwd”)是 shell 的內部概念,而不是核心的概念。核心只記住完全解析的路徑(物理 cwd)。所以你不會通過通用系統介面得到你想要的資訊。你必須得到shell的合作。

環境變數是 shell 如何將PWD邏輯 cwd 傳輸到其子程序的方式。當一個 shell 執行另一個 shell 時,父級設置PWD為邏輯 cwd(它在執行程序時執行此操作),並且子級檢查PWD的值PWD是否合理,如果是,則將其用作其邏輯 cwd,然後回退到物理cwd 如果$PWD失去或錯誤。

觀察:

#!/bin/sh
mkdir /tmp/dir
ln -sf dir /tmp/link
cd /tmp/link
sh -c 'echo Default behavior: "$PWD"'
env -u PWD sh -c 'echo Unset PWD: "$PWD"'
PWD=/something/fishy sh -c 'echo Wrong PWD: "$PWD"'
rm /tmp/link
rmdir /tmp/dir

輸出:

Default behavior: /tmp/link
Unset PWD: /tmp/dir
Wrong PWD: /tmp/dir

讀取程序的環境並沒有任何特定的安全隱患,但它告訴您的是PWD程序啟動時的值。如果處理的更改到另一個目錄,則環境中的值不再相關。如果 shell 現在執行另一個程序,您需要的是環境中的值。但出現這種情況的唯一方法是讓 shell 執行另一個程序。

GUI 查找它們執行的 shell 的 cwd 的典型方法是讓 shell 將其列印出來。如果您偶爾需要這些資訊並希望將 shell 配置的最大控制權留給使用者,請確保 shell 顯示提示並發出pwd命令。這很簡單,即使在像 csh 和 fish 這樣的“外來”shell 中也可以工作,但在極端情況下會模棱兩可(例如,包含換行符的目錄名)。如果可以調整 shell 配置,您可以讓 shell 在每次顯示提示時列印一個轉義序列(PS1對於許多 shell,但使其包含目前目錄的方式各不相同),或者當它更改目錄時(chpwd_functions在 zsh ,其他shell中更具侵入性的方式)。

請注意,如果邏輯 cwd 的組件已被移動或刪除,或者符號連結已更改為指向其他位置,則該值可能是錯誤的。另一方面,物理 cwd 將始終正確。(如果該目錄已被刪除,Linux 的,這是所有程序(例如和獲取它們的資訊)的位置,將顯示為一個損壞的符號連結,其目標以.如果您確實找到了邏輯 cwd,您可能應該確保它與物理 cwd 匹配,如果不匹配則回退到物理 cwd。/proc/*PID*/cwd``ps``lsof (deleted)``lsof

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