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 |
号
有趣的是,我没有这样的问题,您的代码对我来说工作得很好(直到添加了
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。可能是服务器上的终端有问题。