Добавление одинарных кавычек в команду sed, а также в команду ssh - PullRequest
0 голосов
/ 06 декабря 2018

У меня проблемы с выполнением команды sed внутри ssh-вызова.Мне нужно использовать одинарные кавычки в моей команде sed.Вот моя командная строка:

ssh root@192.168.0.32 "sed -i '/0 => '192.168.0.32' /a 1 => '$old',' /tmp/test"

Вот файл:

<?php
$CONFIG = array (
  'trusted_domains' =>
  array (
    0 => '192.168.0.32',
  ),
  'dbtype' => 'mysql',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'logtimezone' => 'UTC',
  'installed' => true,
  'redis' =>
  array (
    'host' => '192.168.0.13',
    'port' => 9095,
  ),
  'mail_smtpmode' => 'sendmail',
  'mail_from_address' => 'noreply',
  'knowledgebaseenabled' => false,
  0 => 18,
  'loglevel' => 1,
  'maintenance' => false,
);

В этом контексте я хочу добавить в trusted_domains например 1 => '192.168.0.1', после первогоelement.

Проблема команды в том, что он не распознает одинарные кавычки внутри команды sed.

Не забывайте, что команда sed находится внутри команды ssh

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Не могли бы вы попробовать следующую команду (замените имя пользователя, имя хоста в соответствии с вашими потребностями):

ssh toto@localhost "sed '/0 => \x27192.168.0.32\x27/a 1 => \x27$old\x27,' /tmp/test"

вывод:

<?php
$CONFIG = array (
  'trusted_domains' =>
  array (
    0 => '192.168.0.32',
1 => '1.1.1.1',
  ),
  'dbtype' => 'mysql',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'logtimezone' => 'UTC',
  'installed' => true,
  'redis' =>
  array (
    'host' => '192.168.0.13',
    'port' => 9095,
  ),
  'mail_smtpmode' => 'sendmail',
  'mail_from_address' => 'noreply',
  'knowledgebaseenabled' => false,
  0 => 18,
  'loglevel' => 1,
  'maintenance' => false,
);

Если это работаетПросто добавьте -i параметров, если вы действительно уверены в том, что делаете.Вы также можете сделать -i.bak, чтобы заставить sed сделать резервную копию ваших файлов

0 голосов
/ 06 декабря 2018

Давайте минимизируем эту проблему (и в процессе ее реализации поймем, что большая часть вашего контекста может быть удалена из вашего вопроса.) Сначала мы определим вспомогательную функцию args, чтобы понять, как команды разбиваются на слова

$ args() { for x in "$@"; do echo "[$x]"; done; }

$ old=0.0.0.0
$ args ssh root@192.168.0.32 "sed -i '/0 => '192.168.0.32' /a 1 => '$old',' /tmp/test"
[ssh]
[root@192.168.0.32]
[sed -i '/0 => '192.168.0.32' /a 1 => '0.0.0.0',' /tmp/test]

Поэтому один аргумент ("sed -i ...") передается в ssh.Двойные кавычки необходимы для расширения переменной, но мы можем упростить проблему, вставив переменную old:

$ args sed -i '/0 => '192.168.0.32' /a 1 => '0.0.0.0',' /tmp/test
[sed]
[-i]
[/0 => 192.168.0.32 /a 1 => 0.0.0.0,]
[/tmp/test]

Мы можем упростить это далее

$ args '/0 => '192.168.0.32' /a 1 => '0.0.0.0','
[/0 => 192.168.0.32 /a 1 => 0.0.0.0,]

изаменив сложный аргумент гораздо более простым

$ args 'foo'1'bar'
[foo1bar]

Обратите внимание, что три строки 'foo', 1 и bar объединены в единый мир foo1bar.А теперь вы можете задать более простой вопрос:

Как мне добавить одинарную кавычку в строку 'foo'1'bar'?Ответ таков:

$ args 'foo'\'1\''bar'
[foo'1'bar]

Обратите внимание, что "foo'1'bar" не работает в вашем случае, так как вы уже использовали двойные кавычки для внешней команды ssh.

...