0

次のように、インタラクティブな ssh 呼び出しを自動化しようとしています (注 1 を参照)。

SSHBINARY = '/usr/bin/ssh'
ASKPASS   = '/home/mz0/checkHost/askpass.py'

def sshcmd(host,port,user,password,cmd):
    env0 = {'SSH_ASKPASS': ASKPASS, 'DISPLAY':':9999'}
    ssh = subprocess.Popen([SSHBINARY,"-T","-p %d" % port,
        "-oStrictHostKeyChecking=no", "-oUserKnownHostsFile=/dev/null", 
        "%s@%s" % (user,host), cmd],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    env=env0,
    preexec_fn=os.setsid
    )
    error = ssh.stderr.readlines()
    result = ssh.stdout.readlines()
    return error,result

host = 'localhost'
port = 22
user = 'try1'
password = '1try' # unused, hardcoded in ASKPASS
cmd = 'ls'

result1, error1 = sshcmd(host,port,user,password,cmd)
if result1 : print "OUT: %s" % result1
if error1  : print "ERR: %s" % error1

これを取得してから、私は何か愚かなことをしています:

OUT: ["Warning: Permanently added 'localhost' (RSA) to the list of known hosts.\r\n"]
ERR: ['['Desktop\n', ..., 'Videos\n']']

明らかに、stdout と stderr が入れ替わっています (注 2)。私の間違いを指摘していただけますか?

注1:私はパスワードのないssh、ホストキーなどを無視する危険性をよく知っており、対話型sshの自動化に関する要求をあなたと同じくらい嫌っています。

注2:シェルで同じコマンドを実行すると、コードでstdoutとstderrが交換されていることが確認されます

ssh -o 'UserKnownHostsFile /dev/null' -o 'StrictHostKeyChecking no' \
try1@localhost ls > ssh-out 2> ssh-error
4

1 に答える 1

2
return error,result

result1, error1 = sshcmd(...)

どちらかを交換するだけです。

于 2013-07-30T16:07:23.583 に答える