关于ubuntu:在远程执行python fabric命令之前总是给出命令行

Always given command line before python fabric command is executed on remote

我刚刚开始使用python结构在远程rackspace Ubuntu服务器上运行命令。如果没有需要输入的命令行,我就无法运行命令。这就是我如何重新创建问题的顺序。

使用ssh连接到远程计算机时,使用密钥和无密码没有任何问题。

这是我的fabfile.py

1
2
3
4
5
6
7
from fabric.api import env, run

env.hosts = ['remote.ip.address']
env.user = 'http'

def hello():
    run("touch hello.world")

我用来运行fabfile.py的命令(使用python 2.7virtualenv)

1
$ ~/env/py27/bin/fab -f code/fabfile.py hello

这是一个命令行,显示它总是被卡住,需要我键入exit。

1
2
3
[remote.ip.address] Executing task 'hello'
[remote.ip.address] run: touch hello.world
[remote.ip.address] out: http@server-name:~$

我可以通过键入exit退出远程终端,命令将运行并返回到本地终端。

1
2
3
4
5
6
[remote.ip.address] out: exit
[remote.ip.address] out:

Done.
Disconnecting from remote.ip.address... done.
me@local-computer: $

这是我用来设置ssh密钥以不需要密码的方法。https://kb.mediatemple.net/questions/1626/using+ssh+keys+on+your+server


好吧,我知道了。

我编辑了~/.profile文件以包含"bash"命令,这样bash将成为默认shell。我复制了下面~/.profile文件的旧版本。由于fabric使用/bin/bash领导其所有命令,因此实际上它启动了两个bash提示,只退出了一个。从服务器中删除bash命令后,一切都正常工作。

这是带有额外bash命令的bash文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bash  #REMOVE THIS LINE AND FABRIC WORKS

# if running bash
if [ -n"$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f"$HOME/.bashrc" ]; then
    ."$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d"$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi


有趣的是,我没有这样的问题,您的代码对我来说工作得很好(直到添加了env.key_filenameenv.password)。

1
2
3
4
5
6
c:\work>fab hello
[x.x.x.x] Executing task 'hello'
[x.x.x.x] run: touch hello.world

Done.
Disconnecting from x.x.x.x... done.

我用的是织物1.7.0和Paramiko 1.11.0。可能是服务器上的终端有问题。