指定フィールド以降を全取得

コマンドで表題を行いたい。今回は`cut`コマンドで行う。

■ 環境

  • macOS High Sierra
  • Linux

■ cut

$ cat test.txt
a b c d e f g
aa bb cc dd ee ff gg
1 2 3 4 5 6 7
11 22 33 44 55 66 77
$

上記のサンプルファイルに対して、4つ目のフィールド以降を取得したい。

$ cut -d ' ' -f 4- test.txt
d e f g
dd ee ff gg
4 5 6 7
44 55 66 77
$

当初は`awk`で実行しようかと思ったが、書く量が`cut`の方が圧倒的に少なかったのでこちらの方が便利と感じる。

以上。

■ 関連

cutで変数から切り出す

set -o noclobber

表題のビルトインコマンドについて。

■ 環境

  • bash
  • macOS High Sierra

■ set -o noclobber

リダイレクト(>)を使って標準出力をファイルに出力させることは多々あるのだが、誤ってファイルを上書きしてしまうケアレスミスが発生することがたまにある。だいたいは履歴のコマンドを再実行する際にやってしまう。

これを防ぐために表題を”.bashrc“に記載することにした。

set -o noclobber

もしくは下記でもOKなようである。

set -C

こうすることで、リダイレクト先のファイルが既に存在する場合には下記のようにエラーとなる。

$ ls
test
$
$ echo "test" > test
-bash: test: cannot overwrite existing file
$

>>“の追記でのリダイレクトの場合には問題なく書き込める。

ちなみに`man`には下記のような記載になっている。

Redirecting Output
  :
       If  the  redirection  operator is >, and the noclobber option to the set builtin has been enabled, the redirection
       will fail if the file whose name results from the expansion of word exists and is a regular file.   If  the  redi-
       rection  operator  is  >|, or the redirection operator is > and the noclobber option to the set builtin command is
       not enabled, the redirection is attempted even if the file named by word exists.
  :

以上。

Private IP Range 確認

表題の通り。スクリプト内で取得したIPが、PublicIPなのかPrivateIPなのかを判別させたい。人間が目で見れば判別はすぐにできるのだがスクリプト内で判定させるのはどうしたら良いのだろう?と。

■ 環境

  • macOS High Sierra
  • Amazon Linux

■ ipcalc

先日の`ipcalc`で何かしら取得できないかと思ったのだが、特にこれと言った表記やオプションは無かった。

$ ipcalc -c 192.168.33.10
$

■ dig

逆引きさせて何も返らないんじゃないかと思いやってみた。

$ dig -x 192.168.33.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.57.amzn1 <<>> -x 192.168.33.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 54828
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;10.33.168.192.in-addr.arpa.    IN    PTR

;; AUTHORITY SECTION:
168.192.in-addr.arpa.    60    IN    SOA    localhost. nobody.invalid. 1 3600 1200 604800 10800

;; Query time: 1 msec
;; SERVER: 10.1.0.2#53(10.1.0.2)
;; WHEN: Fri May 18 15:17:09 2018
;; MSG SIZE  rcvd: 103

$

AUTHORITY SECTION“の結果が使えそうである。ここが”localhost.“であるとPrivateIPであるっぽい。表記を少なくして再度試す。

$ dig +noall +authority -x 10.0.1.10
10.in-addr.arpa.    60    IN    SOA    localhost. nobody.invalid. 1 3600 1200 604800 10800
$

良さげな感じである。

以上。

■ 関連

ipcalc

複数のListenPortを指定

LinuxのSSHにおいて表題の通り。知らなかったのでメモしておく。

■ 環境

  • CentOS 6.9

■ sshd_config

sshdのListenしているPortを変更するというのはよくあるが、この値を複数指定することができるということを知らなかった。`man`で確認すると下記のように記載されている。

 Port    Specifies the port number that sshd(8) listens on.  
         The default is 22.  Multiple options of this type are
         permitted.  See also ListenAddress.

複数指定が可能なようである。試しに実行してみた。

$ cat /etc/ssh/sshd_config
  :
Port 22
Port 12222
  :

デフォルト状態でのListenPortの状態と設定反映後の状態は下記の通り。

$ ss -nlt
  :
LISTEN      0      128                  :::22       :::*
LISTEN      0      128                   *:22        *:*
  :
$
$ sudo service sshd reload
Reloading sshd:                                 [  OK  ]
$
$ ss -nlt
  :
LISTEN      0      128                  :::22       :::*
LISTEN      0      128                   *:22        *:*
  :
LISTEN      0      128                  :::12222    :::*
LISTEN      0      128                   *:12222     *:*
  :

複数指定することのメリットはなんであろう。HoneyPotとして残しておく?移行中?まぁ指定することもあるかもしれないと思ってメモである。

以上。

grep -o

表題の通り。メモである。

■ 環境

  • macOS High Sierra

■ grep

普段の使用方法としては、条件に合致もしくは合致しない行全体を表示することが多いのだが、正規表現で合致した文字列のみを抽出したかった。いつも通り合致した行から不要な部分を削除…という手段でいこうかと思ったのだが、`grep`の`man`を見てみるとちゃんとオプションがあるではないか。

-o, --only-matching
        Prints only the matching part of the lines.

実際にやってみると下記のようであった。試しにIPとおもわしき文字列を抽出してみる。

テストとして使うファイルは下記。accessログを模したものとする。

192.168.33.10 - - [15/May/2018:19:08:40 +0900] "GET /example/path HTTP/1.1" 404 1514 4795 "192.168.33.11" "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)"
192.168.33.132 - - [15/May/2018:19:08:45 +0900] "GET /example/path2 HTTP/1.1" 302 - "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)"

1行目に2つのIPアドレス、2行目に1つのIPアドレスが存在している。

$ grep -o -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' test.log
192.168.33.10
192.168.33.11
192.168.33.132
$

3つのIPアドレスが取得できた。満足である。

ちなみに正規表現では”[0-9]{1,3}“としてしまっているので、”001“や”999“といったIPアドレスではありえない数値であっても同様のフォーマットであれば取得してしまうが今回はそこまで厳密な用途ではないので良いものとする。

以上。