Как выполняются, острота жемчуга из сценария жемчуга (правильно вышел),

У меня есть сценарий жемчуга, из которого я должен выполнить простую остроту жемчуга на удаленном хосте:

ssh 192.168.1.1 "perl -pi.bup -e 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' /etc/grub.conf"

Это просто добавляет"audit=1"в конец каждой строки ядра в /etc/grub.conf если это уже не существует.

Острота работает просто великолепно, когда выполнено непосредственно на хосте, но не при выполнении через ssh из другого сценария жемчуга. Я попытался выйти из всех знаков доллара с одной или несколькими обратными косыми чертами, и я также попытался выйти из обратной косой черты в"\s", но ничто, что я делаю, кажется, не работает.

Обратите внимание, что я не хочу копировать сценарий в удаленный хост и затем выполнять его - я хотел бы сделать это с помощью команды ssh непосредственно.

Как правильно выйти из этого так, чтобы это работало?

- Обновите 09.09.2015 для показа точно, что я делаю в сценарии жемчуга:

sub SomeMethod
{
   &RunCommand($host, "perl -pi.bup -e \'s/^(\s+?kernel)(.*)(?<!audit=1)\$/\$1\$2 audit=1/\' /etc/grub.conf");
}

sub RunCommand
{
    my ($server, $command) = @_;
    my $commandOutput = "";

    if ($server ne "")
    {
        $command = "ssh $server \"$command\"";
    }

    $commandOutput = `$command`; 
    print $commandOutput;

    if (($? >> 8) != 0)
    {
        &LogMessage ("$command failed:\n\n$commandOutput");
        return $commandOutput;
    }
    return $commandOutput;
}

- Обновление № 2, с помощью system вместо обратных галочек:

system 'ssh', $host, 'perl', '-pi.bup', '-e', 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/', '/etc/grub.conf';
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `perl -pi.bup -e s/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/ /etc/grub.conf'

Хорошо, я могу использовать систему здесь, но как правильно выйти из нее??

1
задан 10 September 2015 в 02:51
3 ответа

Tā kā jūs rediģējat attālo failu vietā, jums nav nepieciešams uztvert izvadi, tāpēc būtu vēlama sistēma nekā aizmugures atzīmju izmantošana:

system 'ssh', '192.168.1.1', 'perl', '-pi.bup', '-e', 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/', '/etc/grub.conf';

Piezīme ka ssh nav jānodod attālā komanda kā viens parametrs. Tas mazliet palīdz citēt. Ja jūs patiešām vēlaties, varat:

system 'ssh', '192.168.1.1', q{perl -pi.bup -e 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' /etc/grub.conf};

Izmantojot operatoru q {} , ļaut perla līnijpārvadātājam izmantot atsevišķas pēdiņas.


Es to darītu, faktiski:

use Try::Tiny;
use IPC::System::Simple qw{capture};

sub SomeMethod
{
    my $output = RemoteCommand(
                    $host, 
                    q{perl -pi.bup -e 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' /etc/grub.conf}
                );
}

sub RemoteCommand
{
    my ($server, $command) = @_;
    my $output;

    try {
        $output = capture('ssh', $server, $command);
    }
    catch {
        LogMessage("command failed: ($command) : $_");
        $output = $_;
    };

    return $output;
}
2
ответ дан 3 December 2019 в 20:48

Es mēģināju ar šādu vienkāršu komandu un tā darbojas

ssh localhost "sed -i.bck '/[^audit]/{s/\(^\s\+kernel.*\)/\1 audit=1/g}' /boot/grub/menu.lst"

Nav runa par sed vs perl , taču iepriekšējās komandas izmantošana ir skaidrāka, lai arhivētu vēlamo .

0
ответ дан 3 December 2019 в 20:48

es beidzot saņēmu darbu.

No bash tieši:

echo 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' | ssh 192.168.1.1 "perl -pi.bup - /etc/grub.conf"

No perl skripta:

my $command = "echo 's/^(\\s+?kernel)(.*)(?<!audit=1)\$/\$1\$2 audit=1/' | ssh $_wsAddress 'perl -pi.bup - /etc/grub.conf' ";
&RunCommand("", $command);
0
ответ дан 3 December 2019 в 20:48

Теги

Похожие вопросы