0

これが私がする必要があることです:

ネットワーク経由でファイルをコピーする必要があります。コピーするファイルは 1 台のマシンにあり、リモート マシンに送信する必要があります。自動化する必要があり、python を使用して作成する必要があります。私はpythonのos.popenとsubprocess.Popenに精通しています。これを使用してファイルをコピーすることもできますが、問題は、ワンライナー コマンド (以下に示すような) を実行した後のことです。

scp xxx@localhost:file1.txt yyy@]192.168.104.XXX:file2.txt

それは間違いなく次のようなものを求めます

本当に接続しますか (はい/いいえ)?

パスワード:

そして、間違っていなければ、このコマンドを送信したら(これをPythonでコーディングすると仮定します)

conn.modules.os.popen("scp xxx@localhost:file1.txt yyy@]192.168.104.XXX:file2.txt")

そして、このコマンドが続きます

conn.modules.os.popen("はい")

端末に手動で入力した場合の出力と比較すると、出力(エラーが発生することは間違いありません)は異なります。

これをPythonでコーディングする方法を知っていますか?または、私の問題を解決する何か(コマンドなど)を教えていただけますか

注: RPyC を使用して他のリモート マシンに接続しており、すべてのマシンが CentOS 上で実行されています。

4

3 に答える 3

2

Python 経由で行う正しい方法はfabric、上記のコメントで述べたように実際に使用することです。

というファイルを作成します。fabfile.py

#!/usr/bin/python

from fabric.api import run, env, sudo, put

env.user = 'user'
env.hosts = ['xxxxx.org',]

def copy():
    put('wong_8066.zip', '/home1/user/wong_8066.zip')

次に、ローカル マシンで実行するfab copyと、パスワードの入力を求めるプロンプトが表示されます。

yeukhon@yeukhon-P5E-VM-DO:~$ fab copy
[xxxxxx.org] Executing task 'copy'
[xxxxxx.org] Login password: 
[xxxxxx.org] put: wong_8066.zip -> /home1/user/wong_8066.zip

Done.

布でできることはもっとたくさんあります。展開にはファブリックが使用されます。ファブリックを使用して、ローカルで実行したり、複数のホストに対してリモートで実行したりできます。実行中に多くのオプションを渡すことができます。

を使用せずにこれを自動化したい場合password promptは、ドキュメントに記載されているように ssh キーへのパスを指定できます。

fab は Python の optparse ライブラリを使用します。これは、典型的な Linux または GNU スタイルの短いオプションと長いオプションを尊重し、オプションと引数を自由に組み合わせることを意味します。たとえば、fab task1 -H hostname task2 -i path/to/keyfile は、より単純な fab -H hostname -i path/to/keyfile task1 task2 と同様に有効です。

于 2012-09-27T03:53:22.920 に答える
0

私の経験によると、初めてsftpを使用すると、ユーザーは次のようなホスト公開鍵を受け入れるように求められます。

The authenticity of host 'xxxx' can't be established. RSA key fingerprint is xxxx. Are you sure you want to continue connecting (yes/no)? yesを入力すると、公開鍵は〜/ .ssh / known_hostsに保存され、次回はそのようなプロンプト/アラートは表示されません。

バッチスクリプトでこのプロンプト/アラートを回避するには、turn strict host checkoffuseを使用できます。

scp -Bqpo StrictHostKeyChecking = no

しかし、あなたは中間者攻撃に対して脆弱です。

バッチスクリプトを展開する前に、ターゲットサーバーに手動で接続し、ホストの公開鍵を保存することもできます。

于 2012-09-27T03:39:29.553 に答える
0

この質問は、あなたがやろうとしていることをカバーしているようです。

shutil.copyfile()OS レベルのコピー ユーティリティを使用するために使用します。

リンクをクリックしたくない場合は、次のリンクをクリックしてください。

import shutil
source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
file_name = "\\myfile.txt"

shutil.copyfile(source_path + file_name, dest_path + file_name)
于 2012-09-27T03:27:54.267 に答える