それマグで!

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

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

bash

sed コマンドで区切り文字を変えて、ファイル名に一致させる

sed の区切り文字を変える sed コマンドでは、検索と置換の文字列を区切りを変えられます。 普通はスラッシュを使うと思うんだけど、スラッシュはフォルダ名やPATHで使われるため、エスケープ処理が面倒になる。 sed 's/search_name/takuya/g'; 区切りを変え…

tar をパイプ経由で、ssh 経由で行い、サーバのファイルを一気に転送する

tar をパイプ経由で、ssh 経由で行い、サーバのファイルを一気に転送する ssh 経由で tar ssh srv1 'sudo tar cpvf - /var/opt ' | cat - > var-opt.tar こんな大胆なことをするときは、サーバーのファイルをまるっと取り出したいときなので。 p をつけて、p…

画像ファイルから全部のexifを除去する

方法1:exiftool exiftool -all:all= -r /path/to/file [/path/to/file...] 方法2:mogrify mogrify -strip /path/to/file 結果 サイズが変わってる。mogrify は画質いじってるのでは・・・ $exiftool -all:all= -r sample1.heic $mogrify -strip sample2.…

写真のExiftをJSONで取り出す。

ファイルのExiftをJSONで取り出したい。 EXIFをJSONで取り出せたら、集計が便利なんじゃないのかと思って調べたら、対応していた。 exiftool -s -G -j ファイル名... 実行サンプル exiftool -s -G -j 2021-04-04_15-56-43_926.heic | jq . 出力サンプル [ { …

jc と jq の組み合わせで、ファイル名のクォートが便利

jc と jq の組み合わせで、ファイル名のクォートが便利 ファイル名にスペースが入る 次のように、ファイル名にスペースが入って、コマンドで処理するときにIFS(区切り)として解釈されちゃってとっても邪魔。 takuya@:$ls -l *5576* -rwxrwxrwx 1 takuya ta…

montage(画像を並べる)するときにファイル名を入れたい。

montage するときにファイル名を入れたい 画像をならべて、インデックスの画像を生成したい。 インデックスプリントのような、証明写真のような、写真をならべてサクッとインデックス・プリントにしたい。 似た写真があるときに並べて表示することで「違い(…

コマンドの結果をJSONの配列やオブジェクトにする。- jc コマンド

コマンドの結果をいい感じに、配列にしたい コマンドの実行結果をJSONにしたいと思った。 https://dev.classmethod.jp/articles/jc-tool/ jc コマンド jc コマンドは、STDINを読み取って JSONに変換してくれる。 数多くのパーサーが用意されてプリインいる、…

ubuntu / debian で wake on lan ( WOL ) を送信する

ubuntu / debian で wake on lan ( WOL ) を送信する wake on lan コマンド wakeonlan MAC_ADDR インストール sudo apt install wakeonlan パッケージで提供されているのでサクッと使えます。 コマンドの実行例 sudo wakeonlan 70:85:xx:xx:e6:xx [sudo] pas…

rbash で制限付きのシェルを作って安全を確保する

bash で何でもされるのが怖い?なら rbashはどうですか? rbash は bash の機能の一つで 「機能制限をされたbash」を提供するためのものです。 rbash とは、制限付きのシェル(RESTRICTED SHELL) の略です。 rbash の正体 bash -r rbash コマンドは /usr/bin/…

シェルスクリプトで変数と文字列を展開(置換)する

変数を文字列に展開するenvsubst envsubst を使えば、文字列と変数を置換できる。つまり変数を展開できる。 利用サンプル echo "HELLO \${HELLO}" | HELLO=takuya envsubst テンプレートを作れる これを利用すれば、テンプレートを作って文字列を作成するの…

OPNSenseのAPIでファイアウォールのAliasを更新する。API利用例

OPNSense設定を更新したいのでAPIを利用する OPNSenseの設定を更新しようと思うと、APIを使うのが手っ取り早い。 APIはJSONでGET/POSTができる。APIで設定を取得したり、更新したりができる。 https://docs.opnsense.org/development/api/core/firewall.html…

ssh の HashKnownHosts に追加する方法を知り、StrictHostKeyCheckingをちゃんと使えるようになる。

ssh の HashKnownHosts に追加する方法 HashKnownHosts を有効にしていると、 .ssh/known_hotss がハッシュ化される。 これにより、どのサーバーと通信していたか、関係性の秘匿が可能になる。 hash を使う known hosts のために嫌がらせなんじゃないかと最…

ssh-agentをログイン時に起動する。

ssh-agentを使う 非暗号化ディスクにSSH鍵をパスフレーズ保護なしに保存するのは危険。 ストレージからSSHの秘密鍵を取られたら目も当てれない。 そして、known_hostsから接続先がわかってしまうと。もう最悪。 そのために、SSHを安全に扱うには、known_host…

bash でコマンドがエラー終了したことを検出する。

bash でコマンドがエラー終了を調べてなんとかする。 シェルスクリプトのコマンドでエラーが起きたら、エラー表示したり、コマンド失敗のエラー手続きを実行する なれてたら簡単なのですが、例外になれたプログラマや非表示の暗黙ステータスコードを使うのが…

GNU Screen の終了

screen を終了する GNU Screen をどうやって終了するのか。 いつも忘れるので、メモする。 とくに、ttyS0 を使ったシリアル通信をするときに困るのでメモを残す。 方法1 :quit ctrl-a : (エスケープキー+コロン) でコマンド入力モードに入る コマンド入力…

シェルでファイル名をエスケープにしてクォート地獄を解決する。

シェルスクリプトで、ファイル名をエスケープする シェルスクリプトで、括弧()やスペースなどの文字種をエスケープしたいときに手早い方法がないか。 printf が手軽だった。 printf "%q" 文字列 実際の例ーカッコ 次のようにいい感じにエスケープしてくれ…

bashで入力しやすく見やすいパスワードをサクッと作る(シェルコマンドでハイフン区切りのパスワード生成)

シェルコマンドだけで、覚えやすいパスワードを作りたい iOS のパスワードジェネレーションみたいな、ハイフン区切りのパスワードをサクッと作りたい。 pwgen を入れるとはやい。 sudo apt install pwgen pwgenのパスワードをハイフン区切りにする takuya@$ …

bashで文字列の中身の変数名の値を取り出す(可変変数・間接参照)

bash で配列に入れた文字列を変数として解釈する 変数の文字列を、変数として解釈する。 echo $name=${!name} たとえば変数調べるときに変数名を列挙して中身を全部見るとか。 #!/usr/bin/env bash for i in ip mask subnet subnet interface router ; do ec…

grep の後方参照の代替案 4つ

grep では 後方参照ができないので、代替案を考えることになる。 方法1基本的な方法 -o マッチした箇所だけを取り出す -o を使って、マッチした箇所だけを取り出す。 cat out.txt | \grep -Po 'Abc.*Xyz' 方法2 先読み+あとよみ 先読み・後ろ読みにマッチ…

bashスクリプトで標準入力か引数のどちらかを取得する

STDINか引数を処理するコマンドを作りたい。 たとえば、次のようなコマンドを作りたい。 標準入力があるときは、標準入力を使い、それ以外は引数を使う。 echo AAA | to_lower to_lower AAA to_lower の例。 ヒアストリングに展開すれば楽ちんです。 <<< ${@…

改行を維持して 変数をechoする。

改行を維持して echoする。 改行を保持したまま、変数を出力したい ダブルクォーテーションすることで改行が出る 変数定義 STR=" aaa " 出力例 echo $STR ## 改行が出ない echo "$STR" # 改行がでる 変数をダブルクォーテーションでクォートすると、変数内に…

wget が ipv6 につないでしまう。aliasでIPv4 に限定する

wget が v6アドレスを使ってしまう。 wgetで、v6アドレスを呼びに行ってしまう。NTTの壊れたフレッツ v6 ネットワークで大問題が起きている。 IPoEに早く対応させたほうがいいけど。v6のアドレスをIoT家電が山盛りの家庭内に頒布するのは躊躇われる。 wget …

コマンドが存在するか調査するコマンド、その名もcommand

コマンド存在スルか調査するコマンドに command が使えます。 $ command -v ls ; echo $? alias ls='ls --color=auto' 0 シェルの実行結果は 1/0 で戻されています。 echo $? は直前のシェルの実行結果$? を出力しています。正常終了なら0 異常終了なら $? >…

シェル ( /bin/sh ) での正規表現マッチ。

以前、bash の正規表現について書いた。 今回は、今更だけど、あえて、bash/zsh で使われている [[ を使わずに、正規表現を使おうとしてみた。 expr よりは bash の機能を使ったほうがいい。 以前書いた記事にある。bash/zsh の正規表現を使う方法が個人的に…

空白を含むパス名を含むコマンド文字列をシェル(bash)で処理する

" program files " のような空白を含むパス名を持ったコマンド全体を、変数に保持しててそれを実行したい時 そのままだと動かない。 ## これが実行できない。 cmd='ls ~/Library/Application\ Support/' $cmd 空白を含むパス名を入れたコマンドを文字列とし…

ディレクトリの中のファイルを「時刻」でソートする find と lsをつかって、最新のファイルだけを取り出す。

ls コマンドの場合 ls -t | head -n1 ls コマンドで、時刻順に並べることができるので、これを head と組み合わせれば出来る。 takuya@Gitlab:~$ sudo ls -lt /var/opt/gitlab/backups/ total 92268132 -rw------- 1 git git 43629199360 Apr 25 02:20 15877…

指定したファイルが存在するフォルダを指定する

画像が入ったフォルダを取り出したい。 Nextcloud を触っていて、画像が散らばってしまった。なので、画像大量に入ったフォルダを調べることにする。 となると、どんな方法が良いか思案したが、一番手っ取り早いのは find コマンドだろう find コマンドでjpg…

findコマンドでファイルの所有ユーザーを調べ所有者を間違っているファイルを探す。

find コマンドで、自分以外の所有者のファイルを探す。 ユーザーがtakuya 以外のファイルやディレクトリを探す。 find . -not -user takuya 指定した所有者のファイルを探す。 not を外せば、所有者を限定してファイルを探す。 find . -user takuya オーナー…

指定サイズのファイルを作る方法 ( head 編 )

任意の指定サイズのファイルを作る方法 head を使う場合。 takuya@~$ head -c 100k /dev/urandom > out takuya@~$ ll out -rw-r--r-- 1 takuya staff 100K 2020-03-18 13:59 out ランダム( /dev/urandom) から読み出して、指定サイズを作ります。 head は -c…

GLOBIGNORE で一時的に*(ワイルドカード)のglob 展開を止める。

bash / sh を使ってると glob が邪魔な時がある。 シェルスクリプトを書いていると、 * のワイルドカードの展開がじゃまになるときが多々あります。 その都度エスケープ刷ることが多いと思います。 たとえばワイルドカードを受け取ってあとで展開するような…