最近になってiOSのショートカットがなんとも直感的で気持ちよくないという理由でiOSアプリのPythonista3に課金した。で、普段のルーチンの自動化というより、インフラの現場でのテストツールとして便利じゃん?と思ったので幾つかメモ。
スクレイピング
先行してPythonista3でブラウザで開いているURLのタイトルを取得するを書いたが、Beautiful SoapがExtrasとしてPythonistaに入ってるので、楽にWebコンテンツの確認ができる。
今、見たらRequestsもPythonistaに入ってるので、接続確認ぐらいだったら、こっちが簡単だろう。
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.
と表示され、丸見えになっててしまう。
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から触るようなものじゃないかもしれない。
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から利用できる。
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()