2014-12-18 3 views
-1

У меня есть список:Баш ошибки синтаксиса команды

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)

Все парамико позволяет мне 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

выглядит как «» «» вызывает проблему – tinySandy

+0

@BallPython да я имею дело с несколькими "" из-за запросов. Не знаете, как исправить это = [ – Liondancer

+0

попытайтесь сбежать от них, должны работать – tinySandy

ответ

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';'"

(Примечание: Я также удалил некоторые ' -s вокруг этой третьей строки. У вас было "'...'", где вы хотели только "...".)

Лучшее решение, возможно, покончено с массивом 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';\""

+0

спасибо !! очень признателен! – Liondancer

Смежные вопросы