1

こんにちは私はpythonの初心者です。

現在、popen() メソッドを使用して ssh シェルのデタッチを開発しています。

"Start a shell process for running commands"
     if self.shell:
         error( "%s: shell is already running" )
         return
      cmd = [ './sshconn.py' ]
      self.shell = Popen( cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
            close_fds=True )

      self.stdin = self.shell.stdin
      self.stdout = self.shell.stdout
      self.pid = self.shell.pid
      self.pollOut = select.poll()
      self.pollOut.register( self.stdout )

そして、この方法は paramiko の demo の interactive.py コードをコマンドとして使用します。

#!/usr/bin/python

import sys
import paramiko
import select
import termios
import tty

def main():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('host', username='user', password='secret')

    tran = ssh.get_transport()
    chan = tran.open_session()

    chan.get_pty()
    chan.invoke_shell()

    oldtty = termios.tcgetattr(sys.stdin)
    try:
            while True:
                    r, w, e = select.select([chan, sys.stdin], [], [])
                    if chan in r:
                            try:
                                    x = chan.recv(1024)
                                    if len(x) == 0:
                                            print '\r\n*** EOF\r\n',
                                            break
                                    sys.stdout.write(x)
                                    sys.stdout.flush()
                            except socket.timeout:
                                    pass
                    if sys.stdin in r:
                            x = sys.stdin.read(1)
                            if len(x) == 0:
                                    break
                            chan.send(x)
    finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)

if __name__ == '__main__':
    main()

問題は、popen() が実行されると、Traceback (最新の呼び出しが最後) を返すことです。

File "./sshconn.py", line 43, in <module>
    main()
File "./sshconn.py", line 20, in main
    oldtty = termios.tcgetattr(sys.stdin)
    termios.error: (22, 'Invalid argument')

どうすればこれを解決できますか?

4

1 に答える 1

0

sys.stdin可能性のある説明は、TTYに接続されていないことだと思います(それPIPEはあなたのようPopenです)。

インタラクティブなシェルが必要な場合は、それを操作する必要があります。非対話型シェルが必要な場合の理想的な解決策は、リモート プログラムを呼び出して、成功または失敗のエラー コードが返されるのを待つことです。paramiko代わりに単に toを使用してみてくださいexec_command()。はるかに簡単です。

于 2012-10-27T19:36:37.357 に答える