使用python,SSH检查远程服务器中的文件大小

时间:2013-05-21 04:30:34

标签: python ssh

有人请帮忙!

我正在编写一个python脚本来实际检索本地PC和远程服务器中的文件大小。然后,我做的是,我比较文件的大小是否相同。下面是我的代码:

A = "/path/of/the/file/in/my/local/PC"
B = "/path/of/the/file/in/remote/PC"

statinfo1 = os.stat(A)
statinfo2 = os.system ("ssh" " root@192.168.10.1" " stat -c%s "+B)

if statinfo1 == statinfo2 :
   print 'awesome'
else :
   break
遇到的问题:statinfo1能够在本地PC中返回文件大小,但statinfo2无法返回文件大小..有谁请帮忙?我想使用SSH方法

4 个答案:

答案 0 :(得分:2)

为什么不使用Paramiko SSHClient。它是一个漂亮的第三方库,简化了ssh访问。

因此,为了检查远程文件的文件大小,代码将类似于 -

import paramiko, base64

B = "/path/of/the/file/in/remote/PC"

key    = paramiko.RSAKey(data=base64.decodestring('AAA...'))
client = paramiko.SSHClient()
client.get_host_keys().add('ssh.example.com', 'ssh-rsa', key)
client.connect('192.168.10.1', username='root', password='yourpassword')
stdin, stdout, stderr = client.exec_command("stat -c " + B)
for line in stdout:
    print '... ' + line.strip('\n')
client.close()

检查一下 - How to get size of remote file?SSH programming with Paramiko

答案 1 :(得分:2)

使用paramiko或pexpect可以工作,但对于你的简单用例可能有点重量级。

您可以使用轻量级解决方案,该解决方案仅依赖于基础操作系统的ssh和python内置subprocess模块。

import os
A = "/path/of/the/file/in/my/local/PC"
B = "/path/of/the/file/in/remote/PC"

# I assume you have stat visible in PATH on both the local and remote machine,
# and that you have no password nags for ssh because you've setup the key pairs 
# already (using, for example, ssh-copy-id)

statinfo1 = subprocess.check_output('stat -c%s "{}"'.format(A), shell=True)
statinfo2 = subprocess.check_output('ssh root@192.168.10.1 stat -c%s "{}"'.format(B), shell=True)

答案 2 :(得分:1)

您还可以查看fabric以获得简单的远程任务。

fabfile.py:

1 from fabric.api import run, env
2
3 env.hosts = ['user@host.com']
4
5 def get_size(remote_filename):
6     output = run('stat -c \'%s\' {0}'.format(remote_filename))
7     print 'size={0}'.format(output)

Shell命令:

~ $ fab get_size:"~/.bashrc"

答案 3 :(得分:0)

statinfo1 = os.stat(A)
statinfo2 = os.system ("ssh" " root@192.168.10.1" " stat -c%s "+B)

What does os.stat return

  • 包含多个字段的数据结构,其中一个是大小。

what does os.system return

  • 它返回一个int,表示所调用程序的退出代码。

因此他们之间的比较必将失败。考虑Paramiko为@Srikar建议,或解决这种方法的问题。

对于后者,试试这个:

import commands

statinfo1 = os.stat(A).st_size
cmd = "ssh" " root@192.168.10.1" " stat -c%s "+B
rc, remote_stat = commands.getstatusoutput(cmd)

if rc != 0:
   raise Exception('remote stat failure: ' + remote_stat)

statinfo2 = int(remote_stat)

if statinfo1 == statinfo2 :
   print 'awesome'
else :
   break