Edited at

Pythonista3でインフラエンジニアリング5選

最近になってiOSのショートカットがなんとも直感的で気持ちよくないという理由でiOSアプリのPythonista3に課金した。で、普段のルーチンの自動化というより、インフラの現場でのテストツールとして便利じゃん?と思ったので幾つかメモ。


スクレイピング

先行してPythonista3でブラウザで開いているURLのタイトルを取得するを書いたが、Beautiful SoapがExtrasとしてPythonistaに入ってるので、楽にWebコンテンツの確認ができる。

今、見たらRequestsもPythonistaに入ってるので、接続確認ぐらいだったら、こっちが簡単だろう。

http://omz-software.com/pythonista/docs/ios/requests.html

import requests

url = 'http://barcelona.sakura.ne.jp/'
r = requests.get(url)
print(r.text)


paramikoでサーバにSSHで接続

ParamikoもPythonistaで標準で入っている。さくらインターネットの500円プランで試したが、問題なく使える。余談だが、getpass()は入力値が見えなくなる関数のはずだが、Pythonista環境ではWarning: Password input may be echoed.と表示され、丸見えになっててしまう。

http://omz-software.com/pythonista/docs/ios/paramiko.html

import paramiko

from getpass import getpass
import sys, time
password = getpass('password:')

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(
'example.com',22,'username',password
)
_, stdout, stderr = client.exec_command('pwd')
print(stdout.read())
client.close()

paramikoはパスワードではなく公開鍵認証にも対応しているが、こちらはうまくいかなかった。もしPythonista環境で成功した人がいたらコメント欄で教えていただけたら嬉しい。


AWSのインスタンスを操作

PythonistaはStaShという3rd partyを使ってpip installできて、これを使うと色々なライブラリもPythonistaで動かせる。(もちろん動いてくれないライブラリもある)

で、AWSを操作できるboto3も使える。とりあえずインスタンスのstartとstopは動いた。これ以外にもCloudWatch、S3、SES、SQSが操作できるらしいが、主に管理系でPythonista3から触るようなものじゃないかもしれない。

https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

import boto3

instances = ['i-0000']
ec2 = boto3.client('ec2',
aws_access_key_id='xxxx',
aws_secret_access_key='xxxx' ,
region_name='ap-northeast-1'
)
ec2.start_instances(InstanceIds=instances)


shodan

インフラエンジニアといえばPingとか飛ばせれば便利だが、Pythonでもroot権限がないと使えないものはPythonistaでは使えない。そんな場合に、リアルタイムな情報ではないがShodanのAPIを使ってみるという手がある。これもStaShでshodanをインストールすればPythonistaから利用できる。

https://shodan.readthedocs.io/en/latest/tutorial.html

import shodan

import pprint

print('''
example:
net:1.1.1.1/32
raspberry pi
'''
)
query = input()
api = shodan.Shodan('{API KEY}')
result = api.search(query)
for service in result['matches']:
pprint.pprint(service)


メール送信

最後に地味に便利だったのがメール送信。AWSのSESを使ってアラートを外部にメールする設定をしようとしたのだが、確認のためだけにファイアウォールに穴を開けるのも面倒だったのでPythonistaから試したら、さっと動作確認できた。

import smtplib

from email.mime.text import MIMEText

fromaddr = 'test@example.com'
toaddr = 'test@example.com'
msg = MIMEText('Hello')
msg['Subject'] = 'test'
msg['From'] = fromaddr
msg['To'] = toaddr

s = smtplib.SMTP('example.com',587)
s.ehlo()
s.starttls()
s.ehlo()
s.login('user','password')
s.sendmail(fromaddr,toaddr,msg.as_string())
s.quit()