通过Python仅将给定值解析到命令行

通过Python仅将给定值解析到命令行,python,json,mqtt,Python,Json,Mqtt,我通过Python中的MQTT发送和接收一条JSON消息,我想用JSON提供的变量启动一个命令行程序 问题是我不知道会有什么价值观,因此这就是我遇到的问题 最简单的方法是,如果我知道所有的变量,然后执行如下操作: data = json.loads(msg.payload) os.system("'command +f ' + data[arg1] + ' +g ' + data[arg2]") 但正如前面提到的,我不知道它们是否正在被传递,因此,我如何将其分解以便生成命令行命令 也许:

我通过Python中的MQTT发送和接收一条JSON消息,我想用JSON提供的变量启动一个命令行程序

问题是我不知道会有什么价值观,因此这就是我遇到的问题

最简单的方法是,如果我知道所有的变量,然后执行如下操作:

data = json.loads(msg.payload)
os.system("'command +f ' + data[arg1] + ' +g ' + data[arg2]")
但正如前面提到的,我不知道它们是否正在被传递,因此,我如何将其分解以便生成命令行命令

也许:

    if 'arg1' in data:
            command = "+f " + data[arg1]
    else:
            pass
    if 'arg2' in data:
            command + "+g " + data[arg2]
    else:
            pass

这样行吗?有更好的主意吗?

您可以使用for循环来迭代json,并构造命令字符串

 commandArgs = ["+f ","+g "]
 commandCount=0
 for element in data:
    command= command + commandArgs[commandCount] + element
    commandCount = commandCount +1

您可以使用for循环在json上迭代,并构造命令字符串

 commandArgs = ["+f ","+g "]
 commandCount=0
 for element in data:
    command= command + commandArgs[commandCount] + element
    commandCount = commandCount +1
虽然你可以像描述的那样做,但这不是你应该做的。运行用户输入的命令是程序能做的最不安全的事情之一。彻底清除命令是可能的,但很难全面执行。通常的方法是创建一个包含可接受命令的表,与该表匹配,然后使用该表中的条目填充命令行。用户键入的任何内容都无法使用该方法进入命令行

如果您确实希望直接接受用户输入,那么在清除所有特殊字符、首选语言环境之外的字符、双字节字符、路径分隔符等时要格外小心。也许您可以从Jeff提供的代码段开始,添加大量数据清除代码

另外,请注意,您没有编写代码的内容最终被提交处理的概率大致相当于该命令的风险。例如,如果您未能捕获并删除
cat~/.ssh/*
,您的一个用户很有可能会执行它,或者有人会破门而入。但是,如果您不捕获并删除
rm-r/*
,则有人提交该命令的可能性接近确定。

尽管您可以按所述方式执行此操作,但这不是您应该执行的操作。运行用户输入的命令是程序能做的最不安全的事情之一。彻底清除命令是可能的,但很难全面执行。通常的方法是创建一个包含可接受命令的表,与该表匹配,然后使用该表中的条目填充命令行。用户键入的任何内容都无法使用该方法进入命令行

如果您确实希望直接接受用户输入,那么在清除所有特殊字符、首选语言环境之外的字符、双字节字符、路径分隔符等时要格外小心。也许您可以从Jeff提供的代码段开始,添加大量数据清除代码


另外,请注意,您没有编写代码的内容最终被提交处理的概率大致相当于该命令的风险。例如,如果您未能捕获并删除
cat~/.ssh/*
,您的一个用户很有可能会执行它,或者有人会破门而入。但是,如果您不捕获并删除
rm-r/*
,则有人提交该命令的可能性接近确定性。

如果您测试该命令,会发生什么?您收到的数据不能以
{'command':'ls','args':['-l','/home/bob']}
或其他形式出现的原因是什么?这只是一个无中生有的例子——但你需要一些定义来代替你愿意接受的东西……如果你测试它会发生什么?你收到的数据不能以
{command':'ls','args':['-l','/home/bob']}
或其他形式出现的原因是什么?这只是一个无中生有的例子——但你需要一些定义来代替你愿意接受的东西。。。