1

CPANの Perl モジュールSudo.pmを使用しています。

私が使用しているコードは次のとおりです。

# In this two variable I'll store the object that runs sudo commands and
# the exit status of the commands
my ($su, $run);

# This functions accept an object returned from sudo->run and will check
# if there were errors running the code.
sub check_status {
    # Retrieving the object
    my $run = shift;

    if (exists($run->{error})) {
        print "Failed.\n";
    }
    else {
        print "Done.\n";
    }
}

# This first call erase all RSA related files
$su = Sudo->new(
                {
                    sudo => '/usr/bin/sudo',
                    username => 'root',
                    pogram => '/usr/bin/rm',
                    program_args => '-f /tmp/cvmfs_test.key /tmp/cvmfs_test.csr /tmp/cvmfs_test.crt /tmp/whitelist.test.* /tmp/cvmfs_master.key /tmp/cvmfs_master.pub'
                }
);

print 'Erasing RSA keys... ';
$run = $su->sudo_run();
check_status($run);

# This instance will erase configuration files created in /etc/cvmfs/config.d
$su = Sudo->new(
                {
                    sudo => '/usr/bin/sudo',
                    username => 'root',
                    program => '/usr/bin/rm',
                    program_args => '-f /etc/cvmfs/config.d/127.0.0.1.conf'
                }
);

print 'Erasing configuration files in /etc/cvmfs/config.d... ';
$run = $su->sudo_run();
check_status($run);

# This instance will erase /tmp/cvmfs.faulty
$su = Sudo->new(
                {
                    sudo => '/usr/bin/sudo',
                    username => 'root',
                    program => '/usr/bin/rm',
                    program_args => '-f /tmp/cvmfs.faulty'
                }
);

print 'Erasing /tmp/cvmfs.faulty... ';
$run = $su->sudo_run();
print $run->{stdout};
check_status($run);

# This instance will erase all previous extracted repository
$su = Sudo->new(
                {
                    sudo => '/usr/bin/sudo',
                    username => 'root',
                    program => '/usr/bin/rm',
                    program_args => '-fr /tmp/server'
                }
);

print 'Erasing /tmp/server directory... ';
$run = $su->sudo_run();
print $run->{stdout};
check_status($run);

# This instance will run 'restarting_services.sh'
$su = Sudo->new(
                {
                    sudo => '/usr/bin/sudo',
                    username => 'root',
                    program => 'sh',
                    program_args => "$Bin/restarting_services.sh"
                }
);

print 'Restarting services... ';
$run = $su->sudo_run();
check_status($run);

このインスタンスの一部だけが機能する理由を説明できる人はいますか? 正確には、1 番目、2 番目、5 番目のインスタンスは機能しませんが、3 番目と 4 番目のインスタンスは機能します。

STDOUT または STDERR で出力を取得できず、check_status() 関数は常に「完了」と応答します。しかし、これは、コマンドが機能しない場合、オブジェクトがまったく設定されていないためです。

私はそれらすべてに同じ構文を使用しているようです。もちろん、パスワードなしで sudo を実行できるユーザーで使用しているため、そのパラメーターを追加しませんでした。

どうもありがとうございました。

4

1 に答える 1

1

コードにタイプミスがあります。

pogram => '/usr/bin/rm',

次のようにする必要があります。

program => '/usr/bin/rm',

デバッグに関する David W の提案は、まさに的を射ています...

于 2012-06-07T23:19:31.620 に答える