命令的bash语法错误

时间:2014-12-18 00:45:35

标签: python bash ssh paramiko

我有一个清单:

jos = ['/usr/bin/hive', '-e', "'set mapred.job.queue.name=exp_dsa; select * from trinity.clickstream where device_id = '59ab' and event_timestamp = '141833140000';'"]

我将像这样处理列表

cmdlines = " ".join(map(lambdas x:("'"+x+"'"), jos))

然后我会在paramiko中推送这个字符串:

stdin,stdout,stderr = ssh.exec_command(cmdlines)

所有paramiko都允许我ssh进入另一台机器。

我目前收到语法错误

stderr.readlines()生成

[u"bash: -c: line 0: syntax error near unexpected token `from'\n", u"bash: -c: line 0: `'/usr/bin/hive' '-e' ''set mapred.job.queue.name=exp_dsa; select * from trinity.clickstream where application_mobile_device_id = '59ab' and event_timestamp = '141833140000';'''\n"]

不确定此错误的含义或需要修复的位置

1 个答案:

答案 0 :(得分:4)

初始化jos时,我注意到您在包含"..."的字符串周围使用'...'而不是'非常小心;但是当你初始化cmdlines

时,你会抛弃这种警告
cmdlines = " ".join(map(lambdas x:("'"+x+"'"), jos))

在这里,您只需将'...'中的所有字符串换行并在它们之间放置空格。所以你的实际Bash脚本(你bash -c的实际参数)是:

  

'/usr/bin/hive' '-e' ''set mapred.job.queue.name=exp_dsa; select * from trinity.clickstream where application_mobile_device_id = '59ab' and event_timestamp = '141833140000';''

当你真正需要的是:

  

'/usr/bin/hive' '-e' "set mapred.job.queue.name=exp_dsa; select * from trinity.clickstream where application_mobile_device_id = '59ab' and event_timestamp = '141833140000';"

甚至:

  

/usr/bin/hive -e "set mapred.job.queue.name=exp_dsa; select * from trinity.clickstream where application_mobile_device_id = '59ab' and event_timestamp = '141833140000';'"

(注意:我还删除了第三个字符串周围的一些' - 。您只需要"'...'" "..."。)

最好的修复可能是取消jos数组。不要用Bash脚本的内容搞得太多;只需直接设置cmd_lines

  

cmd_lines = "/usr/bin/hive -e \"set mapred.job.queue.name=exp_dsa; select * from trinity.clickstream where application_mobile_device_id = '59ab' and event_timestamp = '141833140000';\""