pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

BASH shell scriptでの二次元配列(風)

うまい参考がなかったので、下記にメモ。二次元配列風 bash。下記をファイル名fileとして保存

#!/bin/bash

ARRAYS=("a 1" "b 2 3" "ccc 4 5 6")

for ARRAY in "${ARRAYS[@]}"
do
  #echo ARRAY is \" "${ARRAY}" \"
  ARRAY=(`echo ${ARRAY}`)
  for ELEM in "${ARRAY[@]}"
    do
      echo "${ELEM}"
    done
done

結果

~$ bash file
a
1
b
2
3
ccc
4
5
6
~$bash -x file
  1. ARRAYS=("a 1" "b 2 3" "ccc 4 5 6")
  2. for ARRAY in "${ARRAYS[@]}"
  3. ARRAY=(`echo ${ARRAY}`)
    1. echo a 1
  4. for ELEM in "${ARRAY[@]}"
  5. echo a
a
  1. for ELEM in "${ARRAY[@]}"
  2. echo 1
1
  1. for ARRAY in "${ARRAYS[@]}"
  2. ARRAY=(`echo ${ARRAY}`)
    1. echo b 2 3
  3. for ELEM in "${ARRAY[@]}"
  4. echo b
b
  1. for ELEM in "${ARRAY[@]}"
  2. echo 2
2
  1. for ELEM in "${ARRAY[@]}"
  2. echo 3
3
  1. for ARRAY in "${ARRAYS[@]}"
  2. ARRAY=(`echo ${ARRAY}`)
    1. echo ccc 4 5 6
  3. for ELEM in "${ARRAY[@]}"
  4. echo ccc
ccc
  1. for ELEM in "${ARRAY[@]}"
  2. echo 4
4
  1. for ELEM in "${ARRAY[@]}"
  2. echo 5
5
  1. for ELEM in "${ARRAY[@]}"
  2. echo 6
6

ASAでPATでICMPが返ってこないとき

ASAは(限らずファイアウォールとか少しレイヤ高くなるものは)あまりまとまった情報が出てこない。おそらくできる人はできるけど、いつの間にか操作を悟っているので、特にネットワークの世界では、プロダクトの知識を知らないとダメなやつと思われがちなので、そのような世界観では、発信はされないためと考える

ASAでPATしている環境で、NAT元(内側)から外(変換後インタフェースのさらいに外のどっか)にping打って応答が返ってこないというケース。

こんなログが出てて、何かACL空けなきゃいけないのかね。FWってステートフルパケットインスペクションじゃないのかね。というとき。
Deny inbound icmp src outside:X.X.X.X dst inside:Y.Y.Y.Y (type 0, code 0)


いくつかのプロトコルは、インスペクションルールを別途定義する(例えば思いつきやすいものではFTPを想像してみる)。CLIコンフィギュレーションガイドから「アプリケーション レイヤ プロトコル インスペクション」とか「インスペクション」で探してみると情報は見つかる。
ICMPについてで述べると、下記のような情報もある。
「ASA で ICMP Inspection の正しい適用方法」
https://community.cisco.com/t5/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/asa-%E3%81%A7-icmp-inspection-%E3%81%AE%E6%AD%A3%E3%81%97%E3%81%84%E9%81%A9%E7%94%A8%E6%96%B9%E6%B3%95/ta-p/3121813
例えば上記リンクの設定例2)を引用

access-list ICMP extended permit icmp any any
!
class-map ICMP
match access-list ICMP
!
policy-map global_policy
class ICMP
inspect icmp

そして、有効化も忘れずに。例えばglobalで
service-policy global_policy global

SSHポートフォワーディング(トンネリング)のコネクション

sshポートフォワーディング(トンネリング)は、おおまかにはsshサーバを踏み台にして、そこへのssh接続を文字通り"トンネル"のように使って、別の宛先に別のプロトコルを通す。使い方は調べるとたくさん出てくる。

例えば、下記のようにしたとする。
$ ssh username@192.168.1.11 -L 3456:192.168.1.11:80
3456は、クライアントにできるトンネルの入り口になるポート番号
クライアントからは、192.168.1.11 のsshサーバへsshでつながる
192.168.1.11:80はトンネルから出た先の最終的な接続先
※上記はsshサーバと最終的な接続先が同じホスト上

例えばクライアントが192.168.1.10だとして、上記のコマンドでsshトンネルを作ったのちに、クライアントから "127.0.0.1:3456" に接続した場合のコネクションは下記のようになる。
この場合だと、192.168.1.11でウェブサーバが動いていて、192.168.1.10でブラウザを立ち上げ、アドレスバーへ http://127.0.0.1:3456 とするイメージ。
[127.0.0.1:63611(ランダムポート)]---<コネクション>---[クライアント トンネル入口 127.0.0.1:3456]
[ssh クライアント 192.168.1.10:63588(ランダムポート)]---<コネクション>---[sshサーバ 192.168.1.11:22]
[sshサーバ トンネル出口 192.168.1.11:49999(ランダムポート)]---<コネクション>---[80番で待ってるサーバ 192.168.1.11:80]

実際の動作切り分けやログを考慮する際に。