sed 및 ssh에서 따옴표를 사용하는 방법은 무엇입니까?

sed 및 ssh에서 따옴표를 사용하는 방법은 무엇입니까?

bash/rhel 7에서는 이것이 작동하지 않습니다.

ssh host "sed -i -e \"s/dnl MASQUERADE_AS.*\$/MASQUERADE_AS(\`domain.com\')dnl/\" /etc/mail/sendmail.mc"

bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

나는 본질적으로 일반 명령줄에서 작동하지만 ssh 내에서는 중단되는 이 sed를 원합니다.

sed -i -e "s/dnl MASQUERADE_AS.*$/MASQUERADE_AS(\`domain.com\')dnl/" /etc/mail/sendmail.mc

누구 아이디어 있어? 매우 감사.

답변1

사용제프의 ​​아이디어스크립트 자체 에 대해 here-document를 사용하는 것입니다 sed(글쎄, 그는 "here-string"을 언급하지만 거기에 인용하는 데에도 문제가 있을 것이라고 생각합니다).

ssh host 'sed -i -f - /etc/mail/sendmail.mc' <<'SED_END'
s/dnl MASQUERADE_AS.*/MASQUERADE_AS(`domain.com')dnl/
SED_END

sed원격 호스트의 가 를 sed사용하여 표준 입력에서 스크립트를 읽을 수 있다면 -f -아마도 작동할 것입니다(그렇지 않은 경우, 예를 들어 일부 BSD 시스템에서는 시도 -f /dev/stdin).

명령 호출sed 원격 호스트를 호출하고 sed표준 입력으로 편집 스크립트를 전달합니다. 스크립트 sed는 의 따옴표로 인해 작은따옴표로 묶여 있으므로 'SED_END'쉘은 텍스트의 내용을 확장하려고 시도하지 않습니다.

$또한 필요하지 않기 때문에 정규식에서 후행을 제거했습니다 ( .*어쨌든 줄의 끝과 일치합니다).

약간 더 짧은 sed스크립트(두 번 언급하지 않음 MASQUERADE_AS):

s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/

관련 정보