2

有人请帮忙!

我目前正在编写一个 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

4 回答 4

3

使用 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)
于 2013-05-21T05:51:13.780 回答
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()

也检查一下 -如何获取远程文件的大小?使用 Paramiko 进行 SSH 编程

于 2013-05-21T04:38:04.860 回答
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)

外壳命令:

~ $ fab get_size:"~/.bashrc"
于 2013-05-21T05:11:22.187 回答
0
statinfo1 = os.stat(A)
statinfo2 = os.system ("ssh" " root@192.168.10.1" " stat -c%s "+B)

os.stat返回什么

  • 具有多个字段的数据结构,其中之一是大小。

os.system返回什么

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

所以他们之间的比较注定会失败。像@Srikar 建议的那样考虑 Paramiko,或者用这种方法解决问题。

对于后者,试试这个:

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
于 2013-05-21T04:46:22.357 回答