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
명령과 파일 이름을 포괄하는 것으로 나타나므로 원격 셸에서 따옴표를 처리한 후에 는 실제로 이미지의 ssh 출력에 표시됩니다 sed
./002/a \ ... /etc/profile
(글쎄, 적어도 그것이 내가 생각하는 것입니다. 큰 따옴표 문제는 적어도 커피가 충분하지 않으면 내 두뇌에 좋지 않습니다.)
다음과 같은 명령을 실행하여 디버깅할 수 있어야 합니다.
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 ;