Выход из PHP переменной в команде sed из сценария Ruby - PullRequest
1 голос
/ 21 декабря 2011

У меня есть скрипт Ruby, который генерирует команду sed для замены некоторого кода PHP. Команда позже выполняется через SSH.

command = "sed -i \"s*#{find_what}*#{replace_with}*\" #{file} "

Строка replace_with будет содержать несколько строк кода PHP, поэтому необходимо выполнить следующее экранирование:

  command.gsub!(/\n/, '\\\n ') # Handle new-line escaping
  command.gsub!(/&/, '\\\&') # Handle RegEx variable escaping
  command.gsub!(/(\$[a-zA-Z0-9_]+)/) { |s| s.gsub!(/\$/, '\\$') } # Handle bash variable escaping

Команда после экранирования выглядит так:

sed -i "s*require_once('file.php');*\n require_once(\$www_dir . \$path . '/file.php');\n *" /var/www/something.php

При выполнении этой команды вручную все работает как положено. Однако, если я выполню команду через Kernel.system, все переменные PHP будут удалены в строке замены. Something.php выглядит примерно так:

require_once( . . '/file.php');

Любые идеи будут оценены. Благодаря.

1 Ответ

2 голосов
/ 21 декабря 2011

Обновление: попробуйте использовать одинарные кавычки вокруг команды sed, чтобы не было подстановки переменных bash. Я бы попробовал такие рубиновые вещи, пока они не будут выглядеть правильно.

puts `echo #{command}` 

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

require 'net/sftp'
Net::SFTP.start('host', 'username', :password => 'password') do |sftp|
  filedata = sftp.file.open("/path/to/remote", "r").read
  filedata.gsub!(/foo/, "bar")
    sftp.file.open("/path/to/remote", "w") do |f|
    f.puts filedata
  end
end

см. http://net -ssh.rubyforge.org / sftp / v2 / api /

...