【问题标题】:Sed command is considered a string - How to escape?sed 命令被认为是一个字符串 - 如何转义?
【发布时间】:2018-06-12 22:31:26
【问题描述】:

我有一个需要通过 SSH 执行的 sed 命令。我在 Python 中使用 Paramiko 到 SSH 进行编码。连接有效,sed 命令也有效。我的问题是当我尝试合并它们时:我需要将 sed 用作 sudo(sudo 命令有效,我已经用另一个命令对其进行了测试)。这是我所拥有的:

session.exec_command("sudo bash -c \"" + """sudo sed -i "s/\"hostname\":"  *"\".*\"/\"hostname\":"  *"\"adddvariable\"/" /home/frappe/frappe-bench/sites/test-dev.site1.local/site_config.json""" + "\"")

问题是当这个命令运行时,sed 被认为是“未完成”,我得到:

sed: -e 表达式 #1, char 11: 未终止的 `s' 命令

我认为这可能是由于 sed 命令中的空格造成的?我不知道如何解决这个问题。我是 Python、Paramiko 和 SSH 的新手。有人知道如何解决这个问题吗?

如果有帮助,这里是完整的代码:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(
    hostname=server_address,
    username=server_username,
    key_filename=server_key_file
)
session = ssh.get_transport().open_session()
session.set_combine_stderr(True)
session.get_pty() 
session.exec_command("sudo bash -c \"" + """sudo sed -i "s/\"hostname\":"  *"\".*\"/\"hostname\":"  *"\"adddvariable\"/" /home/frappe/frappe-bench/sites/test-dev.site1.local/site_config.json""" + "\"")
stdin = session.makefile('wb', -1)
stdout = session.makefile('rb', -1)
stdin.flush()
frappe.msgprint(_(stdout.read().decode("utf-8"))) # same as print(stdout.read().decode("utf-8"))

【问题讨论】:

    标签: python-2.7 ssh sed paramiko


    【解决方案1】:

    您的代码相当不清楚。应该绝对不需要运行嵌套的sudo 命令,对于单个命令,将其包装在sudo bash -c 中没有任何作用,并且引入了多余的过程和显着增加的安全表面,以及重要的引用问题。

    通过在 sed 脚本周围使用单引号而不是双引号并去掉多余的 sudo bash -c,可能最容易解决您的直接问题。

    session.exec_command("""sudo sed -i 's/"hostname":  *"[^"]*"/"hostname":  "adddvariable"/' /home/frappe/frappe-bench/sites/test-dev.site1.local/site_config.json""")
    

    我不完全确定我能猜出sed 命令真正应该完成什么。这个用"hostname": "adddvariable"替换(看起来是)一个JSON键/值hostname,替换旧值。

    sed -i 的参数应该是单个字符串;一对单引号可防止外壳分解和标记或以其他方式更改单引号之间的文本。如果您不需要 shell 在字符串中执行变量插值和/或命令替换,则基本上应该始终使用单引号。

    【讨论】:

    • 是的,你是对的,我不需要 bash -c 的东西。由于它并且因为我有双引号,该代码无法正常工作。你拯救了我的一天!
    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 2012-01-31
    • 2013-04-05
    • 1970-01-01
    • 2018-02-07
    • 2019-07-13
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多