bash使用時のシングルクォーテーションとダブルクォーテーションの違いについて

今日の業務中にRESTコマンドを叩くBashスクリプトを書いていた際に、少し手間取った箇所があったので戒めとして残します。
まぁ簡潔に言えば、Bashスクリプト内の「"」と「'」の動作の違いを知らなかったと言うお話です。

分かりやすい様にサンプルコードを用意してみました。

localuser$ cat test.sh 
test="pwd"
echo "$test"
echo '$test'
echo `$test`
localuser$ sh test.sh 
pwd
$test
/Users/
localuser$ 

変数testをechoで画面出力する方法として、変数testを「"」「'」「`」の3種類で囲い実行してみた結果です。
結果は見ての通り、「"」は変数の中身を出力、「’」は文字列として出力、最後の「`」は変数の中身をコマンドとして実行しています。
とても勉強になりました。これでもう間違えない!

QFX5100から設定コンフィグを自動取得する方法

常日頃の業務でNW機器の設定を行なっているとちょっとした作業を自動化できれば業務の負担が減るのになぁ。。。と思い始めて早1ヶ月
今回はNW機器から自動で設定コンフィグを取得するPythonスクリプトを作ってみたのでその辺のメモ書きを残します!

NWの自動化なんてググればすぐ見つかる情報なのでまずはググってみた。
こちらの記事はとてもわかりやすく丁寧な内容だった為、参考にさせていただきます。
qiita.com

参考記事によると、NETCONFなるものを使ってNW機器の情報を取得するようですね。。

NETCONFとは

マルチベンダーに対応しており、NW機器の情報を取得するプロトコルだそうです。
主要どころのベンダーだとCisco、Juniper、Arista、Brocadeが対応しているそうです。

NETCONFを使ったスクリプトコード

検証端末PCがWindowsなのでコンフィグファイルを保存するパスがWindows仕様になっています。
またPythonのバージョンは3.6.5でWindows OSは7です。

from ncclient import manager

username = 'admin'
password = 'admin'
ipv4 = '192.168.2.x'
port = 22

connection = manager.connect(host = ipv4, port = port, username = username, password = password, timeout = 20, device_params={'name':'junos'}, hostkey_verify=False )

print('1. run show command')
print('='*40)

config=str(connection.command('show configuration',format="text"))
print('='*40)
config2=str(connection.command('show configuration | display set',format="text"))


file="C:\\Users\\Desktop\\log.txt"
with open(file,"a")as f:
    f.write(config)
    f.write(config2)

たったこれだけの行数で見事に設定情報を取得する事ができました!
これでわざわざSSHしてコマンドを打つ手間が省けますね。

と言う訳でここまで駆け足で過ぎて行きましたが、詳細については参考にさせて頂いた記事をご覧になってください。

2019/05/26 更新

業務で複数台のQFXのコンフィグを取得する為に書いたコードです。
基本的に最初のコードをベースにして書いています。
ポイントとしては、コンフィグを取得したい機器のIPアドレスを別のテキストファイルに用意し
そこから読み込ませるようにしています。

それから機器に接続出来なかった場合のエラーハンドリングもtry exeptで実装してあります。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import datetime
import traceback
from ncclient import manager

def net_conf_qfx(DUT_ipaddress):
 username = '***'
 password = '***'
 ipv4 = DUT_ipaddress
 port = 22
 
 now = datetime.datetime.now()
 try:
     connection = manager.connect(host = ipv4, port = port, username = username, password = password, timeout = 20, device_params={'name':'junos'}, hostkey_verify=False )
     config=str(connection.command('show configuration',format="yaml"))
     config2=str(connection.command('show configuration | display set',format="text"))
     file="C:\\Users\\*****\\Desktop\\python\\netconf\\netconf_QFX\\config_log\\{0:%Y%m%d%H%M}_{1}.txt".format(now,ipv4)
     with open(file,"a") as f:
         f.write(config)
         f.write(config2)
 except:
     file="C:\\Users\\*****\\Desktop\\python\\netconf\\netconf_QFX\\config_log\\{0:%Y%m%d%H%M}_{1}_SSHError.txt".format(now,ipv4)
     with open(file, 'a') as f:
        traceback.print_exc(file=f)

file="C:\\Users\\*****\\Desktop\\python\\netconf\\netconf_QFX\\qfx_list.txt"
with open(file,"r") as address_list:
    address = address_list.readlines()
for list in address:
net_conf_qfx(list.rstrip('\n'))

Cisco Nexus 9Kに公開鍵認証を使ってログインする方法

業務でCisco Nexusに公開鍵認証を使ってSSHログインする事があったので
その時の手順を残します。

ログイン元サーバにて秘密鍵と公開鍵の生成を行う

今回は自分のmac bookからログインするのでターミナルを起動して
下記コマンドにて秘密鍵と公開鍵の生成を行った。

MacBook-pro:~ localhost$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/localhost/.ssh/id_rsa): 
Created directory '/Users/localhost/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/localhost/.ssh/id_rsa.
Your public key has been saved in /Users/localhost/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tYBWM80VZu2yXdGnodiFH/vZJkH64mmd16D5MNKLvKY localhost@MacBook-pro.local
The key's randomart image is:
+---[RSA 2048]----+
|        +o .=+  .|
|       o ooo. *.o|
|      o . .o B =o|
|     .   o..= * .|
|        S .  = +o|
|           .o =.+|
|          ..+* =.|
|         ..o*+o o|
|        Eo+o.... |
+----[SHA256]-----+
MacBook-pro:~ localhost$ 

すると下記ディレクトリに二つのファイルが出来ている。

MacBook-pro:~ localhost$ ls /Users/localhost/.ssh/
id_rsa		id_rsa.pub

id_rsa秘密鍵でid_rsa.pubが公開鍵だ。
生成された公開鍵をcatコマンドで確認する。
※2048obit長で生成しているので鍵の長さを省略している。

MacBook-pro:~ localhost$ cat /Users/localhost/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAAD (省略) b4whh91xnL kyamisama@kyamisamanoMacBook-puro.local

Nexusで公開鍵の登録を行う

最後にNexus側で公開鍵の登録を行って完了だ。
ここで登録するユーザを間違えないように注意する。
実際にNexusのadminユーザに公開鍵を登録してみる。

Nexus(config)# username admin sshkey ssh-rsa AAAAB3NzaC1yc2EAAAAD (省略) b4whh91xnL kyamisama@kyamisamanoMacBook-puro.local
Nexus(config)#

以上で作業完了である。
下記SSHコマンドの通りオプション-iを付け、その後ろに秘密鍵を指定すれば
問題なくログインできるはずだ。

ssh -i /Users/localhost/.ssh/id_rsa admin@192.168.2.100

tornadoでHTTPSのウェブページを作ってみた。

かなり久しぶりの更新です。。
サボり気味だったので一応生存確認と言う事で今回もtornadoの記事です。
せっかくtornadoを使ってWebページを公開するところまでやったので
最低限のHTTPSの実装もやってみました。

以下その時の覚書です。

事前準備

オレオレ証明書の作成

HTTPSの実装で必要不可欠である証明書の類のものを準備します。
準備はとっても簡単、下記コマンドを打つだけでOK。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

tornadoスクリプトHTTPS仕様にする

tornadoの公式に落ちているコードをHTTPS仕様にしてみました。
※一部抜粋

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        <b>"certfile":"server.crt"</b>,
        <b>"keyfile":"server.key"</b>,
    })
    http_server.listen(<b>8443</b>)

import tornado.httpserver
import tornado.ioloop
import tornado.web
全体のコード
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("../static/test.html")

make_app=tornado.web.Application([
        (r"/", MainHandler),])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        "certfile":"server.crt",
        "keyfile":"server.key",
    })

    http_server.listen(8443)
tornado.ioloop.IOLoop.current().start()

以上でtornadoでのHTTPS実装でした。

SSHの公開鍵認証の設定手順

個人的にLinuxサーバを利用する機会があり
その時に公開鍵の設定を行ったので手順を残す。

各種環境

クライアントPC:Mac book air
サーバ:Conoha VPS Ubuntu 14.04.5

クライアント側で鍵の生成

クライアントPCで秘密鍵と公開鍵の生成を行います。
鍵生成コマンドを2種類ありますが今回はRSAで生成を行います。

$ ssh-keygen -t rsa

実行すると対話式で鍵の保存場所やパスフレーズを聞かれますので
任意の設定を行う。

問題なく鍵が生成されたか確認を行う。

$ cd ~/.ssh/
$ ls id*
id_rsa		id_rsa.pub

上記のように「id_rsa」と「id_rsa.pub」が生成されていればOK
ちなみに「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵である。
くれぐれも秘密鍵が外部に漏れないように注意してほしい。

サーバに公開鍵を登録する。

先ほど生成した公開鍵をサーバに登録するので
scpコマンドでサーバに公開鍵を転送させる。

scp -r ~/.ssh/id_rsa.pub root@<サーバのIPアドレス>:/root/

とりあえずサーバの/root/直下に転送。
そこからサーバの「authorized_keys」に公開鍵を登録する。

# ls /root/
id_rsa.pub
# cat id_rsa.pub >> ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# logout
$ ssh -i ~/.ssh/id_rsa root@<サーバのIPアドレス>

lsコマンドで/root/に公開鍵が転送されているのを確認し、
authorized_keysに登録する。
その後、パーミッションの変更を行い一度サーバからログアウトする
再度sshコマンドでログインを試みる。

Python3 Jupyter Notebook導入メモ

前回TensorFlowのセットアップ記事を書いたので
今回はTensorFlowで試行錯誤する際に便利な
Jupyter Notebookを導入してみようと思います。

下記コマンドでインストール行う。

$ pip install jupyter

そして起動。

$ jupyter notebook

うまく動作すればブラウザが起動して、Jupyter Notebookが
表示されるはずです。
f:id:kyamisama:20180923114022p:plain

今後使い方についても書いていこうと思います。

TensorFlowのインストールから簡単な計算までやってみる。

先日書店にて入門書向けの深層学習の導入本を購入したので
TensorFlowの導入メモを残してみる。

深層学習とはなにか

今更このような事を説明するのは無粋だと思う。
何しろこの手の情報はネットや書籍がごまんと転がっているからだ。
それでも私のアウトプットとして役だって貰うため説明させていただく。

深層学習 ディープラーニングについて

深層学習とは、多層構造のニューラルネットワークを用いた機械学習のことである。
今でこそ人気の分野であると世間に知れ渡っているが、その火付け役となったのは
2012年に開催された画像認識コンテストだと言われている。
この大会は大規模な画像認識・分析をソフトウェアで行わせる。
具体的にはImageNetで公開されている飛行機やピアノなどの
様々なものが写っている写真データを学習させ、
写真に何が写っているか認識させ、その精度を競うものだ。
そして、この年にカナダ・トロント大学チームが深層学習を利用して
2位のチームを大きく引き離して優勝したのだ。

深層学習の特徴(手法)について

深層学習の手法は、それ以外のものを比べて大きく異なる点がる。
それは特徴量の抽出だ。
従来の手法だと人間が特徴量を指定する必要があったが、
深層学習では学習データから気概が自動的に特徴量を抽出する。

TensorFlowについて

TensorFlowはGoogleオープンソースで公開している機械学習ライブライアである。
深層学習を始め、いろいろな機械学習に利用できる。
機械学習ではこのライブライの人気がとても高いので資料も充実している。
機械学習の導入としては打って付けだろう。

TensorFlowのインストールを行う

ここまで話が長くなったが早速TensorFlowをインストールしていく。
ちなみにTensorFlowはWindowsにはインストールが出来ない。
もしWindowsでTensorFlowを利用したいのであればDockerやWMware上で
Linuxを動かし、そこにインストールする事をオススメする。

今回はmacを使ってインストールを行う。
その前にPyenvを使ってAnacondaをインストールしておく。

$ pyenv install anaconda3-4.1.1
$ pyenv global anaconda3-4.1.1
$ pyenv rehash

ここからTensorFlowのインスール

$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py3-none-any.whl
$ pip install --upgrade $TF_BINARY_URL

それでは無事にTensorFlowがインストール出来たか確認してみよう。
以下のように「hello」が表示されていれば問題ない。

$ python
>>> import tensorflow as tf
>>> sess=tf.Session()
>>> hello=tf.constant("hello")
>>> sess.run(hello)
b'hello'
>>> 

TensorFlowで簡単な計算をさせてみる

とりあえずサンプルコードを実行してみる。
うまく動作すれば「6234」と値が返ってくるはずだ。

$ cat calc1.py 
# Tensorflowを取り込む
import tensorflow as tf

# 変数a,bに数字を代入
a = tf.constant(1234)
b = tf.constant(5000)

# 計算式を定義
add_op = a + b

# セッションを開始
sess = tf.Session()
res = sess.run(add_op) # 式を評価
print(res)

実行結果

$ python calc1.py 
6234