0

自動化された非対話型 Python スクリプトを使用してコンパイルした後、2 つのプログラムをあるサーバーから別のサーバーにコピーする必要があります。このスクリプトは会社のサーバー上の複数のユーザー用であり、キーとパスワードの両方が必要であるため、キーはオプションではありません。パスワードはプログラムに保存されませんが、getpass() を使用してプログラムの開始時に 1 回要求され、ユーザーが scp 呼び出しごとにパスワードを入力する必要がないように両方の SCP 転送に使用されます。私はscpを呼び出すためにos.systemを使用しています:

os.system("/usr/bin/scp %s %s@server:directory" %(prg, uname))
os.system("/usr/bin/scp %s %s@server:directory2" %(prg2, uname))

scp は別のプログラム用に定義されているため、/usr/bin/scp. prg/prg2 はプログラムの場所で、uname はリモート サーバー上のユーザーのユーザー名です。

here で説明されているように、パスワードをパイプしようとしましたが、うまくいきませんでした。

sshpass、expect、paramiko、または fabric をインストールできず、受信サーバーにインストールされていない rsync b/c を使用できません。これを自動化するためにできることはありますか?

AIX 6.1、Python 2.6.2 を実行しています

更新: AIX の python インストール ディレクトリに /config フォルダーがないため、pexpect などの外部ライブラリをインストールできません。それを修正するには、 AIX 用の python-devel をインストールしますが、プログラムをインストールできないため、まだ行き詰っています。

更新 2: FTP を支持して SCP を放棄することにしました。これこれを組み合わせて、FTP スクリプトを作成しました。あなたの答えと私を導くのを手伝ってくれてありがとう。

4

2 に答える 2

2

インストール権限のない純粋な Python でこれを実装する必要があるため、車輪を再発明する必要があり、最悪です。この場合に必要なのは、SSH_ASKPASS抜け穴です。

SSH は、単にパスワードを与えることを本当に望んでいません。結局のところ、それがキーファイルの目的です。ただし、SSH_ASKPASS 環境変数が設定され てい、DISPLAY 環境変数が設定されていて ssh が TTY 内で実行されていない場合、ASKPASS プログラムが実行されます (ASKPASS プログラムが呼び出されたコンテキストから環境変数を保持しながら)。 )。その結果、あなたがそれについて賢いなら、エコープログラムを ASKPASS として設定し、ssh にその方法でやりたいことを強制することができます。

これは、これを行うために使用されたコードのスニペットです。これは完全ではありません (モジュールの途中から持ち上げられています)。base64 を使用して、このパスワードの上にイチジクの葉を配置しました。

def createConnection(self, hostName, username, password):
    """ Because we're setting both stdout and stderr to be pipes, we have
        to worry about one of them clogging - We'll be reading stdout
        constantly through the code, but stderr needs a worker to handle
        it. """

    env = {'SSH_ASKPASS': '/path/to/echo/script',
           'DISPLAY': 'required',
           'ENCODED_PASSWORD': base64.b64encode(password)}
    self.username = username
    self.hostName = hostName
    self.sshProcess = subprocess.Popen(
        ['/usr/bin/ssh', '-T',
         '-o', 'UserKnownHostsFile=/dev/null',
         '-o', 'StrictHostKeyChecking=no',
         '-o', 'NumberOfPasswordPrompts=1',
         '-o', 'ConnectTimeout=10',
         '%s@%s' % (username, hostName),
         '-s', 'xmlagent',
        ],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        env=env,

        #this kicks it out of the controlling tty session
        preexec_fn=os.setsid
    )

    self.sshStderr = ''
    self.errorThread = threading.Thread(target=self.readStderr)
    self.errorThread.daemon = True
    self.errorThread.start()
于 2012-07-27T22:54:58.770 に答える
1

を使用する必要がありますpexpect

使用例 (公開鍵認証または expect(1) を使用せずに SSH を自動化するから):

import pexpect

FILE="/path/to/file"
REMOTE_FILE=""
USER="user"
HOST="example.com"
PASS="mypass"
COMMAND="scp -oPubKeyAuthentication=no %s %s@%s:%s" % (FILE, USER, HOST, REMOTE_FILE)

child = pexpect.spawn(COMMAND)
child.expect('password:')
child.sendline(PASS)
child.expect(pexpect.EOF)
print child.before

また、試すこともできますexpect(そして、からスクリプトを実行しますpython。インストールできない場合は、これが適切な解決策ですpexpect)。

#!/usr/bin/expect -f
set filename [lindex $argv 0]
set timeout -1
spawn scp $filename myusername@192.168.1.123:/home/myusername/
set pass "mypassword"
expect {
         password: {send "$pass\r" ; exp_continue}
         eof exit
}
于 2012-07-27T16:58:49.600 に答える