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