それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェルスクリプトで実行中の関数名を関数内部から知る(自分自身の関数名)

自分自身の関数の名前を知りたい。

関数名は、関数名を表す変数に入っている(BASHで確認)

echo ${FUNCNAME[0]}

これを使うと、自分自身の関数名を実行中に参照できる。

takuya@Desktop$ function sample() { echo ${FUNCNAME[0]} ;  }; sample
sample

便利。

なんで自分自身の関数名を知る必要があるのか。

実行後に関数を消したいから

関数を使い終わったら片付けたいときがあります。一時的な関数として、処理をブロックに分けるだけの目的で使うことがります。

function sample001() {
 # なにか処理
 
 ## 処理が終わったら自分自身消す。
 unset ${FUNCNAME[0]} ;
};

これを実行するとこのようになります。 実行後は関数が消えています。これで名前を汚さずに自分の関数をシェルスクリプトで使えます。

takuya@Desktop$ function sample001() {
>  echo ${FUNCNAME[0]} ;
>  unset ${FUNCNAME[0]} ;
> };
takuya@Desktop$ sample001
sample001
takuya@Desktop$ sample001
-bash: sample001: コマンドが見つかりません

なぜ名前を調べて消す必要があるのか。

bashrc のような dotfile で環境設定をする処理に使います。

環境設定するsample.sh をシェルスクリプトで書いた場合

function sample001() {
    ## なにか処理
    echo 環境設定をした
 };
sample001

source すると関数がENVに残ってしまう。

$ source sample.sh
$ sample001

そのために、長い処理をブロック単位に分けて書くとき無駄に関数を設定すると、unset を忘れがちになってしまう。

そこで、source するシェルの環境設定ファイルを書く場合に関数を自分自身で unset しておけば汚さずにすむ

function sample001() {
    ## なにか処理
    echo 環境設定をした
    ## 使い終わったら消す
    unset ${FUNCNAME[0]} ;
 };
sample001
$ source sample.sh
$ sample001 # not found 

このように、自分自身の関数名を知るノウハウは、シェルスクリプトで環境設定をブロック単位で管理することがしやすくなるので本当に便利りだ!!とおもった

nginx でSSHをプロキシして転送する 443 の再利用も可能

nginx でSSHの接続を転送することが出来ます。

nginx には ストリームをそのまま転送することが出来る機能があるので、TCP・IPのポートフォワードができて、ルーター的な動作が出来ます。

nginx.conf

stream {
  upstream ssh {
    server 192.168.2.8:22;
  }
  server {
    listen 2222;
    proxy_pass    ssh;

  }
}

なんと443 を再利用することも可能

まだ試してないのですが、 443 を ssh / ssl の両方で待ち受けることも可能になってるようです。今使ってる グローバルIP上の nginx が非対応なので試すのは少し先になりそう

Run Non-SSL Protocols on the Same Port as SSL in NGINX 1.15.2

関連資料

参考資料

lvm 関連のコマンドをsudo で使えるように sudoers を編集する

lvm 関連のコマンドは root のみ

lvm コマンドを実行したいと思っても、root に制限されているので、使えないことがあり困ったので、一般ユーザーに開放することにした。

sudoers に許可したいコマンドのフルパスを列挙すればいい。

Cmnd_Alias LVM = /sbin/lvchange,/sbin/lvconvert,/sbin/lvcreate,/sbin/lvdisplay,\
                 /sbin/lvextend,/sbin/lvm,/sbin/lvmchange,/sbin/lvmconf,/sbin/lvmdiskscan,\
                 /sbin/lvmdump,/sbin/lvmetad,/sbin/lvmsadc,/sbin/lvmsar,/sbin/lvreduce,\
                 /sbin/lvremove,/sbin/lvrename,/sbin/lvresize,/sbin/lvs,/sbin/lvscan,\
                 /sbin/pvchange,/sbin/pvck,/sbin/pvcreate,/sbin/pvdisplay,/sbin/pvmove,\
                 /sbin/pvremove,/sbin/pvresize,/sbin/pvs,/sbin/pvscan,/sbin/vgcfgbackup,\
                 /sbin/vgcfgrestore,/sbin/vgchange,/sbin/vgck,/sbin/vgconvert,\
                 /sbin/vgcreate,/sbin/vgdisplay,/sbin/vgexport,/sbin/vgextend,\
                 /sbin/vgimport,/sbin/vgmerge,/sbin/vgmknodes,/sbin/vgreduce,\
                 /sbin/vgremove,/sbin/vgrename,/sbin/vgs,/sbin/vgscan,/sbin/vgsplit

takuya   ALL=(ALL) NOPASSWD: LVM

sudo lvs で使える。

sudo pvs 

コマンド一覧作り方

lvm 関連のコマンドは、lvm のサブコマンドや

takuya@:~$ lvm
  WARNING: Running as a non-root user. Functionality may be unavailable.
lvm> help
  pvremove        Remove LVM label(s) from physical volume(s)
  pvs             Display information about physical volumes
  pvscan          List all physical volumes
  segtypes        List available segment types
  systemid        Display the system ID, if any, currently set on this host
  tags            List tags defined on this host
  vgcfgbackup     Backup volume group configuration(s)
  vgcfgrestore    Restore volume group configuration
  vgchange        Change volume group attributes
  vgck            Check the consistency of volume group(s)
  vgconvert       Change volume group metadata format
  vgcreate        Create a volume group

sbin の中で lvm にエイリアスしているものを列挙すれば見つけられる、

takuya@:~$ ll /sbin/ | grep lvm
107:lrwxrwxrwx 1 root root      3 2017-03-18 01:29 lvchange -> lvm
108:lrwxrwxrwx 1 root root      3 2017-03-18 01:29 lvconvert -> lvm
109:lrwxrwxrwx 1 root root      3 2017-03-18 01:29 lvcreate -> lvm
110:lrwxrwxrwx 1 root root      3 2017-03-18 01:29 lvdisplay -> lvm

あとはこの結果を xargs などで配列にしてあげればいい

やり方はいくらでもあると思う。

takuya@:~$ ll /sbin/ | grep lvm | cut -d ' ' -f 13 | sort | uniq | xargs -I@ echo /sbin/@ |xargs echo | tr '  ' ' ,'
/sbin/lvchange,/sbin/lvconvert,/sbin/lvcreate,/sbin/lvdisplay,/sbin/lvextend,/sbin/lvmchange,/sbin/lvmconfig,/sbin/lvmdiskscan,/sbin/lvmsadc,/sbin/lvmsar,/sbin/lvreduce,/sbin/lvremove,/sbin/lvrename,/sbin/lvresize,/sbin/lvs,/sbin/lvscan,/sbin/pvchange,/sbin/pvck,/sbin/pvcreate,/sbin/pvdisplay,/sbin/pvmove,/sbin/pvremove,/sbin/pvresize,/sbin/pvs,/sbin/pvscan,/sbin/vgcfgbackup,/sbin/vgcfgrestore,/sbin/vgchange,/sbin/vgck,/sbin/vgconvert,/sbin/vgcreate,/sbin/vgdisplay,/sbin/vgexport,/sbin/vgextend,/sbin/vgimport,/sbin/vgimportclone,/sbin/vgmerge,/sbin/vgmknodes,/sbin/vgreduce,/sbin/vgremove,/sbin/vgrename,/sbin/vgs,/sbin/vgscan,/sbin/vgsplit

2019-09-27

このメモは随分前に書いていて、公開してなかったものなので、情報が古い可能性があります。昔LVMを触り始めたころに何故か sudo lvs が出来なくてこういうことをしました。今はできるはず。

sudoers のサンプル程度に使ってください。