Quotes exercise – как сделать ssh внутри ssh во время запуска sql внутри второго ssh?

Возможный дубликат:
Цитирование в строках ssh $ host $ FOO и ssh $ host "sudo su user -c $ FOO"
Объединение команды, включающей одиночные и двойные кавычки для другой команды

Я хочу запустить sql поверх ssh с php. Ниже команда работает красиво

ssh server1 "sudo -u db2inst1 sh -c '/opt/ibm/db2/V9.7/bin/db2 connect to RATIONAL; /opt/ibm/db2/V9.7/bin/db2 set schema Edumate; /opt/ibm/db2/V9.7/bin/db2 \"select * from edumate_settings\"'" 

Теперь мне нужно сделать ssh с сервера1 на server2, а затем запустить «sudo -u db2inst1 ….» там.

Есть ли простой способ, как иметь дело с кавычками, если я добавлю дополнительный сервер к этому сценарию? Так оно начнется как

 ssh server1 "ssh server2 "the rest is as above" 

Обратите внимание, что мне нужно запустить код выше с php.

One Solution collect form web for “Quotes exercise – как сделать ssh внутри ssh во время запуска sql внутри второго ssh?”

Вы хотите получить command "escaped_command_with_arguments" command_with_arguments для command "escaped_command_with_arguments" . Вы получаете escaped_command_with_arguments , сканируя command_with arguments слева направо и заменяя каждый \ by \\ и каждый " by \" .

альтернативно вы command_with_arguments в редактор и

  1. замените все \ на \\
  2. замените каждый " by \"

в этом порядке. Таким образом, шаг за шагом вы можете сгенерировать следующую последовательность выражений (я использовал блокнот Windows для создания выражения)

 select * db2 "select *" sudo "db2 \"select *\"" ssh "sudo \"db2 \\\"select *\\\"\"" ssh "ssh \"sudo \\\"db2 \\\\\\\"select *\\\\\\\"\\\"\"" ssh "ssh \"ssh \\\"sudo \\\\\\\"db2 \\\\\\\\\\\\\\\"select *\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"" ssh "ssh \"ssh \\\"ssh \\\\\\\"sudo \\\\\\\\\\\\\\\"db2 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"select *\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"" 

Если вы подсчитаете числа \ перед каждым " в последнем выражении, вы получите следующую последовательность:

 0 1 3 7 15 31 31 15 7 3 1 0 

или

 1-1 2-1 4-1 8-1 16-1 32-1 32-1 16-1 8-1 4-1 2-1 1-1 

Таким образом, можно построить такое вложенное выражение за один шаг без итерации, но вы должны позаботиться о том, как выражения вложены.

Кроме того, эти методы могут быть расширены в ситуациях, когда помимо " и " есть другие экранированные символы.

Поэтому добавьте свою команду в редактор, замените server1 на server2 , замените \ на \\ и " на \" как описано выше, и добавьте ssh server1 " в начале и " в конце, и вы получите

 ssh server1 "ssh server2 \"sudo -u db2inst1 sh -c '/opt/ibm/db2/V9.7/bin/db2 connect to RATIONAL; /opt/ibm/db2/V9.7/bin/db2 set schema Edumate; /opt/ibm/db2/V9.7/bin/db2 \\\"select * from edumate_settings\\\"'\"" 
  • rkhunter / usr / bin / ssh && / usr / sbin / sshd
  • Отображение сеанса экрана Bash для удаленного экрана для пользователя
  • Как выполнить сухую работу с использованием rsync over ssh?
  • ssh с ключом rsa запрашивает пароль
  • Ssh продолжает просить кодовую фразу несколько раз
  • Подключение ssh к gitlab.com не подходит для домашнего маршрутизатора, но отлично работает на рабочем месте. Тем не менее, Гитуб и Битбакет над ssh прекрасно работают дома
  • Как найти причину слишком много выпадающих соединений SSH?
  • Доступ запретил SSH из окон в linux через шпатлевку
  • Есть ли учебник по настройке сервера хостинга?
  • Emacs ansi-term и термин не работает хорошо, когда я ssh в удаленную машину
  • Настройте SSH, чтобы спросить мою личную ключевую фразу в оболочке (не в окне)
  • Lsyncd не работает на Mac 10.9
  • Linux и Unix - лучшая ОС в мире.