

当方python,linux初心者です。pexpectを利用してsshで多重接続したいのですが、うまくいきません。

実施したい手順は以下の通りです。  
1.A端末からB端末へSSH接続  
2.B端末からA端末へSSH接続  
3.2のSSH接続を切断  
4.1のSSH接続を切断

A端末(mac python3.5.1 pexpect4.2.1)  
B端末(ubuntu python3.5.1+ pexpect4.2.1)

以下コードです。  
a_method1.py

[code]

    import pexpect
    def a_method1():
        p = pexpect.spawn('ssh b_ip_addr')
        p.expect('ssword:*')
        p.sendline('passwd')
        p.sendline('python3 /b_path/b_method.py')
        p.sendline('exit')
        p.interact()
    if __name__ == '__main__':
        a_method1()
    
[/code]

b_method.py

[code]

    import pexpect
    def b_method():
        p = pexpect.spawn('ssh a_ip_addr')
        p.expect('ssword:*')
        p.sendline(passwd)
        p.sendline('python3 /a_path/a_method2.py')
        p.sendline('exit')
        p.interact()
    if __name__ == '__main__':
        b_method()
    
[/code]

a_method2.py

[code]

    def a_method2():
        pass
    if __name__ == '__main__':
        a_method2()
    
[/code]

結果は以下の通りです。

[code]

    $ python3 a_method.py
    
    python3 /b_path/b_method.py
    exit
    python3 /b_path/b_method.py
    exit
    Welcome to Ubuntu情報
    
     * Documentation:  https://help.ubuntu.com/
    
    999 packages can be updated.
    999 updates are security updates.
    
    Last login: from a_ip_addr
    B端末:~$ python3 /b_path/b_method.py
    B端末:~$ exit
    ログアウト
    Connection to b_ip_addr closed.
    A端末:~a_user$
    
[/code]

以上です、よろしくお願い致します。


CC BY-SA 3.0
2017-02-22T21:51:40.300
32881
2020-07-18T11:02:30.253
2017-02-23T00:18:39.853
20781
20781
question
python linux
pexpectによるSSH多重接続方法について


当てずっぽうですが、ログインプロンプトを待たずに `p.sendline`
でコマンドを送信してるからではないでしょうか。`p.sendline`の前にプロンプトを待つ `p.expect` 文を追加してみてください。

例： ※Expectのパターンは環境にあわせて変えてください。

[code]

    import pexpect
    def a_method1():
        p = pexpect.spawn('ssh b_ip_addr')
        p.expect('ssword:*')
        p.sendline('passwd')
        p.expect('$')               <-プロンプトを待つ
        p.sendline('python3 /b_path/b_method.py')
        p.expect('$')               <-プロンプトを待つ
        p.sendline('exit')
        p.interact()
    if __name__ == '__main__':
        a_method1()
    
[/code]


CC BY-SA 3.0
2017-02-24T12:18:46.307
32925
2017-02-24T12:18:46.307
5008
32881
answer