У меня есть сценарий жемчуга, из которого я должен выполнить простую остроту жемчуга на удаленном хосте:
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'
Хорошо, я могу использовать систему здесь, но как правильно выйти из нее??
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;
}
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 .
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);