1

リモートマシンに実行可能ファイルが存在するかどうかを確認してから、その実行可能ファイルを実行しようとしています。そのために、 subprocess を使用して run を実行ssh <host> ls <file>し、それが成功した場合は run を実行しますssh <host> <file>。もちろん、ssh はパスワードを要求しますが、私はそれを自動的に提供したいと考えています。また、ls からリターンコードを取得し、コマンドを実行して stdout と stderr を取得したいと考えています。

したがってcommunicate()、デッドロックを回避するためにこの方法が必要であることはわかっていますが、パスワードを に認識させることはできませんPopen(stdin)。また、私は Python 2.4.3 を使用しており、そのバージョンにこだわっています。これまでに得たコードは次のとおりです。


import os  
import subprocess as sb  

def WallHost(args):  
    #passwd = getpass.getpass()  
    passwd = "password"  
    for host in args:   

        # ssh to the machine and verify that the script is in /usr/bin   
        sshLsResult = sb.Popen(["ssh", host, "ls", "/usr/bin/wall"], stdin=sb.PIPE, stderr=sb.PIPE, stdout=sb.PIPE)  
        (sshLsStdout, sshLsStderr) = sshLsResult.communicate(input=passwd)  
        sshResult = sshLsResult.returncode  

        if sshResult != 0:                      
            raise "wall is not installed on %s. Please check." % host  
        else:  
            sshWallResult = sb.Popen(["ssh", host, "/usr/bin/wall", "hello world"], stdin=sb.PIPE, stderr=sb.PIPE, stdout=sb.PIPE)  
            (sshWallStdout, sshWallStderr) = sshWallResult.communicate(input=passwd)  
            print "sshStdout for wall is \n%s\nsshStderr is \n\n" % (sshWallStdout, sshWallStderr)  

args = ["127.0.0.1", "192.168.0.1", "10.10.265.1"]  
WallHost(args)  

そのパスワードを受け入れるためのプロセスを取得するための助けをいただければ幸いです。または、実行可能ファイルを確認してリモート ホストで実行するためのより良い方法がある場合。;)

thxアンソニー

4

1 に答える 1

3

authorized_keysを使用するのはどうですか。その後、パスワードを入力する必要はありません。

難しい方法もできます(Linuxでのみ機能します):

import os
import pty

def wall(host, pw):
    pid, fd = pty.fork()
    if pid == 0: # Child
        os.execvp('ssh', ['ssh', host, 'ls', '/usr/bin/wall'])
        os._exit(1) # fail to execv

    # read '..... password:', write password
    os.read(fd, 1024)
    os.write(fd, pw + '\n')

    result = []
    while True:
        try:
            data = os.read(fd, 1024)
        except OSError:
            break
        if not data:
            break
        result.append(data)
    pid, status = os.waitpid(pid, 0)
    return status, ''.join(result)

status, output = wall('localhost', "secret")
print status
print output

http://docs.python.org/2/library/pty.html

于 2013-06-15T05:52:07.070 に答える