191

Pythonでファイルをscpする最もpythonicな方法は何ですか? 私が知っている唯一のルートは

os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )

これはハックであり、Linux のようなシステム以外では機能せず、リモート ホストにパスワードなしの SSH が設定されていない限り、パスワード プロンプトを回避するために Pexpect モジュールの助けが必要です。

Twisted のことは知ってconchいますが、低レベルの ssh モジュールを介して自分で scp を実装することは避けたいと思います。

私はparamiko、SSH と SFTP をサポートする Python モジュールを認識しています。ただし、SCP には対応していません。

背景: SFTP をサポートしていないが、SSH/SCP をサポートしているルーターに接続しているため、SFTP はオプションではありません。

編集:これは、SCPまたはSSHを使用してPythonでファイルをリモートサーバーにコピーする方法の複製です? . ただし、その質問は、Python 内からのキーを処理する scp 固有の回答を提供しません。のようなコードを実行する方法を望んでいます

import scp

client = scp.Client(host=host, user=user, keyfile=keyfile)
# or
client = scp.Client(host=host, user=user)
client.use_system_keys()
# or
client = scp.Client(host=host, user=user, password=password)

# and then
client.transfer('/etc/local/filename', '/etc/remote/filename')
4

13 に答える 13

140

Paramikoの Python scp モジュールを試してください。使い方はとても簡単です。次の例を参照してください。

import paramiko
from scp import SCPClient

def createSSHClient(server, port, user, password):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(server, port, user, password)
    return client

ssh = createSSHClient(server, port, user, password)
scp = SCPClient(ssh.get_transport())

scp.get()次にorを呼び出しscp.put()て SCP 操作を行います。

( SCPClient コード)

于 2010-11-26T03:03:37.770 に答える
15

Pexpect (ソース コード)を試すことに興味があるかもしれません。これにより、パスワードの対話型プロンプトを処理できます。

以下は、メイン Web サイトからの使用例 (ftp の場合) の抜粋です。

# This connects to the openbsd ftp site and
# downloads the recursive directory listing.
import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('cd pub')
child.expect('ftp> ')
child.sendline ('get ls-lR.gz')
child.expect('ftp> ')
child.sendline ('bye')
于 2008-10-30T16:18:00.707 に答える
13

率直な答えが見つかりませんでした。この「scp.Client」モジュールは存在しません。代わりに、これは私に合っています:

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('example.com')

with SCPClient(ssh.get_transport()) as scp:
   scp.put('test.txt', 'test2.txt')
   scp.get('test2.txt')
于 2016-07-24T20:14:37.957 に答える
11

paramikoもチェックできます。(まだ) scp モジュールはありませんが、sftp を完全にサポートしています。

[編集] 申し訳ありませんが、paramiko について言及した行を見逃しました。次のモジュールは、単に paramiko の scp プロトコルを実装したものです。paramiko または conch (私が知っている Python 用の唯一の ssh 実装) を使用したくない場合は、パイプを使用して通常の ssh セッションで実行するようにこれを作り直すことができます。

paramiko の scp.py

于 2008-10-30T20:22:43.570 に答える
8

win32にパテをインストールすると、pscp(パテscp)が得られます。

したがって、win32でもos.systemハックを使用できます。

(そして、キー管理にパテエージェントを使用できます)


申し訳ありませんが、これは単なるハックです(ただし、Pythonクラスでラップすることもできます)

于 2008-10-30T14:42:42.257 に答える
5

fabric.transferを見てください。

from fabric import Connection

with Connection(host="hostname", 
                user="admin", 
                connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"}
               ) as c:
    c.get('/foo/bar/file.txt', '/tmp/')
于 2011-11-23T19:30:26.523 に答える
4

この質問が出されてからかなり時間が経ちましたが、その間に、これを処理できる別のライブラリが登場しました。Plumbumライブラリに含まれているコピー機能を使用できます。

import plumbum
r = plumbum.machines.SshMachine("example.net")
   # this will use your ssh config as `ssh` from shell
   # depending on your config, you might also need additional
   # params, eg: `user="username", keyfile=".ssh/some_key"`
fro = plumbum.local.path("some_file")
to = r.path("/path/to/destination/")
plumbum.path.utils.copy(fro, to)
于 2014-07-05T14:08:32.797 に答える
2

*nix を使用している場合は、sshpassを使用できます

sshpass -p password scp -o User=username -o StrictHostKeyChecking=no src dst:/path
于 2014-06-04T23:26:21.943 に答える
1

うーん、おそらく別のオプションは、 sshfsのようなものを使用することです(Mac 用のsshfsもあります)。ルーターがマウントされたら、ファイルを完全にコピーできます。それが特定のアプリケーションで機能するかどうかはわかりませんが、手元に置いておくと便利なソリューションです。

于 2008-10-30T16:20:46.850 に答える
1

私は少し前に、paramiko に依存する python SCP コピー スクリプトをまとめました。パスワード認証へのフォールバックを使用して、秘密鍵または SSH キー エージェントとの接続を処理するコードが含まれています。

http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-paramiko/

于 2012-05-21T13:03:59.717 に答える