Используйте Fabric для выполнения команд в ограниченной оболочке - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть следующий файл:

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' является '/ bin / rbash'.

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

Обратите внимание, что я поставил пустуюshell, потому что в противном случае Fabric пытается использовать '/ bin / bash', и это не разрешено закрытой оболочкой.

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

Ответы [ 3 ]

2 голосов
/ 11 февраля 2016

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

2 голосов
/ 07 февраля 2012

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

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

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

  • значение по умолчанию для env.shell равно /bin/bash -l -c, поэтому использование /bin/rbash -l -c имеет смысл
  • когда для env.shell задана пустая строка, команда не выполняется ни в одной оболочке
  • оболочка - это та, которая заботится о разбиении длинных строк на команды и аргументы, без оболочки вся строка интерпретируется как одна команда, которая не будет найдена в том виде, в котором она происходила
1 голос
/ 12 января 2016

-Проверьте окружение целевой машины с помощью

echo $SHELL

. Гипотетически вы получите это:

/bin/sh

-Тогда в вашем питоне fabfile.py:

from fabric.api import env

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