從另一個程序獲取未解析的 shell 密碼
我遇到了一個問題,我需要獲取 shell 程序的未解析符號連結。例如,給定一個符號連結
~/link
->~/actual
,如果使用$PWD
of啟動 bash~/link
,我需要從 bash 程序外部獲取它。可以使用或在https://unix.stackexchange.com/a/94359/115410中呼叫或呼叫已解決的 cwd,但我開始認為不可能獲得未解決的路徑。
lsof``/proc
我曾嘗試使用
lsof -b
不使用,但日誌顯示該路徑無論如何readlink
都不會嘗試使用。readlink
似乎可以通過讀取環境/proc/.../environ
並解析出來PWD
,但這很慢,/proc
系統上可能不存在,我相信嘗試讀取程序的環境存在一些安全隱患。這是我要修復的有問題的程式碼:
exec('lsof -OPln -p ' + this._ptyProcess.pid + ' | grep cwd', (error, stdout, stderr) => { ... });
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