memo

2011-01-07

paramiko の使い方

たまに触るとすっかり忘れてたりするから、最低限の使い方をメモっとこうシリーズ。

import os
import sys
import time

import paramiko

username = os.getlogin()
host = 'localhost'
port = 22

# connect to ssh-agent and get keys from agent
agent = paramiko.Agent()
keys = agent.get_keys()

# open RSA private key if exists
rsa_key_path = os.path.expanduser('~/.ssh/id_rsa')
if os.path.exists(rsa_key_path):
    try:
        rsa_key = paramiko.RSAKey(filename=rsa_key_path)
        keys.append(rsa_key)

    except paramiko.PasswordRequiredException:
        import getpass
        password = getpass.getpass('private key password: ')

        rsa_key = paramiko.RSAKey(filename=rsa_key_path, password=password)
        keys.append(rsa_key)

# create SSH transport and connect server
transport = paramiko.Transport((host, port))
transport.connect()

# authentication
for key in keys:
    try:
        # publick key authentication
        transport.auth_publickey(username, key)
        break

    except paramiko.AuthenticationException:
        pass

else:
    import getpass
    password = getpass.getpass('password: ')

    # password authentication
    transport.connect(username=username, password=password)

if not transport.is_authenticated():
    print >> sys.stderr, 'authentication error'
    sys.exit(1)

transport.set_keepalive(60)

while True:
    # create 'session' channel
    channel = transport.open_session()

    # execute command and recv output
    channel.exec_command('uptime')
    while not channel.closed:
        sys.stdout.write(channel.recv(1024))

    time.sleep(5)