2015-02-09 188 views

回答

24

当然,有几种方法可以做到这一点!

假设您的raspberry.lan主机上有Raspberry Pi,并且您的用户名是irfan

子流程

这是运行命令的默认Python库。
您可以使其运行ssh并在远程服务器上执行任何您需要的操作。

scrat has it covered in his answer。如果你不想使用任何第三方库,你绝对应该这样做。

您还可以使用pexpect自动输入密码/密码。

的paramiko

paramiko是一个第三方库,增加了SSH协议支持,所以它可以工作像一个SSH客户端。

的示例代码,将连接到服务器,执行和抢ls -l命令的结果看起来就像是:

import paramiko 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect('raspberry.lan', username='irfan', password='my_strong_password') 

stdin, stdout, stderr = client.exec_command('ls -l') 

for line in stdout: 
    print line.strip('\n') 

client.close() 

面料

您也可以使用fabric实现它。
Fabric是一种在远程服务器上执行各种命令的部署工具。

它经常被用来在远程服务器上运行的东西,所以你可以很容易地用一个命令把你的最新版本的Web应用程序,重新启动web服务器和诸如此类的东西。实际上,您可以在多台服务器上运行相同的命令,这非常棒!

尽管它是作为部署和远程管理工具制作的,但您仍然可以使用它来执行基本命令。

# fabfile.py 
from fabric.api import * 

def list_files(): 
    with cd('/'): # change the directory to '/' 
     result = run('ls -l') # run a 'ls -l' command 
     # you can do something with the result here, 
     # though it will still be displayed in fabric itself. 

这就像在远程服务器上键入,cd /ls -l,所以你会得到你的根文件夹的目录列表。

然后在shell中运行:

fab list_files 

它会提示输入服务器地址:

No hosts found. Please specify (single) host string for connection: [email protected] 

快速注意:您还可以分配用户名和主机在fab指令中:

fab list_files -U irfan -H raspberry.lan 

或者您可以将一个主机放入您的fabfile中的env.hosts变量。 Here's how to do it


然后你会被提示输入SSH密码:

[[email protected]] run: ls -l 
[[email protected]] Login password for 'irfan': 

然后在命令将成功运行。从here

[[email protected]] out: total 84 
[[email protected]] out: drwxr-xr-x 2 root root 4096 Feb 9 05:54 bin 
[[email protected]] out: drwxr-xr-x 3 root root 4096 Dec 19 08:19 boot 
... 
+0

如何安装它 – 2015-02-09 14:29:38

+2

@ IrfanGhaffar7您可以使用'pip'或'easy_install'安装第三方Python库。所以它会是'pip安装结构'。检查文档(我链接到面料和paramiko文档),它有快速入门和教程! – 2015-02-09 14:31:20

+0

我的远程机器主机名是'Pi @ 192.168.2.34',密码是'raspberrypi'。当它提示你输入一个主机名时,我怎么在织物 – Fahadkalis 2015-02-09 14:40:15

6

简单的例子:

import subprocess 
import sys 

HOST="www.example.org" 
# Ports are handled in ~/.ssh/config since we use OpenSSH 
COMMAND="uname -a" 

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], 
         shell=False, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
result = ssh.stdout.readlines() 
if result == []: 
    error = ssh.stderr.readlines() 
    print >>sys.stderr, "ERROR: %s" % error 
else: 
    print result 

它做你想要什么:连接通过SSH,执行命令,返回的输出。没有第三方库需要。

+0

当我使用这个命令=“ls -l”,其结果是在一行中,意味着不可读,但它工作 – 2015-02-09 15:57:59

+1

@ IrfanGhaffar7这是因为'结果'是一个列表,而不是串。你可以做'print''.join(result)'而不是使它看起来可读。 – 2015-02-09 16:09:50

+0

谢谢....现在确定 – 2015-02-09 16:35:30

相关问题