在字符串流的{s}命令中从bash脚本中转义引号

时间:2017-07-26 09:57:28

标签: c++ string bash stringstream

我有一个bash脚本,我想使用ssh远程执行。

这是脚本:

(
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
)

由于我想使用ssh远程执行此操作,我需要引用整个脚本:

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

我似乎无法弄清楚如何正确引用脚本以便正确解释。

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

nb - 好奇 - 脚本要求在每个VM上安装guest虚拟机添加,以便它返回每个VM的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 个答案:

答案 0 :(得分:1)

您的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 ++转义字符串。