我正在编写一个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方法
答案 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)
os.stat
return?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