5

私は pexpect を動作させていますが、そこからの出力を印刷する際に問題があります。以下のテスト スクリプトでは、ssh 接続を作成し、sudo su - を送信し、次にパスワードを送信し、sudo アクセスが必要な行を送信します (p.interact() も数回追加しました)。ルートにあることを確認してください)。私が抱えている問題は、実行したコマンドの出力を返すことです。最後に、いくつかのトップ コマンド、いくつかの du -h、およびその他の (はるかに複雑な) スペース コマンドを実行したいと考えています。しかし、現在 p.before を印刷しようとすると、次のようになります。

Traceback (most recent call last):
File "./ssh.py", line 37, in <module>
print p.before()
TypeError: 'str' object is not callable

これが私が作業しているスクリプトです(パスなどを削除するために編集されています)

#!/usr/bin/env python

import pexpect
import struct, fcntl, os, sys, signal

def sigwinch_passthrough (sig, data):
    # Check for buggy platforms (see pexpect.setwinsize()).
    if 'TIOCGWINSZ' in dir(termios):
        TIOCGWINSZ = termios.TIOCGWINSZ
    else:
        TIOCGWINSZ = 1074295912 # assume
    s = struct.pack ("HHHH", 0, 0, 0, 0)
    a = struct.unpack ('HHHH', fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ , s))
    global global_pexpect_instance
    global_pexpect_instance.setwinsize(a[0],a[1])

ssh_newkey = 'Are you sure you want to continue connecting'
p=pexpect.spawn('ssh user@localhost')
i=p.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT],1)
if i==0:
    print "I say yes"
    p.sendline('yes')
    i=p.expect([ssh_newkey,'password:',pexpect.EOF])
if i==1:
    print "I give password",
    p.sendline("mypassword")
elif i==2:
    print "I either got key or connection timeout"
    pass
elif i==3: #timeout
    pass
global global_pexpect_instance
global_pexpect_instance = p
p.sendline("sudo su -")
p.sendline("mypasswd")
p.sendline("mkdir /home/user/test")
print p.before

私はこのリンクから作業しています: http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/

どんな助けでも大歓迎です。

編集:Armin Rigoが以下で指摘したように。p.before() のような関数として p.before を呼び出していました。これは、これを試していた昨日ではなく、今日このエラーが発生した理由を説明しているため、私の愚かな間違いです。スクリプトにその変更を加え、送信されるコマンドを変更した後、p.before を出力すると、出力が返されません。sendline() コマンドから出力を返す他の方法はありますか?

4

3 に答える 3

1

ログファイルを使用してください。そのログファイルはすべての出力をターミナルに保存します。そのサンプルコードを使用してください:-

child = pexpect.spawn("ssh user@localhost")
child.logfile = open("/tmp/mylog", "w")
child.expect(".*assword:")
child.send("guest\r")
child.expect(".*\$ ")
child.sendline("python -V\r")

ログファイルを開き、端末イベントのすべてを確認します

于 2013-04-06T05:51:15.417 に答える
0

sendline の後に完全な出力を取得するには、child.read()を使用します。

例えば

cmd_resp = pexpect.spawnu(cmd)    # for execution of the command
str_to_search = 'Please Enter The Password'
cmd_resp.sendline('yes')       # for sending the input 'yes'
resp = cmd_resp.expect([str_to_search, 'password:', EOF], timeout=30) # fetch the output status
if resp == 1:
   cmd_resp.sendline(password) 
   resp = cmd_resp.expect([str_to_search, 'outputString:', EOF], timeout=30)
   print(cmd_resp.read()) # to fetch the complete output log
于 2016-08-03T06:01:53.607 に答える