QA@IT
«質問へ戻る

質問を投稿

Paramiko で passwd コマンドを実行したい

Python でサーバー管理スクリプトを書いています。

やりたい事:

  • SSH で該当サーバーに接続
  • SSH 経由で passwd のようなインタラクティブコマンドを処理 (expect のような事がしたい)

ライブラリは paramiko を選びました。以下のようなコードを調べつつ書いてみたのですが、タイムアウトしてしまいます。問題点を指摘して頂けると嬉しいです。

#!/usr/bin/env python

import time
import paramiko

class InteractiveCommand(object):

    def __init__(self, host, port, user, password):
        self.transport = paramiko.Transport((host, port))
        self.transport.connect(username=user, password=password)
        self.channel = self.transport.open_session()

    def run(self, command):
        out = ''
        self.channel.setblocking(0)
        self.channel.invoke_shell()
        self.channel.send(command + '\n')
        t_check = 0

        while not self.channel.recv_ready():
            time.sleep(5)
            t_check += 1

            if 3 < t_check:
                print 'time out!'
                return False

        out = self.channel.recv(1024)
        return out

if __name__ == u'__main__':
    shell = InteractiveCommand('exmaple.com', 22, 'user', 'password')
    shell.run('passwd user')

実行結果は以下のようになります:

$ python ./test.py
time out!

paramiko を使用したインタラクティブ処理の実装例など参考になるサイトなど教えて頂けるのでも構いません。

どうぞよろしくお願いします。

Python でサーバー管理スクリプトを書いています。

やりたい事:  

* SSH で該当サーバーに接続
* SSH 経由で `passwd` のようなインタラクティブコマンドを処理 (`expect` のような事がしたい)

ライブラリは `paramiko` を選びました。以下のようなコードを調べつつ書いてみたのですが、タイムアウトしてしまいます。問題点を指摘して頂けると嬉しいです。

    #!/usr/bin/env python

    import time
    import paramiko

    class InteractiveCommand(object):

        def __init__(self, host, port, user, password):
            self.transport = paramiko.Transport((host, port))
            self.transport.connect(username=user, password=password)
            self.channel = self.transport.open_session()

        def run(self, command):
            out = ''
            self.channel.setblocking(0)
            self.channel.invoke_shell()
            self.channel.send(command + '\n')
            t_check = 0

            while not self.channel.recv_ready():
                time.sleep(5)
                t_check += 1

                if 3 < t_check:
                    print 'time out!'
                    return False

            out = self.channel.recv(1024)
            return out

    if __name__ == u'__main__':
        shell = InteractiveCommand('exmaple.com', 22, 'user', 'password')
        shell.run('passwd user')

実行結果は以下のようになります:

    $ python ./test.py
    time out!

`paramiko` を使用したインタラクティブ処理の実装例など参考になるサイトなど教えて頂けるのでも構いません。

どうぞよろしくお願いします。