
主な質問:
ルート、管理者、デスクトップ ユーザー、または権限のないユーザーのいずれがログインしていても、Ubuntu のデスクトップが表示されたときに、スクリプトの 1 つを「完全に」実行する方法はありますか?
スクリプトは何をしますか?
スクリプトはパーティションをマウントし、そのパーティション内のファイルを検索し、最終的にそのファイルに基づいてパーティションを別のパーティションにコピーするかどうかを決定します。このコピーは次のように行われます。
dd if=/dev/sda2 of=/dev/sda5
スクリプトが正常に実行されるのはいつですか?
ターミナルからスクリプトを実行すると、スクリプトはスムーズに実行されます。
sudo ./my_copying_script
このコマンドは、現在ログインしているユーザーのパスワードを要求します。パスワードを入力すると、スクリプトが動作を開始します。
スクリプトが正常に実行されないのはどのような場合ですか?
起動時にスクリプトを実行したいので、スタートアップアプリケーションUbuntu のユーティリティ。スクリプトは起動時に実行されましたが、dd コマンドで終了し、次のエラーが返されました。
dd: opening '/dev/sda2': Permission denied
の上エドの提案に従って、my_copying_script の所有者を root に設定し、SUID を設定しました。これで、my_copying_script の権限は (-rwsr-sr-x) になりました。エドの見解は、suid を設定すると、スタートアップ プログラムは所有者の権限で実行されるというものでした。そのようにしましたが、同じ /dev/sda2 権限拒否エラーが発生しました。
次に、ddの前にsudoを付けました。
sudo dd if=/dev/sda2 of=/dev/sda5
しかし、次のエラーが返されました:
sudo: no tty present and no askpass program specified
答え1
ウスマンさん、私がすでに述べたように、少なくとも 2 つの選択肢があると思います。
最も簡単な方法
準備したスクリプトを実行して終了する (誰が開始したかを確認し、親プロセスの所有者が実行できる場合は使用を許可) 設定済みの UID バイナリを作成します。デスクトップ マネージャーのスタートアップに配置すれば、それで完了です。ただし、これは最善の方法ではなく、C コーディングが少し必要になることに注意してください。基本的には、次のサンプルのようなコードを作成する必要があります。
int main(){
setuid(0);
system("/bin/sh /root/bin/mounts.sh");
}
これはハックであり、解決策ではないことに注意してください。また、root:allowed_groupと4750の権限を必ず使用してください。バイナリ全員が実行する必要がない場合は、これを起動できるすべてのユーザーを allowed_group(名前を選択)に追加することを忘れないでください。
良い方法
他にもっと良い方法は、システムの起動時に(例えばinit-scriptsから)生成されるデーモンのようなものを作ることですが、新しいXセッションが開始されたときにそれをどのように検出するのか正確にはわかりません。私はまだその話題には興味がないので、何も言えません。クリアここにアドバイスがあります。
答え2
マウントされたドライブ パスに正しいアクセス許可を設定すれば完了です。
答え3
sudo は、次の 3 つの条件のいずれかが満たされた場合にのみ、別のユーザーとしてプログラムを実行します (パスワードに関する限り)。
- NOPASSWDオプションが指定されている
- ユーザーが正しいターゲットパスワードを入力した
- ユーザーが正しいソースパスワードを入力した
オプション 2 と 3 には TTY が必要なので (sudo はパイプから読み取りません)、TTY が見つからない場合は実行されません。ssh を使用してリモートでスクリプトを実行している場合は、スクリプトを確認してください。非対話型のリモート コマンドに TTY が割り当てられない可能性があります。
引用元:ここ
答え4
考えられる解決策としては、ユーザーとユーザーが実行しようとしているコマンドを NOPASSWD パラメータ付きで /etc/sudoers に追加することが挙げられます。/etc/sudoers から次の行を切り取ります。
# コメントを解除すると、sudo グループのメンバーはパスワードを必要としなくなります # (後のエントリはこれを上書きするので、移動する必要がある場合があります) # さらに下へ # %sudo ALL=NOPASSWD: すべて
したがって、次のようなものが必要になるかもしれません:
myuser ALL=NOPASSWD: mount
正確な構文についてはよく分かりません。Google で調べたほうがよいでしょう。
編集:ネットワーク ドライブをマウントしようとしている場合、fstab の実行時にネットワーク サービスがロードされていないため、/etc/fstab にレコードを追加しても機能しない可能性があります。