使用Fabric在受限shell中执行命令

时间:2012-02-07 17:47:25

标签: python fabric

我有以下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?

3 个答案:

答案 0 :(得分:2)

问题与使用rbash的事实无关,而与env.shell的空值无关。要解决该问题,请使用:

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

请注意:

  • env.shell的默认值为/bin/bash -l -c,因此使用/bin/rbash -l -c有意义
  • env.shell设置为空字符串时,该命令不会通过任何shell执行
  • shell是负责将长字符串拆分为命令和参数的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"