4

新しいクエリ:新しいUbuntuインストールを好みに合わせて初期化する統合スクリプトを作成しようとしています。パッケージをインストールするには、sudoで実行する必要がありますが、gconftool-2を使用してgconf設定に影響を与えるには、処理されないdbusセッションに依存します。スクリプトだけでUIDを変更するだけの方法で適切に。誰かがこれを行う方法を知っていますか?

古い質問:新しいUbuntuインストールの最初の起動時に実行されるPerlスクリプトを書いています。これは、リポジトリの追加、パッケージのインストール、およびgconf設定の設定を容易にするためです。私の問題は許可です。パッケージをインストールするには、スクリプトをsudoとして実行する必要がありますが、gconftool-2呼び出しは、個人ユーザーではなくrootユーザーに作用します。

4

3 に答える 3

4

スクリプトの途中でuidを変更するには、次のコマンドを使用してuidを変更しますPOSIX::setuid()perldoc POSIXを参照)。

use POSIX 'setuid';

# call cpan to install modules...

POSIX::setuid($newuid);

# ... continue with script
于 2010-10-06T18:37:48.953 に答える
2

sudoを再度使用して、次のようにroot権限を削除できます。

sudo -u 'your_username' gfconftool-2
于 2010-10-06T18:37:26.163 に答える
0

多くの読み取りと試行錯誤の結果、rootとしてスクリプトを実行したときに欠落しているのは、DBUS_SESSION_BUS_ADDRESS環境変数が設定されていないことです。gconf設定を設定する前に、これを設定し、uidをユーザーのuidに変更する必要があります。これは、私が試してみたテストスクリプトです。最後にシステムコールのいずれかを実行して、ウィンドウボタンの順序を切り替えます。スクリプトをユーザーまたはroot(sudo)として試して、動作することを確認してください。

#!/usr/bin/perl

use strict;
use warnings;

use POSIX;

# get the user's name (as opposed to root)
my $user_name = getlogin();
# get the uid of the user by name
my $user_uid = getpwnam($user_name);
print $user_name . ": " . $user_uid . "\n";

my %dbus;
# get the DBUS machine ID
$dbus{'machine_id'} = qx{cat /var/lib/dbus/machine-id};
chomp( $dbus{'machine_id'} );
# read the user's DBUS session file to get variable DBUS_SESSION_BUS_ADDRESS
$dbus{'file'} = "/home/" . $user_name . "/.dbus/session-bus/" . $dbus{'machine_id'} . "-0";
print "checking DBUS file: " . $dbus{'file'} . "\n";
if (-e $dbus{'file'}) { 
  open(my $fh, '<', $dbus{'file'}) or die "Cannot open $dbus{file}";
  while(<$fh>) {
    if ( /^DBUS_SESSION_BUS_ADDRESS=(.*)$/ ) {
      $dbus{'address'} = $1;
      print "Found DBUS address: " . $dbus{'address'} . "\n";
    }
  }
} else {
  print "cannot find DBUS file";
}

# set the uid to the user's uid not root's
POSIX::setuid($user_uid);
# set the DBUS_SESSION_BUS_ADDRESS environment variable
$ENV{'DBUS_SESSION_BUS_ADDRESS'} = $dbus{'address'};

my $command1 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:maximize,minimize,close"';
my $command2 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:minimize,maximize,close"';
system($command1);
## or
#system($command2);

注:ここでいくつかの良い情報を入手しました。

于 2010-10-13T00:09:08.010 に答える