2016-04-21 39 views
1

所以基本上我有这个远程计算机与一堆文件。 我想运行unix命令(如ls或cat)并在本地接收它们。如何通过网络使用python传递Unix命令

目前我已通过python的套接字连接(我知道远程计算机的IP地址)。但是这样做:

data = None 
message = "ls\n" 
sock.send(message) 
while not data: 
    data = sock.recv(1024) <- stalls here forever 
    ... 

没有给我任何东西。

+0

您是否正在尝试创建SSH克隆? –

+0

是否在发送ls命令之前在另一端打开了一些shell?有人在另一边听吗? – Srgrn

+0

@EhteshChoudhury基本上是。 Srgrn:有人在倾听。我能够在此代码块之前登录。 – dcheng

回答

1

这里有一个很棒的Python库。它叫做Paramiko:http://www.paramiko.org/

Paramiko是一个SSH客户端,它允许您在运行sshd(包含大量标准服务器)的远程计算机上调用程序。

+0

有没有什么内建的东西可以完成这个壮举? 我不想在库中加载运行ls和cat的东西(我不需要复杂的东西)。 – dcheng

+0

Python中没有内置任何内容。帕拉米科是一个应用广泛的图书馆;当它是专门用于完成手头任务时使用它不应该引起争议。如果你仍然拒绝使用它,你可以尝试'subprocess.check_call('ssh hostname ls')'这是一个糟糕的解决方案,但是使用内置的东西。 –

1

您可以使用Python的subprocess模块来完成您的任务。它是一个内置模块,没有太多依赖性。

对于你的问题,我会建议Popen方法,该方法在远程计算机上运行命令并将结果返回给你的机器。

out = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    t = out.stdout.read() + out.stderr.read() 
    socket.send(t) 

其中cmd是您要执行的命令。

这会将命令的结果返回到您的屏幕。 希望有帮助!

+0

我无法得到这个工作... – dcheng

+0

@dcheng你得到了什么erorr? –

+0

我把ls放在cmd中,但似乎试图找到本地计算机的文件夹,然后将结果发送到另一端。 (我收到了一些非常奇怪的错误,如找不到文件)。 – dcheng

0

这就是我为你的情况所做的。

在终端1中,我设置使用ncat通过套接字的远程外壳,nc变体:

$ ncat -l -v 50007 -e /bin/bash 

在终端2中,我连接到插座与此Python代码:

$ cat python-pass-unix-commands-socket.py 

import socket 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect(('', 50007)) 

sock.send('ls\n') 
data = sock.recv(1024) 
print data 
sock.close() 

$ python pass-unix-commands-socket.py 

这是输出I在终端1获得运行命令后:

Ncat: Version 6.40 (http://nmap.org/ncat) 
Ncat: Listening on :::50007 
Ncat: Listening on 0.0.0.0:50007 
Ncat: Connection from 127.0.0.1. 
Ncat: Connection from 127.0.0.1:39507. 
$ 

而在终端2中:

$ python pass-unix-commands-socket.py 
alternating-characters.in 
alternating-characters.rkt 
angry-children.in 
angry-children.rkt 
angry-professor.in 
angry-professor.rkt 
$