職場や自宅では、クライアントマシンとしてMacを使っている(+Manjaro in Thinkpad)。 で、個人的にその日の作業用に日付別のディレクトリ(自分の場合は~/Work/YYYYMM/YYYYMMDD/)を作っておいて、そこに一時ファイルやダウンロードしてきたファイル、その日のメモなどを配置するような使い方をしている。

このとき、ダウンロードディレクトリ (~/Downloads)を日付別のダウンロードディレクトリ(~/Work/YYYYMM/YYYYMMDD/Downloads)のシンボリックリンクとすることで、ディレクトリが日付別になっていることを意...


少し前(というか2019年の年末)に、Twitterでファイルをコマンドで利用したあとにリダイレクトで上書きしてはいけないよねというツイートがあった。

これは結構やってしまう(そしてやらかして学習する)人が多いと思うのだけど、shellの解釈の順序の関係でコマンドの処理より先にリダイレクトの処理が...


先日実施された第45回シェル芸勉強会に出席してきたので、その復習。 前回の45回はawkでゴリゴリ解いていくような問題が多かったのだけど、今回はいろんなコマンドを組み合わせて解いていくような問題が多めになっているらしい。

問題および模範解答はこちら。あと、問題を解くに当たって必要になるファイルは以下のコマンドで取得してくる。

git clone https://github.com/ryuichiueda/ShellGeiData

Q1.

csvファイル「data.csv」に、日別のトマト・バナナ・ピーマンの売れた個数が書かれているので、それぞれが記録されている最後の日の日付...


よく作業用のディレクトリとかを一定期間ごとにtar(+gzip)でアーカイブしてあるのだが、たまに過去のデータを調べるためにそのアーカイブしたファイルの中を検索したい事があったりする。 そういった際にいちいちアーカイブを展開して調べるのは面倒なので、なんかいい方法が無いかなと考えていたところ、どうやらGNU tarだと「--to-command」で指定したコマンドに対し、標準入力でtar内のファイルの中身を渡すことができるらしい。 なので、環境変数でtar内のどのファイルなのかも出力させることができる。

ただ標準入力から受け付けてるので、tar内のどのファイルに指定した文字列が含まれて...


ふとした思いつきで、bashやzshのhistoryファイル(通常は環境変数のHISTFILEで指定したファイル)以外のファイルに、任意のフォーマットで実行したコマンドや実行時間、カレントディレクトリといった情報を記録できないだろうかと思ったので、試してみることにした。 今回はファイルに出力しているが、中の処理を書き換えれば実行履歴をDBに記録することもできると思うので、もし利用する場合は使い方に応じて適宜書き換えて貰えればいいだろう。

なお、この方法は単純にシェルの設定で対処しているだけの方法なので、ログの記録を強制できるというものではない(回避することは可能なはず)。 もし実行コマンド...


ごくごくたまにではあるのだが、GoogleやらBingの検索結果を一覧で取得することがあったのでそういうスクリプトをこさえて対応していた。 で、その実行結果で特定のドメインの検索結果からPATHごとにどのようなGETパラメータが使われているか集計したいということがあった。

具体的に言うと、例えば自分がよくお世話になっている上田先生のブログ(https://b.ueda.tech/)で検索かけて、その結果となるURLの一覧を抽出したとする(上田先生勝手にスミマセン…)。 その場合、以下のようなURLの一覧が取得されるのだが、そのPATHごとにどのようなGETパラメータをのパラメー...


たまにlogを見ながら作業をしたりすることがあるのだけど、そういうときサーバによってはログの日付がGMTで記録されてたりする。 ここは日本であり、やはり自分もJSTで普段生活しているので、いちいち脳内で+9時間して読み取るのはちょっとだるい。できればJSTになってる時刻でログを読みたいところ・・・。

というわけで、取得したログをJSTに変換して出力する方法について考えてみることにした

1. awkで日付を変換する(外部コマンド使用)

apacheのログなんかだと、デフォルトでは日付の表記が「28/Nov/2019:09:03:19」のようになってしまっている。 これだとちょっと...


Twitterをボケーッと眺めていたところ、xargsで呼び出したコマンドにキー入力をしたいという内容があったので、どうやったらできるのか調べてみた。

通常、対象のプロセスで標準入力が開いてないとだいたいの(というか、普通の)コマンドは処理を待たずに終了してしまう。なので、なんとかしてターミナルを標準入力として渡してやればいいということになる。

1. /dev/ttyを読み込ませる

以下のように、/dev/ttyをxargsで呼び出したコマンド内部で読み込ませる事で、ターミナルの入力を渡すことができる。


先日のシェル芸勉強会において、awkで巨大な数字を取り扱うという内容があった。 awkでは、巨大な数字を扱おうとすると以下のようなエラーが出力されることがあるのだけど、これを回避する方法について考えるという内容だった。

$ echo|awk '{print(999^300)}'
+inf

Stack Overflowとかを漁っていると、どうも53bit分までのデータしか扱えないため、それ以上の数字になるとinfとして扱われてしまっている模様。

c++ - Does big integer in AWK only have 53 bits? - Stack Overflow

...

先日行われたシェル芸勉強会の中で、別のファイルから1行ずつデータを取得させたいということがあった。 いろいろとやり方を調べたりしていたのだが、その中でくんすとさんがいい感じの回答をしていた。

cat speech | awk 'NF==0{getline< "speech2"}{print}'#シェル芸

実行例を書いてみる。 以下の例では、「seq.txt」の空行に「aiueo.txt」というファイルの中身を差し込んでいっている。


pythonで簡単なCUIのツールを作っていたとき、pipでインストール時にbash/zshの補完ファイルも一緒にインストールさせたいというのがあったので、やり方について調べてみた。 で、結論としては以下のようなsetup.pyを作成すれば良さそうだということがわかった。


ちょっとしたツールをPythonで作ったので、pipインストールできるように以下のようにsetup.pyを書いてたのだけど、どうもinstall_requiresが処理されないということがあった。

setup.py
import os import platform import setuptools from hoge import __version__ if __name__ == "__main__": setuptools.setup( name='hoge', version=__version__, ins...

先日実施された第44回シェル芸勉強会に出席してきたので、その復習。 今回は実用的な内容…ということだったのだが、そうはならんかったらしい(´・ω・`)。 冒頭で、awkなどでゴリゴリ書いていく問題がメインらしいので、多分難しめなんだろうなぁと思ったけど、おわってみたらやはり難しい問題が多かった。

問題および模範解答はこちら。あと、問題を解くに当たって必要になるファイルは以下のコマンドで取得してくる。

git clone https://github.com/ryuichiueda/ShellGeiData

Q1.

数独の問題で、マップ?のデータから各行列にどのような値が入って...


tmuxでアクティブpaneかどうかでの色分けをpane_synchronizedに応じて切り替える

普段あまりtmuxを使っていないのだけど、tmux.confの設定でアクティブなpaneかどうかで色を分けるといった対応をしていたりする。 ↓こんな感じ。

で、pane_synchronizedかどうかに応じてこのアクティブなpaneだけ色を変えるのをtmux.confで変更したいということがあったので、その備忘。 対処方法だが、ちょうど自分がpane_synchronizedの切り替えをショートカットキーでトグル切り替えで処理していたので、以下のようにtmux.confに記述することで対処した(自分のtmux.confから抜粋)。

#-----------------------...

Dockerにbashでログインする際、手元の環境のbashrcやvimrcを使って直接ログインしたいということがある。 原理的にはsshの場合と同じやり方でできるだろうということでやってみた。

とりあえず、以下のようなコマンドでローカルのbashrcを使ったログインが可能だ。 (読み込ませているbashrcのPATHは自分の環境のものなので、適宜書き換えが必要。)

docker run --rm -it コンテナ bash -c '/bin/bash --rcfile <(echo -e '$(cat ~/dotfiles/{.bashrc,sh/{sh_function,sh_...

あまり仕事とかではないのだけど、たまにコンソール上で全く同じ値を持つ以下のようなテキストから、ユニークな値(今回の場合はB)だけ色を付けたいと思うことがある。

A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A B A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A

一番簡単なのは、grepでユニー...


Reverse Shellで接続する際、普通にncやsocatで受け付けて処理すると間の通信が暗号化されてないので、パケットキャプチャすると何してるのか見えてしまったりする。 これはあまりよろしくないことが多いので、OpenSSL経由でReverse Shellを使うことで間の通信を暗号化してみることにする。

なお、証明書はオレオレ証明書にする(ちゃんとした証明書使ってもいいけど、この用途でわざわざやる必要もないかなと…)。

1. Listen側

まずはオレオレ証明書の作成から。(すでにあるならやらなくていいかも)

openssl req -x509 -newkey rsa...

最近になってReverse Shellをちょっとだけ使う機会があったのだけど、前に学習してたよりいろいろと便利なやり方とか方法がいろいろとあるのを知ったので、ちょっとまとめてみることにした。

1. 受付側のコマンド

実行側のシェルを受け付ける側。listen。

1-1. ncを使う場合

nc -nlvp 

1-2. socatを使う場合

socat tcp-listen:,reuseaddr,fork stdout


先日行われたシェル芸勉強会でそういった問題が出てたのだけど、絵文字をすべて削除したり置換する方法って今後使うこともありそうなので、これだけ抜き出して記述しておくことにする。

Perlを使う場合

Perlの場合、Unicode Propitiesというのがあるので、それで絵文字として指定…できればよかったんだけど、残念ながらそのブロック単位では無いらしい。 もうちょっと小さい単位で定義されているので、こういうときに一発で指定が出来ない。なので、使う文字ブロックだけを指定してやるとよさそうだ。

command ... | perl -C -ple 'use utf8;s/[^\p{BasicLatin}|\p{Katakana}|\p{Hiragana}|\p{Han}|\p{CJKSymbolsAndPunctuation}|\p{HalfwidthAndFullwidthForms}]//g'

先日実施された、第42回シェル芸勉強会に参加してきたので、その復習。
今回は難しめにしたとのこと。

問題はこちら。最初に、問題等に使用するファイルをgitからcloneしておくといい。(といっても、ファイルは1個しかない)

git clone https://github.com/ryuichiueda/ShellGeiData

Q1

「正の整数の組(x, y, z)について、x + xy + xyz = 1234, x < y < zを満たす組み合わせを全て選べ」という問題。 数学オリンピックから出題されていた問題をちょっと改変した問題らしい(多分オリジナルはこれ)...


最近は、Goで自作してる sshクライアントコマンド(lssh) の機能追加を主にやってる(で、こっちあまり更新してない(´・ω・`))。

実はちょっと前、下のようなツールを見かけて、それと同じようなことが自作のsshクライアントやりたいと思って機能追加していたのだけど、それがやっとできるようになった。 これが何なのかというと、sshで複数のノードにパラレル接続して、そのままプロンプト上からインタラクティブにコマンドを流せるというツールで、便利そうだしすごくかっこよさげなのだ。

An interactive parallel ssh client featuring autocom...


Golangで、パイプからの標準入力を受け付けつつ、さらにキーボードからの入力を別に受付させたいということがあった。 で、前に シェルスクリプトの場合だと/dev/ttyから受け付けすることができる 、という内容について記述したことがあったが、それと同じようにすることで実現できるようだ。

sample_keyinput_and_pipe.go
package main import ( "fmt" "io" "log" "os" "time" "golang.org/x/crypto/ssh/terminal" ) fun...

自作のsshクライアントコマンドで~/.ssh/configを読み込んで処理させる機能を追加したかったのだが、ProxyCommandがネックになっていたため今まで実装を見送っていた。 で、久しぶりになんか情報ないかなと探してみたところ、net.Pipe()を利用したら処理できるという情報を見かけた。

ProxyCommandはローカルで実行するコマンドになるので、そのコマンドの出力をPipeで繋げていけばいいようだ。なるほど…(´・ω・`)。 というわけで、さっそく実装してみた。こんな感じのコードで.ssh/configから指定したホストの情報を取得して、かつProxyCommand...


sedで置換結果にANSI Escapeを使って色付けをする

時折、sedで置換する際にエスケープシーケンスを使って文字の色を指定したい場合というのがあると思うけど、それについて今まで把握してなかったので備忘で残しておく。 sedでエスケープシーケンスを表現する場合、残念ながらechoのときのように\eとかで表現しても置換できない。じゃあどうすればいいのかというと、エスケープを文字コード(\x1b)で記述してやることで表現できる。

sed 's//\x1b[32m\x1b[0m/g;'

実際に動かしてみるとこんな感じ。 ちゃんと色が付与されているのがわかる。


OpenSshサーバでは、特定のCA証明書が署名した証明書(+秘密鍵)で認証ができるように設定することができるらしい。 (自前のsshクライアントに機能を追加する際のテストサーバ用途ではあったのだけど)実際にやってみたので、備忘で残しておくことにする。

1. CA(秘密鍵、公開鍵)とユーザ(秘密鍵、公開鍵)の用意

まず当たり前の話ではあるのだが、CAの鍵とユーザの鍵の2種類が必要になるのでそれをまず作成する。(CA側・ユーザ側ともにすでに作成済の場合は飛ばしてしまってOK) CA側は管理者が署名をするための鍵なので1個だけ、ユーザ側は各ユーザが利用するためのものなのでユーザの数だけ...


先日行われたシェル芸勉強会に行ってたのだが、そこで漢数字やローマ数字をラテン数字に変換できる numconv なるコマンドの存在を知った。

どうやらパッケージは用意されているようだが、管理システムでインストールできるのはaptだけのようだ。 brewやyum、pacmanでは入れられないので、用意されているパッケージファイルを利用するか、ソースからコンパイルする必要がある。

apt install numconv

先日実施された、第41回シェル芸勉強会に参加してきたので、その復習。(最近はツールの作成の方ばっかやってて、ブログ 書くの久しぶりだなぁ…(´・ω・`)) 4月開催というのもあってか、いつものに比べたらマイルド?らしい。(確かにまぁ、そう言われるとそうかも…?) 今回はsortの処理に主眼を置いたとのこと。

問題は こちら 。最初に、問題等に使用するファイルをgitからcloneしておくといい。 今回はsortが主題ということもあってか、結構ファイルを使うようだ。

git clone https://github.com/ryuichiueda/ShellGeiData

ここ最近、仕事が変わったのと Rustでこさえてたツール の改修に手間取っててあまり触ってたなかったのだけど、ある程度一段落したので Goのsshクライアントの改修 に着手した。 で、sshでの接続方式というといくつかあると思うが、最近はYubikeyをPIVカードとして利用して、Yubikey内の秘密鍵を使ってssh接続するというやり方もあるので、それをGolangで実装しようと思いやってみた。

これ、実はかなり手間取ってしまい、結構時間がかかってしまった…。 Yubikey等のPIVカードに入ってる秘密鍵を使ってssh接続する場合、OpenSCなどのPKCS11を扱えるライブラ...