Используйте 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"