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

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

Я пытаюсь добавить 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' "

решение1

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выведет полученные аргументы, по одному на строку, поэтому будет легче увидеть, где на самом деле разделена строка (echo объединит ее пробелами, поэтому foo, bar, будет выглядеть так же, как foo bar). Двойные кавычки в строке формата сохранят обратную косую черту для удаленного устройства.

решение2

Хорошо, решим это с помощью символов '\'

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

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 ;

Связанный контент