我有一个清单:
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"]
不确定此错误的含义或需要修复的位置
答案 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';\""