次の3つのケースで、LD_LIBRARY_PATHがどのように異なる方法で処理されるかを理解するのが困難です。
- 一般ユーザーとして実行
- 「実行」を通じてsudo コマンド」
- 「実行」を通じてスート・バッシュ「ルートシェルから」注文する」
私の特別な問題は、私が実行したいバイナリ(dc_fullと呼ばれる)にsudoアクセスが必要ですが、「sudoコマンド」で実行すると次のエラーが発生することです。
ljw@test$ sudo ./dc_full
./dc_full: error while loading shared libraries: libthrift-0.9.1.so: cannot open shared object file: No such file or directory
ljw@test$ sudo bash
root@ljw-vm1:~/test# ./dc_full
.
...<works fine here!>
.
ユーザー ljw の場合、/etc/bash.bashrc と ~/.bashrc の両方に次の行があります。
root@ljw-vm1:~# grep LD_LIBRARY ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
root@ljw-vm1:~# grep LD_LIBRARY /etc/bash.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
これがsudoとsudo-bashのケースの両方を扱うことを願っています。 1つはユーザーシェルをカバーし、もう1つは「root」シェルをカバーします。しかし、明らかにそのようなことは起こりませんでした。
私はそれがうまくいかないという大きなヒントを与えるlddへの参照を見つけましたが、正確な理由はわかりません...
root@ljw-vm1:~/dc_full# ldd ./dc_full | grep thrift
libthrift-0.9.1.so => /usr/local/lib/libthrift-0.9.1.so (0x00007eff19e7c000)
ljw@ljw-vm1:~/dc_full$ ldd ./dc_full | grep thrift
libthrift-0.9.1.so => /usr/local/lib/libthrift-0.9.1.so (0x00007f8340cc5000)
ljw@ljw-vm1:~/dc_full$ sudo ldd ./dc_full | grep thrift
[sudo] password for ljw:
libthrift-0.9.1.so => not found
LD_LIBRARY_PATH
これら3つの状況はどのように設定されますか?
答え1
suidバイナリ(例えばsudo)に対してLD_LIBRARY_PATHを許可するのはセキュリティ上の問題なので、LD_LIBRARY_PATHは環境から削除されます。同じセキュリティ上の理由から、sudoはデフォルトでLD_LIBRARY_PATHを子に渡しません。うまく設計されたライブラリを使用すると、sudoパラメータの制限を迂回して目的の操作を実行できます。
これらの変数セットが必要な場合は、sudo -E
次のようにコマンドラインで環境変数を使用または渡しますsudo -- LD_LIBRARY_PATH=/usr/local/lib dc_full
。通常、手動設定が不要な環境変数を渡すようにsudoを設定する必要があります。
答え2
/etc/ld.so.confに/usr/local/libを追加してldconfigを実行すると、このパスがライブラリのデフォルトパスとして追加されます。