【问题标题】:Chef knife ssh sed command厨师刀 ssh sed 命令
【发布时间】:2025-09-02 18:35:01
【问题描述】:

我用刀 ssh 运行 sed 命令:

knife ssh 'name:mynode' 'sudo sed -i 's/https:\/\/test1.mydomain.com/https:\/\/test2.mydomain.com/g' /etc/chef/1.rb' -x myuser ./mypem.pem

我遇到了一个错误:

sed: -e expression #1, char 11: unknown option to `s'

如果我尝试

knife ssh 'name:mynode' "sudo sed -i 's/https:\/\/test1.mydomain.com/https:\/\/test2.mydomain.com/g' /etc/chef/1.rb" -x myuser ./mypem.pem

Error:

sed: can't read ./mypem.pem: No such file or directory

如果我尝试一下

knife ssh 'name:mynode' "'sudo sed -i 's/https:\/\/test1.mydomain.com/https:\/\/test2.mydomain.com/g' /etc/chef/1.rb'" -x myuser ./mypem.pem
Error:
bash: sudo sed -i s/https://test1.mydomain.com/https://test2.mydomain.com/g /etc/chef/1.rb: No such file or directory

命令在机器上运行:

sudo sed -i 's/https:\/\/test1.mydomain.com/https:\/\/test2.mydomain.com/g' /etc/chef/1.rb

为什么会这样?

【问题讨论】:

  • 在整个命令周围使用双引号 "" 或在 sed 脚本周围转义单引号。就像结束引号、粘贴字符和重新打开引号一样。
  • 我试过 knife ssh 'name:mynode' "'sudo sed -i 's/https:\/\/test1.mydomain.com/https:\/\/test2.mydomain.com/ g' /etc/chef/1.rb'" -x myuser ./mypem.pem 我得到一个错误 bash: sudo sed -i s/test1.mydomain.com/https://test2.mydomain.com/g /etc/chef/1.rb: 没有这样的文件或目录
  • 你是从 windows 还是 linux 启动刀命令?
  • 有什么理由不想将整个文件作为配方中的模板进行管理?这种用法绝对违背了厨师的用途。
  • 看看chef-client 食谱,特别是可以为您管理的配置食谱。

标签: regex linux bash sed chef-infra


【解决方案1】:

创建配方并使用刀 ssh 运行它

bash 'sed' do
  code <<-EOH
    sudo sed -i 's,https://test1.mydomain.com,https://test2.mydomain.com,g' /etc/chef/1.rb
    EOH
end

【讨论】: