Добавить строку, используя Sed на удаленной системе

Я пытаюсь добавить PS1 в файл /etc/profile удаленной системы. Теперь я должен добавить эту строку на более чем 70 серверах, поэтому используя ssh я добавлю эту строку PS1 на всех серверах. Но когда я пытаюсь отправить PS1, он зависает, и я должен убить команду

Это команда

 ssh -v admin@remserv "sed '/002/a \ PS1=" \[\e[31m\]\n------------------------------------------------------------------------------------------------------------------------------ \n\n[\u@\h \W]\\$ - \# \[\e[0m\] " /etc/profile' " 

введите описание изображения здесь

Что мне здесь не хватает?

Команда отредактирована на основе предложения

 > ssh -vt admin@remserv printf "%s\n" "sudo sed -i.bak '/002/a \ > PS1=" > '\[\e[31m\']'\'n------------------------------------------------------------------------------------------------------------------------------ '\'n'\'n'[\u@\h \W']'\\'$ - '\'# '\[\e[0m\'] " /etc/profile' " 

  • Проблема с несколькими файлами, связанными с SSH-соединениями
  • Вставка некоторого текста с вкладками в документ здесь в окне PuTTY
  • Копирование защищенных файлов между серверами в одной строке?
  • Как запустить mutt через ssh без прохождения интерактивной оболочки
  • проблема с обратными кавычками внутри цикла while при выполнении команды над ssh
  • Как отлаживать пересылку портов SSH
  • openssh-server не запускается в контейнере Docker
  • ssh не работает в CentOS 6.4?
  • 2 Solutions collect form web for “Добавить строку, используя Sed на удаленной системе”

     ssh ... "sed '/002/a \ PS1=" \[\e[31m\]\n--...- \# \[\e[0m\] " /etc/profile' " ^ ^ ^ ^ 

    У вас две кавычки без кавычек внутри указанной строки, они будут удалены оболочкой (на локальной стороне ssh-соединения). Кроме того, внутренние одинарные кавычки, похоже, охватывают как команду sed и имя файла, поэтому после того, как удаленная оболочка обрабатывает цитирование, sed получит один аргумент с /002/a \ ... /etc/profile . Это фактически показывает вывод ssh в вашем изображении.

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

    Вы должны уметь отлаживать это, запустив что-то вроде

     ssh somewhere printf '"%s\n"' "sed '/002/... /etc/profile' " 

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

    Хорошо решить это, используя символы «\»

    Правильная команда

     for i in `cat serverslist`; do ssh -t admin@$i "sudo sed -i.bak '/002/a \ PS1="\" '\\'['\\'e[31m'\\']'\\n'------------------------------------------------------------------------------------------------------------------------------ '\\'n'\\'n['\\'u@'\\'h '\(''\\'W'\)']'\\''\\'$ - '\\'# '\\'['\\'e[0m'\\'] \"" ' /etc/profile " ;done ; 
    Linux и Unix - лучшая ОС в мире.