데이터에 큰따옴표("")가 포함된 경우 SSH를 통해 원격 sed 명령을 실행하는 방법은 무엇입니까?

데이터에 큰따옴표("")가 포함된 경우 SSH를 통해 원격 sed 명령을 실행하는 방법은 무엇입니까?

서버 목록을 실행하고 다음 명령을 실행하려고 합니다.

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

관련 정보