「sudoコマンド」を使用して共有オブジェクトファイルを開きましたが、「sudo bash」は使用せず、同じコマンドの使用中にエラーが発生しましたか?

「sudoコマンド」を使用して共有オブジェクトファイルを開きましたが、「sudo bash」は使用せず、同じコマンドの使用中にエラーが発生しましたか?

次の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を設定する必要があります。

おすすめ記事