Bagaimana menjalankan perintah sed remote melalui ssh jika data menyertakan tanda kutip ganda ("")?

4

Saya mencoba menjalankan daftar server dan menjalankan perintah berikut:

itaig@itaig-lt:~$ ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers"

Saya sudah mencoba seperti itu juga:

itaig@itaig-lt:~$ ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]=\"-geometry 1920x1080\"/VNCSERVERARGS[6]=\"-geometry 1152x864\"/g' /etc/sysconfig/vncservers"
itaig@itaig-lt:~$

Keduanya mencoba memberi saya baris prompt baru dan ketika memeriksa file pada mesin remote tidak ada yang berubah. Apakah itu mungkin untuk menjalankan perintah seperti itu?

Itai Ganot
sumber
Sudahkah Anda mencoba menjalankannya dan jika demikian apa yang terjadi / apa pesan kesalahannya?
user619714

Jawaban:

3

Saya tidak berpikir ssh berperan dalam masalah ini. Anda harus ssh ke atas ke sistem dan mencoba menjalankan perintah sed Anda secara langsung untuk membuatnya bekerja pertama kemudian bungkus dalam ssh.

Saya pikir pola kecocokan Anda salah, Anda perlu melarikan diri dari []karakter dan mungkin hal-hal lain juga.

pengguna619714
sumber
Anda berpikir benar! melarikan diri []menyelesaikan masalah saya, terima kasih.
Itai Ganot
2

Dalam upaya pertama Anda, saya telah menyoroti bagian-bagian yang merupakan string yang dikutip ganda di shell lokal. Tidak ada penawaran ganda yang pernah diberikan ke shell jarak jauh, apalagi sed.

ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers"
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Dalam upaya kedua Anda, ini adalah perintah shell jarak jauh:

sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers

Anda dapat mengutip shell dengan benar, tapi itu [6]mungkin bukan yang Anda maksudkan: itu VNCSERVERARGS6=…hanya cocok . Jika Anda ingin mencocokkan tanda kurung secara harfiah, Anda memerlukan garis miring terbalik sebelum braket pembuka.

sed -i 's/VNCSERVERARGS\[6]="-geometry 1920x1080"/VNCSERVERARGS\[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers

Dalam shell jarak jauh, garis miring terbalik berada dalam string tunggal yang dikutip dan dengan demikian ditafsirkan secara harfiah. Di shell lokal, garis miring terbalik berada dalam string yang dikutip ganda; secara umum mereka harus digandakan, meskipun \[dalam string yang dikutip ganda ditafsirkan sebagai \[toh.

ssh root@$srvname "sed -i 's/VNCSERVERARGS\\[6]=\"-geometry 1920x1080\"/VNCSERVERARGS\\[6]=\"-geometry 1152x864\"/g' /etc/sysconfig/vncservers"

Ingat bahwa ssh memanggil perintah shell di sisi jarak jauh, jadi Anda perlu dua tingkat kutipan: satu untuk shell lokal dan satu untuk shell jauh. Biasanya lebih mudah untuk menempatkan tanda kutip tunggal di sekitar perintah jarak jauh dan mengatur untuk menulis perintah itu tanpa tanda kutip tunggal.

ssh root@$srvname 'sed -i "s/VNCSERVERARGS\\[6]=\"-geometry 1920x1080\"/VNCSERVERARGS\\[6]=\"-geometry 1152x864\"/g" /etc/sysconfig/vncservers'

Atau, pasang file jarak jauh dengan sshfs dan kemudian bekerja padanya tanpa harus khawatir tentang menjadi jauh.

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
Gilles
sumber