![데이터에 큰따옴표("")가 포함된 경우 SSH를 통해 원격 sed 명령을 실행하는 방법은 무엇입니까?](https://linux55.com/image/45775/%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C(%22%22)%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EA%B2%BD%EC%9A%B0%20SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EC%9B%90%EA%B2%A9%20sed%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
서버 목록을 실행하고 다음 명령을 실행하려고 합니다.
itaig@itaig-lt:~$ ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers"
나는 또한 이것을 시도했습니다 :
itaig@itaig-lt:~$ ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]=\"-geometry 1920x1080\"/VNCSERVERARGS[6]=\"-geometry 1152x864\"/g' /etc/sysconfig/vncservers"
itaig@itaig-lt:~$
두 시도 모두 새로운 프롬프트 라인을 제공했으며 원격 시스템에서 파일을 확인할 때 아무것도 변경되지 않았습니다. 이런 명령을 실행할 수 있나요?
답변1
나는 ssh가 이 문제와 관련이 없다고 생각합니다. 시스템에 ssh로 연결하고 sed 명령을 직접 실행하여 먼저 작동하게 한 다음 ssh로 래핑해야 합니다.
귀하의 일치 패턴이 올바르지 않은 것 같습니다. 문자를 이스케이프 처리해야 하며 []
아마도 다른 것이 필요할 수 있습니다.
답변2
첫 번째 시도에서는 로컬 셸에서 큰따옴표로 묶인 문자열 부분을 강조 표시했습니다. sed는 물론이고 큰따옴표도 원격 쉘에 전달되지 않습니다.
ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers"
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
두 번째 시도에서는 원격 쉘 명령이 다음과 같습니다.
sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers
귀하의 쉘 참조는 정확하지만 [6]
아마도 귀하가 원하는 것은 아닐 것입니다. VNCSERVERARGS6=…
단지 일치만 할 뿐입니다. 괄호를 문자 그대로 일치시키려면 왼쪽 괄호 앞에 백슬래시를 추가해야 합니다.
sed -i 's/VNCSERVERARGS\[6]="-geometry 1920x1080"/VNCSERVERARGS\[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers
원격 셸에서 백슬래시는 작은따옴표로 묶인 문자열 안에 있으므로 문자 그대로 해석됩니다. 기본 셸에서 백슬래시는 큰따옴표로 묶인 문자열에 있습니다. 일반적으로 말하면 \[
큰따옴표로 묶인 문자열에서는 \[
어쨌든 해석되지만 두 배로 표시되어야 합니다.
ssh root@$srvname "sed -i 's/VNCSERVERARGS\\[6]=\"-geometry 1920x1080\"/VNCSERVERARGS\\[6]=\"-geometry 1152x864\"/g' /etc/sysconfig/vncservers"
ssh는 원격 측에서 셸 명령을 호출하므로 두 가지 수준의 참조가 필요합니다. 하나는 로컬 셸용이고 다른 하나는 원격 셸용입니다. 원격 명령 주위에 작은따옴표를 넣고 작은따옴표 없이 명령을 작성하는 것이 더 쉬운 경우가 많습니다.
ssh root@$srvname 'sed -i "s/VNCSERVERARGS\\[6]=\"-geometry 1920x1080\"/VNCSERVERARGS\\[6]=\"-geometry 1152x864\"/g" /etc/sysconfig/vncservers'
또는 다음 명령을 사용하여 원격 파일을 마운트하십시오.sshfs그러면 원격에 있는 것에 대해 걱정하지 않고 처리할 수 있습니다.
mkdir ~/net/srvname
sshfs root@srvname ~/net/srvname
sed -i 's/VNCSERVERARGS\[6]="-geometry 1920x1080"/VNCSERVERARGS\[6]="-geometry 1152x864"/g' ~/net/srvname/etc/sysconfig/vncservers