puttyのセッションをバッチ実行する際の便利な記述

概要

puttyのセッションが増えてくると実行する際に手間取るのでバッチ実行するやり方

前提

環境変数かSETを使って「PATH_PUTTY」にputty.exeのパスが入っているものとする

やり方

単純な実行方法

下記の文字列をテキストファイルに書き込み、拡張子を .bat にすればOK
ex) mytest.bat

start "" %PATH_PUTTY% -load "セッション名"

ファイル名に連動させる方法

下記の場合はファイル名をセッション名として実行する
例えばファイル名が mytest.bat であればセッション名が mytest のものが実行される
こうしておけば中身の文字列は変更せずにファイル名だけセッション名に合わせてコピーすればすぐ使えるようになる

start "" %PATH_PUTTY% -load "%~n0"

環境変数を使いたくない場合で、フォルダで管理する場合のtips

下記のような構成にしておけばinit.batが親に存在する場合は再帰で呼び出してくれるので、先頭の一か所にパスを書けば良くなる

/top/init.bat

SET PATH_PUTTY="C:\Program Files\putty\puttyjp.exe"

/top/sub/init.bat

IF EXIST %~dp0"..\init.bat" (call %~dp0"..\init.bat")

/top/sub/mytest.bat

IF EXIST %~dp0"init.bat" (call %~dp0"init.bat")
start "" %PATH_PUTTY% -load "%~n0"

新規ページを閲覧する際に10秒程度待たされるようになった

概要

windows10環境において、突然インターネットでページを閲覧する度に10秒程度待たされるようになった
その現象の解決方法について

現象

  • ページ閲覧する度に10秒程度待たされる
  • 一度閲覧すると2回目以降は速い(初回アクセスのページだけ遅い )

原因

早い話がIPv6DNSでIP解決しようとして、失敗している場合にこの現象が発生する
(※IPv6DNSを用意してあり、正しく設定している場合はこのケースでは無い)
10秒程度待てばIPv4DNSでIP解決出来ているようで、時間はかかるがアクセス出来てしまうのが厄介

解決方法

IPv6を使わないのであればネットワークアダプタの設定でIPv6を外してしまうのが手っ取り早い
使うのであればDNS設定を正しくする

トリガー

そもそも突然こうなった訳では無い、理由がある
著者のケースではvirtualboxをインストールした事がきっかけになったと思われる
想像になるが、今まではIPv4側が優先的に使われていたが、virtualboxインストール時にIPv6側が優先されたのではないか

類似問題かどうかの確認方法

chromeの開発者ツールを使ってネットワークタブを表示した状態で現象を発生させると、タイムラインからどこに時間を要したか分かる
これがDNS Lookupであり、10秒に近い場合は類似問題の可能性が高い

参考

gradleのhello worldメモ

memo

gradleのhello world的なサイトを見ながら操作メモです。(centos7)

gradleのインストール

# cd ~
# yum install -y which unzip zip vim
# curl -s http://get.sdkman.io | bash
# source ~/.sdkman/bin/sdkman-init.sh
# sdk install gradle

hello woldのコンパイルと実行

# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# mkdir myapp && cd myapp
# gradle init --type java-application
# gradle compileJava
# gradle run

jarの作成と実行

# gradle jar
# ls -la build/libs/
# java -cp build/libs/myapp.jar myapp/App

build.gradleに簡単なタスクを追加して実行

# vim build.gradle
※ファイル末尾に下記を追記
task hello {
    doLast {
        println "Hello World!!"
    }
}
# gradle hello
> Task :hello
Hello World!!

カスタムタスクの利用

DefaultTaskから派生したタスクを定義しておき、実行するメソッドにアノテーションを付けておけば、「type:」で型を指定する形でオブジェクトを生成して実行する事ができる。pluginで提供される機能に対し、任意のパラメータを上書きして実行させるなどして利用する。

class AAATask extends DefaultTask {

    String message

    @TaskAction
    def execMyTask() {
        println("message is ${message}")
    }
}

task execMyTask(type: AAATask) {
    message = "Hello World"
}

pageantに秘密鍵を登録するバッチの作成

概要

毎回pageant秘密鍵を入れる操作が面倒なのでバッチにしておく

やり方

pageant.exeがあるディレクトリ内にテキストファイルを拡張子batで用意する
ex) pageant_regist.bat

start pageant
timeout 3
pageant C:\key\any_key1.ppk
pageant C:\key\any_key2.ppk
pageant C:\key\any_key3.ppk
pause

スタートアップに入れておけば起動時に走らせる事もできる

サーバーにsshログインした時にslackに通知する

概要

サーバーにsshログインした時にslackに通知する

slack側での作業

  • 「チャネル設定」→「アプリを追加する」を順にクリックする
  • 「incoming-webhook」をインストールする
  • 「incoming-webhook」の設定にある「Webhook URL」をメモする

サーバー側での作業(CentOS7)

下記の「channel-name」と「http://hooks...」の部分は環境に合わせて要変更

$ sudo vim /etc/ssh/sshrc
#!/bin/bash

CHANNEL="#channel-name"
HOSTNAME=`hostname`
MESSAGE="username:${USER} from:${SSH_CLIENT} server:${HOSTNAME}"
WEBHOOK_URL='https://hooks.slack.com/services/xxxx/xxxx/xxxx'
curl -X POST --data-urlencode 'payload={"channel": "'"${CHANNEL}"'", "username": "login notification", "text": "'"${MESSAGE}"'"}' ${WEBHOOK_URL} 1>/dev/null 2>/dev/null

apacheのリバースプロキシ環境下でのbasic認証

概要

apacheでリバースプロキシを設定しており、伝搬させる前にbasic認証をかけたのだがAuthorizationヘッダーが伝搬してしまう問題の対応方法について。
※特に伝搬先にjenkinsが居るとbasic認証を何度も聞かれる羽目になる・・・

解決方法

下記のようにAuthorizationヘッダを伝搬させないようにするのがポイント
basic認証自体は一般的なもので構わない

<Location />
  AuthType Basic
  AuthName "mytest"
  AuthUserFile /etc/httpd/htpasswd/.htpasswd
  Require valid-user
</Location>

RequestHeader unset Authorization

おまけ

basic認証の他にIP制限も設定してある場合、どちらか一方をパスすれば良いという場合は「Satisfy Any」が使える。

dockerコンテナでIP制限するやり方

概要

あるサーバー上で動いているdockerコンテナに対して、任意のマシンからのみアクセスさせる方法について
(centos7を想定しています)

具体的に箇条書きにすると・・・

  • Aがクライアント側とする
  • Bがサーバー側で内部にdockerコンテナ(C)を起動しているとする
  • AからB上のCにアクセスを許可する設定について
    • 但し、A以外からは受け付けたくない

  • AのIPを192.168.0.100とする
  • Bで受け付けるポート番号を30000とする
  • Cでローカルから受け付けるポート番号を5000とする
$ docker run -d -p 192.168.0.100:30000:5000 (起動したいイメージ名)

より複雑なやり方

  • CのIPを172.17.1.10とする
  • CのIPが変わらないようにdocker network createで任意のネットワークを作り、docker runで指定しておく
$ docker network create --subnet=172.17.1.0/24 mynetwork
$ docker run -d --net mynetwork --ip 172.17.1.10 (コンテナイメージ名)

ファイヤーウォールの設定

$ sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.100" forward-port port="30000" protocol="tcp" to-port="5000" to-addr="172.17.1.10"'
$ sudo firewall-cmd --reload

こちらのやり方なら対象が増えた時にコンテナを起動し直す必要がない(はず)。