2012-02-07 1 views
2

Я следующий fabfile:Использование ткани для выполнения команд в ограниченной оболочки

from fabric.api import * 

env.hosts = ['samplehost'] 
env.user = 'foo' 
env.password = 'bar' 
env.shell = '' 

def exec_ls(): 
    run('ls') 
    run('ls -l') 

и я получаю следующий результат:

[samplehost] Executing task 'exec_ls' 
[samplehost] run: ls 
[samplehost] out: sample.txt 

[samplehost] run: ls -l 
[samplehost] out: rbash: ls -l: command not found 

Fatal error: run() encountered an error (return code 127) while executing 'ls -l' 

Aborting. 
Disconnecting from samplehost... done. 

шелл для пользователя «Foo» является '/бен/rbash.

Похоже, что если я выполняю команду с параметрами, она рассматривается как одна команда (в то время как «ls» без параметров работает отлично).

Обратите внимание: я положил пустую оболочку, потому что в противном случае Ткань пытается использовать '/ bin/bash', и это запрещено его оболочкой.

Можно ли использовать ткань в ограниченной оболочке?

ответ

2

Проблема не связана с тем, что используется rbash, но для пустого значения env.shell. Чтобы устранить эту проблему использования проблемы:

env.shell = '/bin/rbash -l -c' 

Обратите внимание, что:

  • значение по умолчанию для env.shell является /bin/bash -l -c, поэтому использование /bin/rbash -l -c имеет смысл
  • когда env.shell установлен в пустую строку, команду ISN 't выполняется через любую оболочку
  • оболочка является той, которая заботится о разделении длинных строк на команды и аргументы, без оболочки вся строка интерпретируется как единый com MAND, не будет найдено, как это происходит
+0

Указание '' rbash -l -c'', решило проблему. Невозможно поместить ''/bin/rbash'', поскольку ограниченная оболочка запрещает использовать абсолютный путь. – alexyz78

1

-проверить среду целевой машины с

echo $SHELL 

.Hypothetically вы получите это:

/bin/sh 

- Затем в вашем python fabfile.py:

from fabric.api import env 

env.shell = "/bin/sh -c" 
2

В моей среде, u петь ограниченную оболочку как часть массива Pure, представляется, что опция должна передать аргумент shell = False функции запуска.

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

  • Нет связанных вопросов^_^