代码之家  ›  专栏  ›  技术社区  ›  stack user

在stringstream的ssh命令中转义bash脚本中的引号

  •  0
  • stack user  · 技术社区  · 7 年前

    以下是脚本:

    (
    vmnames="$(/usr/bin/VBoxManage list vms | grep -o -w -P -e '\"([a-zA-Z0-9_]+)\"' | sed s/\"//g)"
    for vm in $vmnames
    do
        ip="$(/usr/bin/VBoxManage guestproperty enumerate ${vm} | grep 'V4/IP' | grep -o -w -P -e '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | sed s/\"//g)"
        echo "${vm} ${ip}"
    done
    )
    

    stringstream ssCmd;
        ssCmd   << "sshpass -p '" << sPass << "' ssh -o StrictHostKeyChecking=no "
                << sUser << "@" << sHost << " "
                << "\""
                << my_script_should_go_here
                << "\"";
    

    是否有一个自动工具可以用来正确地转义脚本,或者有人可以建议如何正确地转义脚本?

    注意——奇怪的是,该脚本要求在每个虚拟机上安装来宾添加,以便返回每个虚拟机的IP地址信息。

    使现代化

    // base64 encode the script for decode on remote system
    
    static const std::string k_sGetHostIpScript = "KAp2bW5hbWVzPSIkKC91c3IvYmluL1ZCb3hNYW5hZ2UgbGlzdCB2bXMgfCBncmVwIC1vIC13IC1QIC1lICdcIihbYS16QS1aMC05X10rKVwiJyB8IHNlZCBzL1wiLy9nKSIKZm9yIHZtIGluICR2bW5hbWVzCmRvCmlwPSIkKC91c3IvYmluL1ZCb3hNYW5hZ2UgZ3Vlc3Rwcm9wZXJ0eSBlbnVtZXJhdGUgJHt2bX0gfCBncmVwICdWNC9JUCcgfCBncmVwIC1vIC13IC1QIC1lICdcZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9JyB8IHNlZCBzL1wiLy9nKSIKZWNobyAiJHt2bX0gJHtpcH0iCmRvbmUKKQ==";
    
        stringstream ssCmd;
        ssCmd   << "sshpass -p '" << sPass << "' ssh -o StrictHostKeyChecking=no "
                << sUser << "@" << sHost << " "
                << "\"eval 'echo " << k_sGetHostIpScript << " | base64 --decode | bash'\"";
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Akira    7 年前

    看起来您在bash脚本中转义了字符串,因此必须转义转义的字符串。

    例如,假设bash脚本中有以下行:

    foo=$(printf "1st line\n2nd line\n3rd line\n" | grep -a "[0-2].*")
    

    将上述代码段附加到例如 std::stringstream \ )所有引号如下:

    std::stringstream ss;
    ss << "foo=$(printf \"1st line\\n2nd line\\n3rd line\\n\" | grep -a \"[0-2].*\")"
    

    this tool 将脚本转换为C++转义字符串。