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

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

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" без параметров работает отлично).

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

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

3 ответа

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

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

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

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

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

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

echo $SHELL

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

/bin/sh

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

from fabric.api import env

env.shell = "/bin/sh -c"
Другие вопросы по тегам