PowerShell備忘録2:プロパティ取得

色々途中。とりあえず載せる。なんか覚えたら追記予定。

 

【コマンド実行結果のプロパティを確認する】

>Get-Service | Get-Member

 

【コマンド実行結果をソートする】

Get-Service | Sort-Object {プロパティ名}

 

【出力内容をフォーマットする】
※自分の知識では2バイト文字が1文字として認識されてしまい頭揃えができなかった。

foreach文使用してフォーマット出力(printf関数と似たような出力ができる)
et-Service | Sort-Object Display

 

 

Linux備忘録21:正規表現の(先読み、戻り読み、否定系)、ファイルディスクリプタで出力操作

Linux(bash)の個人的備忘録。

個人用サイトのため、非推奨の記述や誤りがあるかもしれません。ご了承ください。

GNU bash, バージョン 4.4.19(1)-release環境を使用

 

下の表は意味わかってない。とりあえず載せておく

自分的解釈ができたので、追記。

⇒検索文字列に+して(否定、肯定(含む))の&条件を付けられるような仕組み。

・名前(記述)      ・詳細
否定先読み(?!pattern)      開始位置から前を読んで、pattern がマッチしなければテストはパス

否定後読み(?<!pattern)      開始位置から後ろを読んで、pattern がマッチしなければテストはパス

肯定先読み(?=pattern)       開始位置から前を読んで、pattern がマッチすればテストはパス

肯定後読み(?<=pattern)     開始位置から後ろを読んで、pattern がマッチすればテストはパス

 

以下のような検索対象があるとする。

WindowsNT
WindowsVista
Windows2000
Windows3000

肯定先読み :Windows(?=[0-9]+)

⇒連続する数字を含むWindowsにマッチする。(この場合、"Windows2000"と”Windows3000"のWindowsにマッチする。)

●あくまでマッチはWindows部分のみとなるのが先読み、戻り読みを使用する理由。

 

否定先読み :Windows(?![0-9]+)

⇒連続する数字を含まないWindowsにマッチする。

(この場合、"WindowsNT"と”WindowsVista"のWindowsにマッチする。)

 

戻り読み参考例:

Windows1000
Windows3000
Mac2000
Mac1000

 

肯定戻り読み :(?<=Windows)[0-9]+

Windowsを含む連続数字にマッチする。

("Windows1000"と”Windows3000"の数字部分にマッチする。)

 

否定戻り読み :(?<!Windows)[0-9]+

Windowsを含まない連続数字にマッチする。

("Mac2000"と”Mac1000"の数字部分にマッチする。)

 


正規表現の否定形記述参考サイト
https://uxmilk.jp/50674
https://www-creators.com/archives/1827


【"Windows"を含まない行にマッチ】

^(?!.*Windows)(?!.*XP).*$

 

【"Windows"または"Mac"を含まない行にマッチ】

^(?!.*(Windows|Mac)).*$


【"Windows"を含むが、XPを含まない行にマッチ】

^(?=.*Windows)(?!.*XP).*$

※"?="は肯定先読みの意味


【"Windows"で始まらない行】

^(?!Windows).*$


【"Windows"で終わらない行】

^(?!.*Windows$).*$

 

 

【while文の中でreadコマンドを使用する】

whileで1行ずつ処理(readコマンドで読み込み)、さらにその中でreadコマンドを使用してループ処理の中でウィザード形式の処理を入れる。
    
    参考引用サイト:https://zvub.hateblo.jp/entry/20170218/1487385466
    ⇒まったく同じ内容でつまづいた。。。
    
    事象:普通にそのままやるとreadでの標準入力待ちが実施されない

    (⇒ループ処理内のreadに別の文字列が読み込まれてしまいスクリプト処理が止まらない。)


    原因:while readとループ処理のreadが、同じ1番のファイルディスクリプタ(標準入力)を使用しバッティングするため。
       ⇒上記サイト上でも記載があり、推奨方法では無いかもしれないが、とりあえずループ処理側のファイルディスクリプタを"3"に変更して回避する。

 

参考スクリプト記述
※ヒアドキュメントを1行ずつ読み込ませ,処理していく場合を例にする。

#!/bin/bash

while read -r LINE <&3 ←3から標準入力
do
    read -p "## KEY ENTER :" -r TEST ←ループ処理の中で、キーボード入力待ちの部分
    echo "${TEST}"
    echo "${LINE}"
done 3<<EOF ←出力先に"3"を指定。
aaaa
bbbb
cccc
EOF

●while文について、ファイルを直接読み込ませる場合①やパイプでつなぐ場合②でも上記にように出力先を変更しないと、readコマンドは入力待ちにならない。
①while read LINE;do {read ループ処理};done < "{ファイル名パス}"
②cat ~ | while read LINE;do {read ループ処理};done

 

【エラー出力をパイプで渡す】

♯ logrotate -v /etc/logrotate.conf 2>&1 | grep "/var/log/messages"

※コマンドの中には普通の出力がエラー出力になっているものが間々ある。"logrotate"のデバック動作はその一つ。デバック系のコマンドに多そうなイメージ。


【複数のファイルにリダイレクトする】
※+画面上には何も出力しない。

rpm -qa | tee -a {ファイル1} {ファイル2} > /dev/null ←teeの標準出力を捨てる


【エラーと標準を別ファイルに出力】

♯ ls -l >> info.txt 2>> err.txt

※例として追記リダイレクト">>"にしているだけ。上書きリダイレクトでも可。

Linux備忘録20:getoptsコマンドを使用したオプション解析、OSインストールメディアをコピーしてisoファイルを作成する

個人用備忘録のため、内容や記述に誤りがあったら申し訳ありません。

 

スクリプトでコマンドオプションごとの処理を実行する】

・getoptsの一般的な使用方法

「while」と「case」文を使用してオプションごとの処理を記述する。

 オプション文字列の例:-u -g -d

 

・参考スクリプト(test.sh)

#!/bin/bash

while getopts u:g:d: OPT  ←指定したオプション文字列の後ろに「:」を記載すると引数を取るオプションと解釈される
 do
    case $OPT in
        u) USER=$OPTARG;; ←オプション文字列の引数が$OPTARGに格納される。
        g) GROUP=$OPTARG;;
        d) DIR=$OPTARG;;
    esac
 one

echo "ユーザー名は$USER"
echo "グループは$GROUP"
echo "ディレクトリーは$DIR"

#END

※u:g:d: のオプション文字部分は{ugd}ど記述してもOK※引数いらない場合。

(オプションも-ugbで可)

 

・上記スクリプトを実行した結果

# sh test.sh -u ROOT -g TEST -d /root/TEST
ユーザー名はROOT
グループはTEST
ディレクトリーは/root/TEST

 

 

【OSインストールメディアファイルをローカルにコピーしてisoファイルを作成する】

 ※RedHat8.1のインストールメディアを使用して作成した際の備忘録

 ※OS標準のmkisofsを使用。

 ※OSインストールメディアが/mediaディレクトリにマウントされている状態を前提とする。

 

・実行コマンド

# mkdir /tmp/ks
# shopt -s dotglob
 ⇒「.」(ドット)で始まるファイル名をパス名展開の結果に含めるオプションを有効にする。※これを先に実行しないでコピーしたため失敗した。
 
# cp -avRf /media/* /tmp/ks/ ←メディアの中身を丸々コピー

 

# cd /tmp/ks  ← カレントディレクトリを変更

 

# mkisofs \
      -v -r -J -T -l -input-charset utf-8 \
      -o /tmp/test.iso \ ←出力先ファイル(任意名)。

      -b isolinux/isolinux.bin \
      -c isolinux/boot.cat \
      -V "RHEL-8-1-0-BaseOS-x86_64" \ ←イメージ名?使用メディアにより異なる。
      -no-emul-boot \
      -boot-load-size 4 \
      -boot-info-table \
      -eltorito-alt-boot \
      -e images/efiboot.img \
      -no-emul-boot ./ ←カレントディレクトリを指定。

 

 

・iso化する前にgrubの起動メニューを編集する手順。

 ※起動モードがUEFIでのコンフィグメニューを更新する場合。

# mount -o loop /tmp/ks/images/efiboot.img /mnt/
# vi /mnt/EFI/BOOT/grub.cfg
# umount /mnt ←完了後のアンマウント

 

 

Linux備忘録19:パケット採取、findディレクトリ除外(tcpdump,find)、splitコマンドでのファイル分割、結合

【インターフェースでtcpdumpを採取する】

基本系は以下

# tcpdump -i eth0 -w tcpdump_eno0

 → tcpdump -i {インターフェース名} -w {ファイル名}

 

・ポートおよび通信先ホストを限定してtcpdumpを取得する。
※ホスト名【server1:192.168.0.1】とのNTP通信(123ポート)についてキャプチャする。

# tcpdump -i eth0 port 123 and host 192.168.0.1 -w server1_ntp.cap

 →{server1_ntp.cap}は任意ファイル名

 


【findコマンドで特定のディレクトリおよびサブディレクトリを削除する。】

 

・カレントディレクトリ配下のWestディレクトリおよびそのサブディレクトリを除外する。

# find ./ \( -not -path "*/West/*" -a -not -path "*/West" \) -type d

 ※パスはダブルクォートでくくる。

 

・複数の検索条件をアンド指定する。
 →"\("と"\)"条件をくくり、-aオプションで条件を重ねる
  ※-oオプションが"or"で条件をつなげる。

 →パスはワイルドカード"*"が使用可能

 

 

【splitコマンドでファイルを分割、結合する】

・ファイルを分割する。

 ※rhel8.isoというファイルを分割する場合を例として記載。

# split -b 500M -d /tmp/rhel8.iso [接頭辞]

 ⇒-bは分割容量を指定、上記の場合は「500MB」を上限としてファイル分割する。
 ⇒-dは接尾辞にアルファベットでは無く、数字を付与するオプション。

(指定接頭+00、指定接頭辞+01...指定接頭辞+04~みたいなファイル名で作成される)

 

ファイル個数で分けたい場合は{-n ファイル数}オプションを使用する。

# split -n 3 /tmp/rhel8.iso

 ※接頭辞を指定しない場合、元ファイル名に{aa,ab,ac...} の接尾辞が付与される。

 

 ・分割したファイルを結合する

※以下のような分割ファイルがあった場合。

# ls ./
OSmedia_00  OSmedia_02  OSmedia_04  OSmedia_06
OSmedia_01  OSmedia_03  OSmedia_05  OSmedia_07

 

# cat OSmedia_?? > comb.iso ←catコマンドで全ファイル内容を標準出力しファイル出力する。

 

Linux備忘録18:後方参照、文字列変換(sed、tr、expand)

 【sed正規表現を使用する】

# sed -r -e "s/\t+/,/g" {ファイル}

上記はタブ部分を全て、単一カンマに変換する場合の例。
※-rオプションを使用する
※trコマンドはデフォルトで正規表現使用可

 

 【sedの置き換えで後方参照を使用する】

後方参照させたい(置き換えしたくない)部分を丸括弧()でくくる

※参照部分は\1、\2、\3で使用可能。

 ⇒192.168.0.192というIPのうち、末尾の192だけ置換する

sed -r -e "s/(192.168.0.)192/\1254/g"

※アンダーライン箇所が参照部分

 

以下のようなテキストファイル(test)でwindowsに付随する【置換前】のみを置換する

windows部分は変更されないようにする

# cat test
Windows 置換前
mac 置換前
windows 置換前
MAC 置換前
UNIX 置換前
linux 置換前
Linux 置換前
Windows XP 置換前
Windows VISTA 置換前

 

# sed -r -e "s/(windows.*)置換前/\1置換済み/gi" test

       ※スクリプトのgiオプションは、g(全該当箇所) 、i(大文字、小文字を区別しないの意味)

 

 ●出力結果

 Windows 置換済み
 mac 置換前
 windows 置換済み
 MAC 置換前
 UNIX 置換前
 linux 置換前
 Linux 置換前
 Windows XP 置換済み
 Windows VISTA 置換済み

 

 【tabをスペースに変換して標準出力する】

# expand {ファイル}

 

 

 【ファイルを結合する】
 pasteコマンド
二つ以上のファイルを第一引数から順番に、最終カラムで結合して表示する

 

# paste tmp_*

※カレントのtmp_*を全て結合する、結合部分はタブで埋められる

Linux備忘録17:OS(ブートローダ)起動不可対応、備忘録

OSが起動しなくなった時に実施した内容を備忘録として記載。

実施内容に不足無いと思っていますが、個人用備忘録のため、内容や記述に誤りがあったら申し訳ありません。

 

カーネルバージョン:4.18.0-147.5.1.el8_1.x86_64(RHEL8.1)


【状況】

MBR形式のHDDに対しpartedコマンドでパーティションを消したり、増やしたりした。※最終的に元に戻した

・swap領域を再フォーマット ←関係ない?

grubのUUIDを更新 ⇒上記実行後、OSを再起動したところブートローダが起動しなくなった。 ⇒画面に何も出てこない

grubの起動メニューが出てこない状態


パーティション情報】

モデル: ATA WDC WD6400BPVT-1 (scsi)ディスク /dev/sda: 640GBセクタサイズ (論理/物理): 512B/4096Bパーティションテーブル: msdosディスクフラグ:
番号  開始    終了   サイズ  タイプ    ファイルシステム  フラグ 

1   1049kB  630MB  629MB   primary   ext4              boot 

2    630MB   262GB  262GB   primary   ext4

3    262GB   285GB  22.3GB  primary   ext4

4    285GB   640GB  355GB   extended 

5    285GB   293GB  8311MB  logical   linux-swap(v1)  

 

【対応記録】下記コマンドを上から順に実行

①RHEL8のOSインストールメディアを使用してRescueモードで起動 ※手順割愛


②マウント前に各デバイスファイルシステムをチェック。

 

※実行結果的にファイル破損しているようには感じなかったが...。

# fsck /dev/sda1

# fsck /dev/sda2

# fsck /dev/sda3

 
③boot,/パーティションをマウントしてchrootでルートディレクトリを変更。


  Ⅰ、各パーティションをレスキューOSにマウント

# mount /dev/sda2 /mnt ※/領域をマウント

# mount /dev/sda1 /mnt/boot ※boot領域をマウント


  Ⅱ、デバイスや仮想ファイルシステムを共有。

# mount --bind /dev /mnt/dev

# mount --bind /dev/pts /mnt/dev/pts

# mount --bind /proc /mnt/proc

# mount --bind /sys /mnt/sys

# mount ←確認。


  Ⅲ、chroot実行

# chroot /mnt

# ls ←確認。


grubの再インストール、grub.cfgを再作成

# grub2-install /dev/sda 

⇒[Installation finished. No error reported.]と表示されれば成功   

※/etc/mtab情報が更新されておらずエラーが出る場合があるらしい。その時は以下を実施。

# ls -l /etc/mtab

 -rw-r--r-- 1 root root 71  2月 26 02:49 2015 /etc/mtab

# rm /etc/mtab

# cp /proc/mounts /etc/mtab

 

grub.cfgを再作成

# grub2-mkconfig -o /boot/grub2/grub.cfg

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg ※BIOSブートだから不要だと思うけど念のため実施。

# exit ←chroot抜ける

# reboot

  ⇒システム再起動後、状態が回復しOSが正常起動したことを確認。 

 

 

Linux備忘録16:inode指定でのファイル削除、sarコマンド,他情報収集系コマンド

Linux(bash)備忘録。

個人用備忘録のため、内容や記述に誤りがあったら申し訳ありません

 

ファイルが文字化け等してしまって、ファイル名指定での削除できない場合等にファイルinodeから指定してファイル削除。

【ファイルのinodeを確認】

# ls -i

  →lsのiオプションで表示

 

【inode番号[526431][526423]のファイルを削除する】

 

# find ./ -inum 526431 -ok rm -rf {} \;
# find ./ -inum 526423 -ok rm -rf {} \;

 

 

 

 【sar(sysstat)コマンドの各オプション】

 ※ファイル名を対象とする-fオプションを使用しない場合、当日のデータ収集中のバイナリ―ファイルが対象となる。

 

 CPU使用状況

# sar -u -f /var/log/sa/saXX

 メモリー使用状況

# sar -r -f /var/log/sa/saXX

 ディスクI/Oの状況

# sar -b -f /var/log/sa/saXX

 swapのステータス情報

# sar -S -f /var/log/sa/saXX

   スワップイン/スワップアウト発生状況

# sar -W -f /var/log/sa/saXX

 ネットワークパケット送受信の状況

 # sar -n DEV -f /var/log/sa/saXX

 

   全情報

# sar -A

 

【その他、情報集計コマンド】

 ※適当メモ、再確認および更新必要

 

モリー使用量

 # free

 ⇒「available」の値から使用可能領域を見る。以下コマンドでメモリ使用領域解放が可能。※要注意

# echo 3 > /proc/sys/vm/drop_caches

 

【ipmitool】

 IPMIに対応したシステム管理プロセッサーよりHWの障害情報取得が可能。

 ※パッケージ導入が必要

 ※ipmievd.serviceの起動が必要 ⇒自動的にシステムログに記録される

  

# ipmitool fru    ⇒HWコンポーネントの構成情報表示

# ipmitool sdr    ⇒HWコンポーネントの障害状況を表示

# ipmitool sel list   ⇒システム管理プロセッサーのイベントログを表示

# ipmitool sel clear  ⇒システム管理プロセッサーのイベントログを削除

 

障害状況を表す記号

 ns【no sensor(監視センサーを持たないコンポーネント)】
 nc【non-critical error(致命的ではない問題)】
 cr【critical error(致命的な問題)】
 nr【non-recoverable error(回復不能な問題)】

 

【dstatコマンド】

 ※vmstat、iostat等の機能を一つにまとめたコマンド。パッケージ導入が必要。

 ※1回目の出力は無視する

 最初に[-t]オプションを指定すると、各行にタイムスタンプが付与。

 -v ⇒メモリー、vmstat相当

 -c ⇒CPU情報

コマンド例

# dstat -c -C0,1,2,3

 

 -dr ⇒ディスクI/O

# dstat -dr -Dtotal,sda1,sda5 --disk-util

 

 -n  ⇒ネットワーク通信

# dstat -n -Ntotal,eno1 --net-packets