他のプロセスで解析されていないシェルのパスワードを取得します。

他のプロセスで解析されていないシェルのパスワードを取得します。

はい問題発生シェルプロセスの未解決のシンボリックリンクを取得する必要があります。たとえば、シンボリックリンク~/link-> が与えられた場合、~/actualbash が を使用して開始された場合、 bash プロセスの外部から取得する必要があります。$PWD~/link

得る解決するcwdは、lsofまたはを使用して/proc呼び出すことができます。https://unix.stackexchange.com/a/94359/115410しかし、私はそれを得ることは不可能だと考え始めました。決めなかった道。

lsof -bなしで試しましたが、readlinkロギングはパスがとにかく試行されなかったことを示しますreadlink/proc/.../environで環境を読み取って解析することは可能ですが、PWD速度が遅く、/procシステムに存在しない可能性があり、プロセス環境を読み取ろうとするとセキュリティに影響を与える可能性があると思います。

私が修正しようとしている問題があるコードは次のとおりです。

lsofmacOSで:

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

/procLinuxで:

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

ベストアンサー1

現在の作業ディレクトリの論理値(論理的なcwd、「未分析のpwd」と呼ばれるもの)は、カーネルではなくシェルの内部概念です。カーネルは完全に識別されたパス(物理cwd)のみを記憶します。したがって、共通のシステムインタフェースを介して必要な情報を取得することはできません。シェルの協力を得なければなりません。

環境PWD変数は、シェルが論理 cwd を子プロセスに転送する方法です。シェルが別のシェルを実行すると、親はPWD論理cwdに設定され(プログラムが実行されるたびに実行されます)、子はPWD値がPWD合理的であることを確認し、そうであればそれを論理cwdとして使用して次に戻ります。物理CWD。$PWD欠落しているか間違っている場合はcwdです。

観察する:

#!/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プロセスが開始されたときの値が何であるかを示します。処理後に別のディレクトリに変更すると、環境の値は関連しなくなります。シェルが別のプロセスを実行している場合は、必要なのは環境の値です。しかし、これが起こる唯一の方法は、実際にシェルに別のプロセスを実行させることです。

GUIが実行中のシェルのcwdを見つける一般的な方法は、シェルにそれを印刷させることです。場合によっては、この情報が必要で、シェル構成の最大制御権をユーザーに任せたい場合は、シェルがプロンプトを表示してコマンドを実行していることを確認してくださいpwd。これは単純で、cshやFishなどの「エキゾチックな」シェルでも機能しますが、特殊な場合(改行文字を含むディレクトリ名など)ではあいまいです。シェル設定を調整できる場合は、プロンプトが表示されるたびに(PS1多くのシェルの場合、現在のディレクトリを含める方法はさまざまです)、またはディレクトリを変更するとき(chpwd_functionszshから)シェルにエスケープシーケンスを印刷させることができます。より侵入的な方法で他の殻を削除します)。

論理cwdのコンポーネントが移動または削除された場合、またはシンボリックリンクが他の場所を指すように変更されている場合、この値は無効になる可能性があります。一方、物理cwdは常に正確です。 (ディレクトリが削除された場合、andなどのすべてのプログラムが情報を取得するLinuxは、ターゲットがReportで終わる壊れたシンボリックリンクとして表示されます。) 。/proc/PID/cwdpslsof (deleted)lsof

おすすめ記事