簡體   English   中英

如何跨ssh使用sed遠程替換文件中的行?

[英]How to remotely replace a line in a file using sed across ssh?

我有一個sed命令,在Linux機器上運行時,它可以正常運行。 此命令搜索匹配的模式“ AdvancedConfiguration_1”,並替換下一行中的URL語句並更新文件。

cd /tmp

sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt

我的要求是通過ssh從腳本遠程調用此命令。 但是,當我嘗試在ssh中使用命令時,它給了我錯誤。 我嘗試將轉義序列用於雙引號和大括號,但似乎沒有任何效果。 請幫助我解決此問題。

碼:

ssh -n -o StrictHostKeyChecking=no $user@$host "sudo su - $sudo_user -c'

cd /tmp

sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt

錯誤輸出:

sed:-e表達式#1,字符0:不匹配的'{'bash:第3行:s / URL =。* / URL = http:// myurl / } file.txt:沒有這樣的文件或目錄

在處理報價時,使用ssh進行報價的命令確實很棘手:

  1. 首先由用於啟動ssh的本地shell
  2. 然后由ssh使用的遠程shell執行遠程命令

對於以下命令:

sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt

嘗試使用ssh引用以下內容:

sed -i \''/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}'\' file.txt

另一種方法

當命令變得過於復雜時,就是在遠程端創建一個腳本文件並執行它。 這是一個在本地創建腳本,使用scp復制腳本然后通過ssh運行腳本的示例:

cat >myscript <<!
sed -i '/AdvancedConfiguration_1/{n;s/URL=".*"/URL="http://myurl"/}' file.txt
!

scp myscript ...
ssh ... sh myscript

在進行某些替換(例如環境變量評估)時,請小心“此處文檔”。

不確定sed命令,但是您可以嘗試使用Ansible執行類似任務。 通過SSH配置主機要容易得多。 對於您的問題,它具有lineinfile模塊,只需使用regexp標記要編輯的字符串即可。 可能在Ansible中看起來像這樣:

- lineinfile: dest=/path/to/file.txt regexp=^URL= line=URL=http://myurl/

在此處查看Ansible文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM