揮発性のメモ2

http://d.hatena.ne.jp/iww/

bash

bashで、rootじゃなければエラーにする

シェル変数UIDを使う シェル変数UIDには実ユーザIDが入っている 0ならroot #!/bin/bash if [ "$UID" != "0" ]; then echo "root以外では実行できません" exit 1 fi

Cygwinで、コマンドラインでtabを押したときのファイル名補完で .exe が表示されない

Cygwinで hello.exe を実行するときに、 bash上で ./he まで入力してtabを押しても ./hello で止まってしまって ./hello.exe とならない。 コマンドの引数のときの補完では ちゃんと hello.exe まで出る。 別に ./hello で普通に実行できるからいいんだけど…

ファイルを連番でコピーする

a1.txt を a2.txt~a100.txt に複製する。 for i in a{2..100}.txt; do cp a1.txt $i; done for文で回るやつ。 わかりやすい。 echo a{2..100}.txt | xargs -n1 cp a1.txt xargsを使う。 誤解を招きやすい。

bashで100万回ループする

atmarkit.itmedia.co.jp #!/bin/bash for ((i=0; i<1000000; i++)); do echo $i done この書き方ぜんぜん知らなかった。 超直感的じゃん。 dashでは使えない

bashで、正規表現を使うときにやる失敗

正規表現を "" などで囲わない 空白を検索できない ホワイトスペースを判定できない 最短マッチしない 正規表現を "" などで囲わない ""で囲うと正規表現で無くなるっぽい A="abcdefg" # OK [[ $A =~ (abc) ]] && echo ${BASH_REMATCH[1]} # abc # NG [[…

bashで、動作中にプログラムを書き換えると反映されるやつ

bash は、シェルスクリプトの実行中に適時シェルスクリプトを読み込みます。 https://www.iimc.kyoto-u.ac.jp/services/comp/pdf/file_loss_insident_20211228.pdf なにそれこっわ。 そんな仕様知らなかった #!/bin/bash echo start sleep 30 このプログラム…

bashで、256色表示する

エスケープシーケンスで色を出すやつ \e[48;5;Xm X:0~255 で背景色を指定 \e[38;5;Xm X:0~255 で文字色を指定 #!/bin/bash for x in {0..15}; do for y in {0..15}; do n=$((x*16+y)) printf "\e[48;5;%dm %3d\e[0m" $n $n done echo done TeraTermだとこ…

bashで whileの中でevalを使う

for文で出来る for x in A=hoge B=piyo; do eval $x done echo A=$A echo B=$B A=hogeA B=hogeBwhile文でこう書くとアウト echo -e "A=hoge\nB=piyo" | while read x; do eval $x done A= B=なぜなら、パイプを使っているから。 サブシェルになるので変数は…

bashでjqを使ってJSONの配列をループさせる

jsonの配列をシェルスクリプトとjqでループさせて取得する [ { "ip" : "192.168.10.105", "name" : "玄関" }, { "ip" : "192.168.10.102", "name" : "居間" }, { "ip" : "192.168.10.101", "name" : "トイレ" }, { "ip" : "192.168.10.100", "name" : "寝室"…

sshで、ローカルのスクリプトをリモートで実行する

$ ssh 192.168.0.2 bash < hoge.sh

プログラムの標準出力を別のプログラムの標準入力に渡す

ようするにパイプなんだけど、普通と違う書き方ができる $ ls -l | grep hoge $ ls -l > >(grep hoge)上の2つはだいたい同じような意味合いを持つio redirection - bash exec sending output to a pipe, how? - Stack Overflow bash-hackers.org - このウェ…

bashで、ヘルプと初期設定をひとつにまとめる

スクリプト書いてるとき、ヘルプと実体を合わせるのが面倒だし コメントに書いたことをヘルプにも書き写すのがアホっぽくなったので できるだけひとつにまとめる実験実行するとこんな感じになる $ ./sabun.sh -h # 差分確認プログラム # 接続先の / と ロー…

bashで、ファイルを1行ずつ読む

ファイルを1行ずつ読んで処理をしたい。 先頭が # で始まっていたらコメント扱いしたいし、空行も読み飛ばしたい。 while read LINE; do #echo LINE=$LINE [ -z "$LINE" ] && continue [ ${LINE::1} = "#" ] && continue /usr/bin/piyopiyo $LINE done < /tm…

[: missing ]

/usr/local/bin/hoge: 8: [: missing ] というエラーが出て、その8行目は [ -z "$ADDR"] || ADDR="HOGEHOGE" という塩梅だった。 "[" が文法じゃなくて内部コマンドだということを失念していたため、[ ] を単なる飾りとして見ていて、: missing ってなんだろ…

ネットマスクの /8 とか /16 とかの表記を 255.0.0.0 とか 255.255.0.0 とかに変換するbashスクリプト

あの 192.168.0.1/8 みたいなおしゃれな書き方を Classless Inter-Domain Routing(CIDR:サイダー) と呼ぶらしい。 IPアドレスとサブネットマスクをまとめて表記する:Tech TIPS - @IT #!/bin/bash A=$1 C=$(( 2**(32-$A)-1 )) D=$(( 0xFFFFFFFF^$C )) E1…

192.168.0.1〜192.168.0.254 までpingを打って結果の一覧を作る

echo -e 192.168.0.{1..254}\\n \ | xargs -IXXX -P30 bash -c 'ping -c1 -w1 XXX >&/dev/null; echo XXX $?' \ | sort -V > ping.txt for文で回すと1件ずつしか動かせないので、xargsで30件ずつくらい並行処理する。 並列処理すると当然結果はばらばらにな…

ディレクトリの中身をコピーする

× cp -a hoge/* piyo/ ○ cp -a hoge/. piyo/ *を使うと一旦展開されるのがダサいし、そもそもとして隠しファイルがコピーされないのはマズい。

teratermで罫線の表示 3

罫線のあるテキストをviで読んだ時に罫線が半角扱いになるためクシャっとなる問題teratermで罫線の表示 2 - 揮発性のメモ の続き Teraterm上で罫線を全角幅で表示する TERATERM.INIを編集 UnicodeToDecSpMapping=0 これにより、端末での表示上は全角になる…

結果がOKだったらOK、エラーだったらNGと表示する

make && echo OK || echo NG 逆に書くと当然アホになる

bashのコマンドラインで、コマンドを途中まで打ってからヒストリを検索する

便利な shell いろいろ Bashについていくつか - 備忘録 beta bash の履歴入力で前方一致検索を有効にする bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'コマンドを途中まで打って、カーソルキーの上下でヒストリーを検索で…

flockコマンドをflock関数みたいに使う 2

flockコマンドをflock関数みたいに使う - 揮発性のメモ リダイレクトでファイルディスクリプタを指定するとき、番号を直接指定しているのがいやだったけど、 変数名を指定することで自動で空いている番号を使用してくれることがわかった 参考:本を読む exec…

bashで配列

dashには配列がない。 配列宣言、初期化 $ A=() $ B=(111 "HOGE" 333) $ C[1]=jikken ()をつけて並べて書くと、添え字0から順につっこまれる 要素数 $ echo ${#B[@]} 3 $ echo ${#C[*]} 1 @でも*でもどっちでもいい。 要素の取り出し $ echo ${B[@]} 111 HOG…

今実行しているコマンドをTeraTermのウィンドウタイトルに表示する

端末をたくさん開いている状態で、 tailとかmakeとか長い処理してると どの端末でなにをしてるかわかんなくなるので、 今実行しているコマンドをTeraTermのウィンドウタイトルに表示したいので、表示した。 .bash_profile にこれを書き足す # window title t…

末尾に ?> がありそうなPHPファイル一覧

ケツ10行以内に ?> で始まっている行があれば、怪しいと判断する #!/bin/sh (tail $1 | grep -qe '^?>') && echo $1 find -name "*.php" | xargs -n1 hoge.sh

bashで履歴検索

CTRL+Rで最新から過去の方向へインクリメンタルサーチ開始 (reverse-i-search)`history': history` ' で囲まれた部分が検索対象文字列 インクリメンタルサーチのモードのとき(このプロンプトがでているとき)は CTRL+Rで過去の方向、CTRL+Sで現在の方向へ検…

bashの履歴をダブらせない

ignoredupsが効いてない感じがしたので、erasedupsも設定することにした # history export HISTCONTROL=ignoreboth:erasedups export HISTSIZE=2000 export HISTFILESIZE=40000 export HISTTIMEFORMAT='%m/%d %T ' historyコマンド関連のシェル変数 | Cardif…

ディレクトリを作って移動する

ディレクトリを作って移動する mkcd というコマンド mkcd() { mkdir -p "$1" && cd "$_"; } エイリアスだと引数を途中に使えないので関数にする。 失敗したら途中で終わるよう && でつなげる。

ディレクトリごとにCSVファイルの数を数えて出力

#!/bin/sh DIR=$1 DLIST=`find $DIR -type d` for D in $DLIST; do COUNT=`find $D -maxdepth 1 -iname "*.csv"|wc -l` if [ "$COUNT" -gt 0 ]; then echo $D:$COUNT fi done

BASHの脆弱性で、PHPはどうなっちゃうか

ApacheでPHPスクリプト起動してるけど、モジュール版なら大丈夫っぽい。 Apacheの設定 AddHandler cgi-script .cgi AddHandler php5-script .php.cgi は環境変数を全部もらえるので、bash(system関数)呼出時に今回の脆弱性に引っかかる。 .php はsystem関数…

ドラッグ&ドロップでascファイルを解凍するバッチファイル

@echo off set PATH=D:\cygwin\bin;%PATH% set Password=hogehoge set OutputFolder=D:\MyDoc\download set InputFile=%1 set OutputFile=%OutputFolder%\%~n1 bash -c 'echo %Password% | gpg --batch --yes --passphrase-fd 0 -o %OutputFile% %InputFile%'