2

誰か助けてください!

現在、ローカル PC とリモート サーバーにあるファイル サイズを実際に取得するための Python スクリプトを作成しています。次に、ファイルのサイズが同じかどうかを比較します。以下は私のコードです:

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基盤となる OS と 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

また、簡単なリモート タスクのためにファブリックを検討することもできます。

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返しますか?

  • いくつかのフィールドを持つデータ構造で、そのうちの 1 つはサイズです。

何を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 に答える