rootとして起動時にスクリプトを実行する際の問題?


2

主な質問:

root、管理者、デスクトップユーザー、または非特権ユーザーがログインしていても、ubuntuのデスクトップが表示されたときにスクリプトの1つを「完全に」実行する方法はありますか?

スクリプトは何をしますか?

スクリプトはパーティションをマウントし、そのパーティション内でファイルを探し、最後にそのファイルに基づいて、パーティションを別のパーティションにコピーするという決定を下します。そのコピーは

dd if=/dev/sda2 of=/dev/sda5

スクリプトはいつ正常に実行されますか?

ターミナルからスクリプトを実行すると、スクリプトがスムーズに実行されます

sudo ./my_copying_script

このコマンドは、現在ログインしているユーザーのパスワードを尋ねます。パスワードを入力すると、スクリプトが機能し始めます。

スクリプトがうまく実行されないのはいつですか?

起動時にスクリプトを実行したい。Ubuntuのスタートアップアプリケーションユーティリティを使用して、スタートアッププログラムを設定しました。スクリプトは起動時に実行されましたが、次のエラーを取得するddコマンドで終了しました。

dd: opening '/dev/sda2': Permission denied 

EDKの提案私は、rootとしてmy_copying_scriptの所有者を設定し、SUIDを設定します。これで、my_copying_scriptの権限は(-rwsr-sr-x)です。edkの観点では、suidを設定すると、スタートアッププログラムはその所有者の許可で実行されます。私はそれをしましたが、同じ/ dev / sda2許可拒否エラーが発生しました。

次に、下記のようにddの前にsudoを付けました

 sudo dd if=/dev/sda2 of=/dev/sda5

しかし、これは次のエラーを返しました:

sudo: no tty present and no askpass program specified

どのディストリビューションを使用していますか?どのデスクトップ?代わりに、システムの起動時にドライブをマウントできますか(たとえば、/ etc / fstabから)。
いんちきのキホーテ

Ubuntu 9.10とGNOMEを使用しています。はい、/ etc / fstabを使用してドライブをマウントできますが、これにより、そのパーティションが不要なすべてのユーザーが使用できるようになります。ルートのみがそのパーティションにアクセスできるようにします。これについて何か考えはありますか?
ウスマン

@Usmanは適切な権限でマウントします。
オリバーフリードリヒ

rootのみにすべての許可を与えるように/ mntをマウントすると、起動プログラムは/ mntのデータにアクセスできません。
ウスマン

より良い質問@Usman
いんちきキホーテ

回答:


2

ウスマン、私がすでに言及した少なくとも2つのオプションがあると思います。

最も簡単な方法

set-UIDバイナリを作成して(開始者を確認し、親プロセスの所有者が実行できる場合は使用を許可します)、準備されたスクリプトを実行して終了します。デスクトップマネージャーでスタートアップに設定するだけです。ただし、これは最善の方法ではなく、少しのCコーディングが必要です。基本的に、このサンプルのようなコードを作成する必要があります。

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

これは実際にはハッキングであり、解決策ではないことに注意してください。また、すべてのユーザーが実行する必要がない場合は、root:allowed_groupとバイナリの 4750権限を必ず使用してください。これを開始するすべてのユーザーをallowed_groupに追加することを忘れないでください(名前を選択してください)。

良い方法

他の、はるかに良い方法は、@システムブート(たとえばinitスクリプトから)を生成する一種のデーモンを作成することですが、新しいXセッションが開始されたときにあなたがどのように正確に検出するのかわかりませんまだトピックですが、ここで明確なアドバイスをすることはできません。


edKで申し訳ありませんが、最初の提案は理解できなかったと思います。chmod + sコマンドを使用して、プログラムのsuidを設定しました。さて、Cコードは何をしますか?
ウスマン

1
私が与えたもののように。この例およびモード4755および6755で遊ぶことができます:codepad.org/zkCULq3q
edk

「これは素晴らしいコメントです」をクリックして誤ってクリックしました。:Pさて、これが私が理解していることです。間違っている場合は修正してください。setuid(0)するCプログラムを作成し、system( "/ home / namsu / Desktop / my_copying_script")を介してスクリプトを実行し、最後にこのCコードの実行可能ファイルを起動時に実行するように設定します。右?:)
ウスマン

私はそれが私の答えで非常に明確に述べられていると思った。
edk

1

マウントされたドライブパスに正しいアクセス許可を設定すると、完了です。


申し訳ありませんが、それでは問題は解決しません。
ウスマン

X関連のプロセスの生成を監視するデーモンスクリプトを作成するか、呼び出し元が誰であるかを確認してからあなたが望むことをするsuidバイナリを使用したいかもしれませんが、実際には表示されませんルートでアクセスできるようにするだけの場合は、そうする理由です。ログイン時にスクリプトをrootとして実行したいだけの場合、suid-binaryが最も簡単な(しかし危険な!)方法です。実際、それは実際のソリューションよりもむしろハッキングです。
edk

0

sudoは、次の3つの条件のいずれかが満たされている場合にのみ、別のユーザーとしてプログラムを実行します(パスワードに関する限り)。

  1. NOPASSWDオプションが指定されている
  2. ユーザーが正しいターゲットパスワードを入力した
  3. ユーザーが正しいソースパスワードを入力した

オプション2と3はTTYを必要とするため(sudoはパイプから読み取れません)、見つからない場合は実行されません。sshを使用してリモートでスクリプトを実行している場合は、非インタラクティブリモートコマンドにTTYを割り当てない可能性があるため、スクリプトを確認してください。

引用元:ここ


sshを使用してスクリプトを実行していません。
ウスマン

@Usman:sudoは、sudoが非対話的に実行されることについて文句を言う唯一の場所ではありません。また、スタートアッププロセスにアタッチされたTTYがないため、スタートアップスクリプトから実行した場合にもエラーが発生します。
いんちきキホーテ

また、起動スクリプトにTTYを添付することはできません。
ウスマン

0

エントリを/ etc / fstabに追加し、chownおよびchmodを使用して権限を変更し、マウントされたパーティションへのルートアクセスのみを許可します。

sudo chown -R root:root /mnt
sudo chmod -R 770 /mnt

/ etc / fstabにエントリを追加してパーティションをマウントし、指定したとおりにアクセス許可を設定しましたが、起動スクリプトは通常のユーザー(rootではない)としてログインすると/ mntのデータにアクセスできないため、機能しませんでした。私の通常のユーザーは/ mntへのアクセス権を取得していませんが、これは私にとっては問題ありませんが、私のプログラムは/ mntへのアクセス権を取得する必要があります。私はまだ立ち往生しています。:(
Usman

あなたのコメントでは、「ルートのみにそのパーティションへのアクセスを許可したい」と述べました。他の人に読み取り専用アクセスを許可したい場合は、chmodコマンドの770を774に置き換えます。
マーク

0

考えられる解決策は、ユーザーとユーザーがNOPASSWDパラメーターを使用して/ etc / sudoersに呼び出そうとしているコマンドを追加することです。/ etc / sudoersから切り取ります:

#グループsudoのメンバーがパスワードを必要としないようにコメントを外します
#(後のエントリがこれを上書きするため、移動する必要がある場合があることに注意してください
#さらに下へ)
#%sudo ALL = NOPASSWD:ALL

したがって、次のようなものが必要になるかもしれません。

myuser ALL=NOPASSWD: mount

正確な構文についてはよくわかりませんが、Googleで検索する方が良いでしょう。

編集:ネットワークドライブをマウントしようとしている場合、おそらく/ etc / fstabへのレコードの追加は機能しません。これは、fstabの実行時にネットワークサービスがロードされないためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.