我有以下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'的登录shell是'/ bin / rbash'。
似乎如果我执行带参数的命令,它将被视为一个命令(而没有参数的'ls'可以完美地工作)。
请注意我放了一个空壳,因为否则Fabric会尝试使用'/ bin / bash'而且限制shell不允许这样做。
是否可以在受限制的shell中使用Fabric?
答案 0 :(得分:2)
问题与使用rbash
的事实无关,而与env.shell
的空值无关。要解决该问题,请使用:
env.shell = '/bin/rbash -l -c'
请注意:
env.shell
的默认值为/bin/bash -l -c
,因此使用/bin/rbash -l -c
有意义env.shell
设置为空字符串时,该命令不会通过任何shell执行答案 1 :(得分:2)
在我的环境中,使用受限shell作为Pure数组的一部分,看起来一个选项是将参数shell = False传递给run函数。
答案 2 :(得分:1)
- 使用
检查目标机器的环境echo $SHELL
。假设你得到了这个:
/bin/sh
- 然后在你的python fabfile.py中:
from fabric.api import env
env.shell = "/bin/sh -c"