Почему ткань использует /bin/sh

Я пытаюсь запустить некоторые команды на удаленном сервере. Мне нужно найти там несколько файлов bash. К сожалению, кажется, что ткань (внезапно, недавно?) начала использовать /bin/sh, и она ломается, потому что я использую синтаксис bash в своих сценариях. Я нашел это:

Если shell имеет значение True (по умолчанию), run выполнит заданную командную строку через интерпретатор оболочки, значение которого можно контролировать, установив env.shell (по умолчанию что-то похожее на /bin/bash -l -c "". ) Любые символы двойных кавычек (") или знака доллара ($) в команде будут автоматически экранированы, если оболочка имеет значение True.

Я не менял env.shell, поэтому не знаю, почему ткань начинает использовать sh. В любом случае, я перезаписываю его, но все равно не повезло:

env.shell = "/bin/bash"

Что может быть причиной этого? Что я могу сделать, чтобы заставить ткань использовать bash?


person blueFast    schedule 05.06.2013    source источник
comment
Вы уверены, что bash установлен и /bin/sh указывает на него на удаленном сайте?   -  person hek2mgl    schedule 06.06.2013
comment
/bin/bash действительно установлен. /bin/sh указывает на dash (wtf!), но в любом случае я хочу использовать /bin/bash, а не /bin/sh, поэтому не имеет значения, на что указывает /bin/sh.   -  person blueFast    schedule 06.06.2013
comment
Вы недавно начали запускать его в другой среде? Например, как root или nobody или cgi или подобное вместо себя? Или, в качестве альтернативы, вы пытаетесь что-то sudo (у ткани есть код, который специально пытается эмулировать удаление env для sudo)?   -  person abarnert    schedule 06.06.2013
comment
Между тем, если вы посмотрите на источник (или начните здесь и проследите свой путь до _shell_wrap), вы можете точно видеть, что он делает, и я не понимаю, как он мог поместить туда что-либо, кроме env.shell.   -  person abarnert    schedule 06.06.2013
comment
Что касается wtf: большинство дистрибутивов Linux использовали bash как sh. Некоторые *BSD-системы вместо этого использовали ash, потому что он намного меньше, не меняется так часто и был более тщательно очищен от проблем с безопасностью (хотя этого недостаточно для OpenBSD). В какой-то момент по тем же причинам Debian (и, следовательно, Ubuntu) переключился с bash на ответвление ash, которое было названо dash (угадайте, что означает d).   -  person abarnert    schedule 06.06.2013
comment
В любом случае, если вы пишете код, требующий функций bash, даже в средах, где они не используются по умолчанию, вы можете явно запустить bashshell=False).   -  person abarnert    schedule 06.06.2013
comment
@abarnert: спасибо за ваши комментарии. У вас есть идеи, как заставить ткань показывать команду full, которую она выполняет? Идеально было бы, если бы я мог видеть полную команду ssh, включая любые флаги и где видна вызываемая удаленная команда.   -  person blueFast    schedule 06.06.2013


Ответы (1)


Пришлось немного покопаться, но вот что я нашел:

Можно увидеть, что ткань делает за кадром:

from   fabric.api                                        import output

FAB_SHOW_RUNNING  = True   # Show the command that fabric runs
FAB_SHOW_STDOUT   = False  # Show the stdout of the command run
FAB_SHOW_STDERR   = False  # Show the stderr of the command run
FAB_SHOW_DEBUG    = True   # Increase logging detail for messages
FAB_SHOW_USER     = True
FAB_SHOW_STATUS   = False  # Prevent fabric from using print in some situations (at least in disconnect_all)
FAB_SHOW_WARNINGS = False  # Avoid fabric from showing messages about failed commands

output['running']  = FAB_SHOW_RUNNING
output['stdout']   = FAB_SHOW_STDOUT
output['stderr']   = FAB_SHOW_STDERR
output['debug']    = FAB_SHOW_DEBUG
output['user']     = FAB_SHOW_USER
output['status']   = FAB_SHOW_STATUS
output['warnings'] = FAB_SHOW_WARNINGS

Оказалось, что это не ткань, использующая /bin/sh, но, поскольку я (в данном конкретном случае) запускал локальные команды, виновником был модуль подпроцесса. Чтобы указать используемую оболочку, вам нужно указать shell=True и executable='/bin/bash'

person blueFast    schedule 06.06.2013
comment
Каково было ваше решение? Никакая операция структуры не принимает исполняемый параметр. - person Cerin; 11.12.2017