20190203のLinuxに関する記事は7件です。

Linux基本のキ

Linuxの特徴から、ディレクトリ構造などの概念について、まとめます。
ページ最下部の参考資料から文章を抜粋し、まとめさせていただいています。

Linuxの特徴

  • オープンソース(※1)であり、誰でも自由に無償で利用できる。
  • 品質の高い多くのソフトウェア(WebサーバのApache HTTP Serverや、 データベースシステムのMySQL等)が利用できる。
  • 世界中でサーバ用途として広く利用されているため、信頼性が高い。
  • 操作を自動化するための仕組みが用意されており、サーバの運用が行いやすい。

※1 オープンソース
オープンソースとは、ソースコードが公開されており、誰もがソースコードにアクセスできるだけでなく、開発に参加できるソフトウェアや、考え方のこと

Linuxのディストリビューション

ディストリビューションとは?

流通・分布を意味する言葉で、Linuxの配布形態のこと。本来、Linuxはカーネルのみを指すため、そのままでは動作しない。そのため、ユーザーが手軽にLinuxを利用できるように、OSの動作に必要なライブラリーやソフトウェアなどをまとめたパッケージとして配布されている。また、これらのディストリビューション業者などをディストリビューターと呼ぶ。Linuxの主なディストリビューションとして、Turbolinux、Vine Linux、Red Hat Linux、Debian GNU/Linuxなどがある。(コトバンクより引用)

つまり、Linuxを動かすために必要なソフトウェアや、自分の欲しい機能などを自分で一からインストールしなくても、もとからユーザが使いやすいように、よく使うものをまとめてくれたもの(ディストリビューション)をインストールすれば、簡単にLinuxを動かすことができるのです。

主なディストリビューション

ディストリビューション 説明
Ubuntu 無償で、デスクトップ版、サーバ版がある。
Red Hat Enterprise Linux 有償で、企業のサーバとして使われている。
CentOS 無償で、Red Hat Enterprise Linuxと高い互換性がある。
Debian GNU/Linux 無償で、自由なソフトウェアに価値を置く。Ubuntuの大元。
Raspbian Debian GNU/LinuxをRaspberry Pi用に改変したもの。
Fedora 無償で先進的な機能を搭載。Red Hat Enter Prise Linuxの実験版的位置づけ。

ちなみに私は、自宅学習用ではCentOS、会社ではRed Hat EnterPrise Linuxを使用しています。

Linuxのディレクトリ構造

Linuxでは、ディレクトリがツリー上の階層構造になっています。
ディレクトリの頂点は「/(ルート)」ディレクトリで、
全てのディレクトリ、ファイルは/ディレクトリの中に収められています。

/ディレクトリ直下には、主要なディレクトリが収められており、それぞれのディレクトリには役割があります。
主要なディレクトリは、ディストリビューションごとに異なります。

ディレクトリ 説明
bin 一般ユーザが実行できる基本コマンドが格納される
boot システムの起動に必要なファイルが格納される
dev 各種デバイスを表す特殊ファイルが格納される
etc システム設定ファイルが格納される
home ユーザのホームディレクトリが格納される
lib ライブラリファイルが格納される
lost+found 破損したファイルが格納される
media DVDなどの外部メディアがマウントされる
proc プロセス情報が格納される
root rootユーザのホームディレクトリ
sbin システム管理用の基本コマンドが格納される
tmp 一時的なファイル置き場
usr 各種コマンド、プログラム、ライブラリ、ドキュメントが格納される
var ログファイルなど更新されるファイルが格納される

システム起動の流れ

BIOS/UEFIブートローダカーネルinit/systemd

BIOS

最もハードウェアに近い部分をつかさどるシステムで、物理的なハードウェア(マザーボード)上に書き込まれています。
コンピュータの電源を入れると、まずこのBIOSが起動し、記憶装置(HDD)などに関して最低限の認識をして起動デバイスの優先順位を決定します。
その後、起動する順にデバイスの先頭セクタにあるMBR(ブート用の特殊領域。ブートローダが格納されている場所)を読み込み、得られたブートローダに制御を移します。ブートローダが得られない場合は次のデバイスのMBRを読み込みます。
最近のシステムでは、UEFIへの移行が進んでいます。

ブートローダ

MBRには厳しいサイズ制限があるため、MBRに格納されている第一段階部分と、記憶装置内の別の場所に格納されている第二段階部分に分かれています。
ブートローダは記憶装置内のカーネルをロードし、カーネルに制御を映す役割を果たします。
第一段階のブートローダはMBRの先頭446バイトの領域にインストールされます。

カーネル

カーネルは起動されると、高度にハードウェアを認識・制御し、ルートパーティションのマウントなど様々な初期化処理を行います。
その後、initという特別な最初のプロセスを起動します。

init

最初に起動されるプロセスで、PID(プロセスID)は必ず1です。
「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、
「/sbin/init」が起動されます。
initプロセスは設定ファイル「/etc/inittab」の記述に基づいて、自動起動するべきプロセスを立ち上げるなど、アプリケーションレベルの初期化を行います。
以降、initプロセスはすべてのプロセスの先祖(直接・間接的な呼び出し元)として存在し続けます。
なお、最近のシステムではinitプログラムとして、初期化処理を高速化したUpstartやsystemdを採用している場合があります。
その場合は基本的に「/etc/inittab」ファイルは使用されません。

参考資料

・いちばんやさしいLinuxコマンド入門教室 中島能和 著 株式会社ソーテック社
・新しいLinuxの教科書 三宅英明、大角雄介 著 SB クリエイティブ株式会社
Ping-t

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

複数のファイルを終端に改行がなければ改行を追加して結合する

SSH の authorized_keys や SSL 証明書でサーバ証明書と中間証明書を結合するとき、単に複数のファイルを結合するなら cat すればいいだけですが、ファイルの終端が改行で終わっていない場合、改行なしでファイルが連結されてしまうことがあります。

例えば server.pem と chain.pem があったとして server.pem の終端が改行で終わっていないと cat server.pem chain.pem

-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----

などとなってしまいます。

cat ではなく awk 1 で連結すれば OK です。

awk 1 server.pem chain.pem
-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----

パイプするときも awk 1 を通せば終端が改行でなければ改行が追加されます。

curl -s http://gitlab.example.com/oreore.keys | awk 1

gitlab から公開鍵を取り出すと改行が無いので割と罠です。


1 は、パターンが 1 という式で、アクションは省略、という意味です。

パターンに式を記述した場合、0 ではない数字、または、空ではない文字列、のときにマッチと評価されるので、1 なら常にマッチします。

アクションが省略された場合は {print} となります。つまり、全行で print が行われます。

awk は最終行は改行が無くても行と認識します、そして print は行を改行付きで表示します。


いつも authorized_keys で awk 1 してるのなんで?と聞かれたのでその理由。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

awkでログ解析〜レスポンス時間を添えて〜

まず

ログの解析で、時間ごとの集計(例えば○月☓日の△時〜◇時までのアクセス数)とかは割と簡単にできた(というよりQiitaとかにたくさんやり方が載っている)が、アクセスに対してどれくらいレスポンスに時間がかかったとか、24時間でアクセスが0件だったものも表示する、というお題が出されて苦戦しました。しかも一行で。

実行環境

  • Linux
  • Apache
  • bash

実際にやってみる

例えばこんな感じのログがあったとする
Apacheのログはhttpd.confカスタマイズ可能なので、今回は最後にレスポンス時間(ミリ秒)を表示させています。

access_log.2019-02-03.txt
xxx.x.x.x - - [03/Feb/2019:04:03:00 +0900] “POST /test/a HTTP/1.1” 200 213
xxx.x.x.x - - [03/Feb/2019:10:26:20 +0900] “POST /test/b HTTP/1.1" 200 213
xxx.x.x.x - - [03/Feb/2019:10:26:21 +0900] “POST /test/b HTTP/1.1” 200 244
xxx.x.x.x - - [03/Feb/2019:10:26:21 +0900] “POST /test/c HTTP/1.1" 200 77
xxx.x.x.x - - [03/Feb/2019:10:26:23 +0900] “POST /test/c HTTP/1.1” 200 285
xxx.x.x.x - - [03/Feb/2019:10:26:23 +0900] “POST /test/c HTTP/1.1" 200 77
xxx.x.x.x - - [03/Feb/2019:10:26:26 +0900] “POST /test/d HTTP/1.1” 200 77
xxx.x.x.x - - [03/Feb/2019:10:26:26 +0900] “POST /test/e HTTP/1.1" 200 14531
xxx.x.x.x - - [03/Feb/2019:10:26:36 +0900] “POST /test/f HTTP/1.1” 200 11526
(以下省略)

一時間ごとで集計する

ここからいらない情報を削って、一時間ごとで集計する

awk '{print $4}' access_log.2019-02-03.txt | cut -b 2-15 | sort | uniq -c | sed "s/03\/Feb\/2019:/2019\/02\/03 /g" | awk '{print $2,$3":00","#",$1}'

以下、出力結果

2019/02/03 04:00 # 1
2019/02/03 10:00 # 28
2019/02/03 12:00 # 4
2019/02/03 13:00 # 18
2019/02/03 14:00 # 216
2019/02/03 15:00 # 1
2019/02/03 16:00 # 2
2019/02/03 17:00 # 218
2019/02/03 18:00 # 5109
2019/02/03 19:00 # 4502
2019/02/03 20:00 # 4941
2019/02/03 21:00 # 1037
コマンドの解説

awk '{print $4}' access_log.2019-02-03.txt
ファイルから各行の4列目を取得してprintする。日付と時間を取得する。

cut -b 2-15
先ほど取得したのが[03/Feb/2019:04:03:00となっているので、03/Feb/2019:04に変更する。

sort | uniq -c
uniqコマンドにオプション-cを指定すると重複したものを一行にまとめて、件数を一列目に表示してくれる。ただその前にデータが整列されている必要があるのでsortをする(実際ログデータは時間順に整列されているので必要ないのですがw)

sed "s/03\/Feb\/2019:/2019\/02\/03 /g"
これも実は必要なくて、個人的に年/月/日で表示したかったのと、日付と時間の区切りをスペースにしたかったので書いていますw

awk '{print $2,$3":00","#",$1}'
最後に時間表示がたとえば04:00とかになるようにするのと、件数をわかりやすく(?)するために#をつけて、最後尾に表示するために並び替えて表示する。

問題点

上記コマンドだとログ0件の時間が取得できていないのと、レスポンス時間で分けられていない。
順を追って実現していきましょう。

0件を表示させる

uniq -cで重複をまとめて件数を表示しているので、0件のものはそもそもカウントできない。ので、各時間に1件ずつダミーを表示して、最後に1を引く、というパワープレイをします。

(awk '{print $4}' access_log.2019-02-03.txt | cut -b 2-15 | sed "s/03\/Feb\/2019:/2019\/02\/03 /g" ; for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23; do echo "2019/02/03 $i"; done ) | sort -k 2 -n | uniq -c | awk '{print $2, $3":00", "#", $1-1}'

先程のものに0件が追加で表示された

2019/02/03 00:00 # 0
2019/02/03 01:00 # 0
2019/02/03 02:00 # 0
2019/02/03 03:00 # 0
2019/02/03 04:00 # 1
2019/02/03 05:00 # 0
2019/02/03 06:00 # 0
2019/02/03 07:00 # 0
2019/02/03 08:00 # 0
2019/02/03 09:00 # 0
2019/02/03 10:00 # 28
2019/02/03 11:00 # 0
2019/02/03 12:00 # 4
2019/02/03 13:00 # 18
2019/02/03 14:00 # 216
2019/02/03 15:00 # 1
2019/02/03 16:00 # 2
2019/02/03 17:00 # 218
2019/02/03 18:00 # 5109
2019/02/03 19:00 # 4502
2019/02/03 20:00 # 4941
2019/02/03 21:00 # 1037
2019/02/03 22:00 # 0
2019/02/03 23:00 # 0
コマンドの解説

for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23; do echo "2019/02/03 $i"; done
for文で00時から23時まで気合いで表示。

sort -k 2 -n | uniq -c
最初のawkからこのコマンドの前まで( )がついているのは、括弧がないと、おそらくfor文の中の;をbashが勘違いして処理をわけてしまって正しくsortできなかったから。
-nで数字として、-kオプションで2つ目の値を基準に並び替えています。

awk '{print $2, $3":00", "#", $1-1}'
最後にここで1を引くことで辻褄を合わせるw

レスポンス時間で分ける

今回はとりあえずレスポンスに3秒かからなかったもの、3秒以上10秒未満、10秒以上のものに分類。各時間で3行ずつ表示、それを最後に形を整えて表示させる戦法でいきます。

(awk '{print substr($0, index($0, "03"))}' access_log.2019-02-03.txt | sed -e "s/ /:/g" -e "s/03\/Feb\/2019/2019\/02\/03/g" | awk -F : '{print $1,$2,$10}'| awk '{if($3<3000){print $1,$2,"03"} else if($3>=3000&&$3<10000){print $1,$2,"05"} else {print $1,$2,10}}'; for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23; do for j in 03 05 10; do echo "2019/01/09 $i $j"; done; done) | sort -k 2,2 -k 3n | uniq -c | awk '{print $2,$3":00", $1-1" "}' | awk 'NR % 3 != 0 {printf $0;} NR % 3 ==0 {print $0}' | awk 'BEGIN{print "date", "hour", "0-3s", "3-10s", "10s-"}{print $1,$2,$3,$6,$9}'

レスポンス時間で分けられた。

date hour 0-3s 3-10s 10s-
2019/02/03 00:00 0 0 0
2019/02/03 01:00 0 0 0
2019/02/03 02:00 0 0 0
2019/02/03 03:00 0 0 0
2019/02/03 04:00 1 0 0
2019/02/03 05:00 0 0 0
2019/02/03 06:00 0 0 0
2019/02/03 07:00 0 0 0
2019/02/03 08:00 0 0 0
2019/02/03 09:00 0 0 0
2019/02/03 10:00 20 3 5
2019/02/03 11:00 0 0 0
2019/02/03 12:00 4 0 0
2019/02/03 13:00 13 1 4
2019/02/03 14:00 215 0 1
2019/02/03 15:00 0 0 1
2019/02/03 16:00 2 0 0
2019/02/03 17:00 217 0 1
2019/02/03 18:00 5109 0 0
2019/02/03 19:00 4501 0 1
2019/02/03 20:00 4941 0 0
2019/02/03 21:00 1037 0 0
2019/02/03 22:00 0 0 0
2019/02/03 23:00 0 0 0
コマンドの解説

awk '{print substr($0, index($0, "03"))}' access_log.2019-02-03.txt | sed -e "s/ /:/g" -e "s/03\/Feb\/2019/2019\/02\/03/g" | awk -F : '{print $1,$2,$10}'
今回は日時以外にレスポンス時間も取得しなくてはいけない。やり方はなんでも良いので、とりあえず今回はまずは日付までの部分を削除。それからスペースを:に置換して、それを区切り文字として指定して日時とレスポンスを取得。
(取得できればやり方はなんでもいいと思います。)

awk '{if($3<3000){print $1,$2,"03"} else if($3>=3000&&$3<10000){print $1,$2,"05"} else {print $1,$2,10}}';
レスポンス時間が3秒未満、3秒以上10秒未満、10秒以上のものにそれぞれ03,05,10と印を付ける。3つに分類できれば何でもいいのだけど、あとでsortしたときに順番がこの順番になるように気をつけてください。

for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23; do for j in 03 05 10; do echo "2019/01/09 $i $j"; done; done
for文の中でfor文を記述します。先程の0件表示と同じように各時間、各レスポンスでダミーを1件ずつ追加します。

sort -k 2,2 -k 3n | uniq -c | awk '{print $2,$3":00", $1-1" "}'
ここでのsortはまず時間で並び替えたあと、その中で03→05→10となるように並び替えます。最後にスペースを付け足しているのは、次のコマンドで改行せずに表示したときに区切りがわからなくなってしまわないためです。

awk 'NR % 3 != 0 {printf $0;} NR % 3 ==0 {print $0}'
print f は明示的に改行を指定しない限り改行されません。それを利用して、3の倍数行のときのみ改行して表示させ、それ以外のときに改行しないで表示させることができます。
レスポンス時間を4区切りで表示するなら、4の倍数行に変えてあげればオッケー。
ちなみに、この段階でこういう風に表示されるはずです。

2019/02/03 00:00 0 2019/02/03 00:00 0 2019/02/03 00:00 0 
2019/02/03 01:00 0 2019/02/03 01:00 0 2019/02/03 01:00 0
(省略)

awk 'BEGIN{print "date", "hour", "0-3s", "3-10s", "10s-"}{print $1,$2,$3,$6,$9}'
最後に一行目に分類をprintして、必要な列のみ表示させます。

おわりに

webエンジニア初心者なりに力づくでやってしまいましたが、より良い書き方があればコメントいただけると嬉しいです。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Linux] あるユーザーの権限と同じ権限を別ユーザーに付与する

環境

OS: Ubuntu 16.04

背景

新しいユーザー(名前はansible)を作成したのですが、

ふと、、、この新ユーザーの権限は、

「vagrantユーザーと同等の権限を付与したいなー」

という風に思ったわけです。

ということで権限確認するわけですが、

$ id vagrant
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare)

この結果から、group名を1つ1つ取り出して、

$ sudo gpasswd -a ansible adm 

を手打ちで繰り返すの嫌だな、、、 と思い、

正規表現で何とかならないかなー

と考えたのが背景です。

(2019/2/4追記) コメントより抜粋

@angel_p_57 さんのご指摘により 1行のコマンドでまとめられる事を教えていただきました。

以下がスマートで良いです。

$ sudo usermod -a -G $(id -nG vagrant | tr " " ,) ansible

正規表現でなんとかしてみる(当初自分で考えたやり方)

普段、sedをあまり使わないので、手探りですが、

以下のように書いてみました。

$ echo `id vagrant` | sed -e 's/[0-9\(,\ ]//g'| sed -e 's/)/\n/g' > vagrant_group.txt

2回sedを噛ましてますが、

1回目は、数字と左括弧、カンマとスペースを消してます。

2回目は、右括弧を改行に変えてます

最後に、加工した内容を vagrant_group.txt に出力します。

結果

vagrant_group.txtは下記のようになります。

vagrant_group.txt
uid=vagrant
gid=vagrant
groups=vagrant
adm
cdrom
sudo
dip
plugdev
lxd
lpadmin
sambashare

最初の3行もsedで削除すべきですが、コマンドが長くなりそうだったので、やめました。

後は4行目からvagrant_group.txtを読み込んで、group_add するだけです。

$ tail -n +4 vagrant_group.txt | xargs -I {} sudo gpasswd -a ansible {} 

参考

ファイルのn行目以降を表示する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【情報整理③】日々の検索に疲弊しきった私のための、基本的なLinuxコマンドの整理②

・Netflixによって世界中から人気を博している「こんまり」さんに、多大な影響を受けて情報整理をしていく記事第三弾。
・やはり見掛け倒しの整理術は、心の済んだ方々にはすっかり見破られるが、それでもとことん表面的生活を貫く意思の強い私。
・今回も、膨大なLinuxコマンドを二・三回に分けて、記録していくことにしよう。
情報整理第一弾はこちら
Linuxコマンド整理第一弾はこちら

Linuxコマンドメモ②

変更系

前提知識

・ファイルやアクセス権限確認方法
・ls等での情報表示の際に、ファイルの左に表示される下記の例で確認。

例:drwxrwxr-x

→左の一文字がファイルかディレクトリかを表す。  

→次の三文字が所有者のアクセス権限を表す。  
 r : 読み取り可能
 w : 書き込み可能。
 x : 実行可能。  
※つまり、この例ではすべての権限が可能。  

→次の三文字がグループユーザーのアクセス権限を表す。    
 r : 読み取り可能。
 w : 書き込み可能。
 x : 実行可能。  
※つまり、この例ではすべての権限が可能。  

→最後の三文字がその他ユーザーのアクセス権限を表す。    
 r : 読み取り可能。
 w : 書き込み可能。
 - : 実行以外可能。  
※つまり、この例では読み取りと実行のみの権限が可能。  

chmodコマンド

・ファイルやディレクトリの権限変更

chmod アクセス権限 ファイル名

※例(アクセス権限をすべての利用者がすべての権限を持つように設定)

chmod 777 test.sh

・ファイルやディレクトリの権限変更(利用者とアクセス権限指定)

chmod ユーザー 追加か解除か アクセス権限 ファイル名

※例(現在のアクセス権限のその他ユーザーの権限から実行権限を解除)。
※ugoa(ユーザー、グループ、その他ユーザー、全て)。+-=(追加、削除、指定)。rwx(読み込み、書き込み、実行)。

chmod o-x test.sh

・ファイルやディレクトリの権限変更(実行結果も表示)

chmod -v アクセス権限 ファイル名

chownコマンド

・ファイルやディレクトリの所有者変更

chown 所有者名 ファイル名またはディレクトリ名

・ファイルやディレクトリの所有者変更(実行結果も表示)

chown -v 所有者名 ファイル名またはディレクトリ名

ユーザー管理系

全ユーザー確認コマンド

cat /etc/passwd

指定ユーザー確認コマンド

grep ユーザー名 /etc/passwd

全グループ確認コマンド

cat /etc/group

sudoコマンド

・スーパーユーザー(root)でコマンド実行

sudo コマンド

useraddコマンド

・ユーザーの新規作成

useradd ユーザー名

・ユーザーの新規作成(グループを新規作成しない)

useradd -N ユーザー名

・ユーザーの新規作成(グループ指定)

useradd -g グループ名 ユーザー名

passwdコマンド

・パスワード設定

passwd ユーザー名

・パスワードロックで、ログイン無効化

passwd -l ユーザー名

・パスワードロック解除

passwd -u ユーザー名

userdelコマンド

・ユーザー削除

userdel ユーザー名

・ユーザー削除(ホームディレクトリも削除)

userdel -r ユーザー名

・ユーザーの新規作成

userdel ユーザー名

usermodコマンド

・ユーザー編集(基本)

usermod ユーザー名 オプション

・ユーザー編集(ユーザーのグループ変更)

usermod -g ユーザー名 グループ名

・ユーザーをロックする。

usermod -L ユーザー名

・ユーザーロックを解除する。

usermod -U ユーザー名

groupaddコマンド

・グループの新規作成

groupadd グループ名

・グループの新規作成(パスワード付き)

groupadd -p パスワード グループ名

groupmodコマンド

※必ずオプションをつけて実行。

・グループ名の変更

groupmod -n 変更後グループ名 変更するグループ名

・グループパスワードの変更

groupmod -p 変更後パスワード 変更するグループ名

groupdelコマンド

・グループ削除

groupdel グループ名

idコマンド

・ユーザーID情報確認

id ユーザー名

テキスト操作系

cutコマンド

・指定バイト数で分割

cut -b バイト名 ファイル名

・指定項目数で分割。

cut -f 項目数 -d 区切り文字 ファイル名

sortコマンド

・データを昇順に並び替える。

sort ファイル名

・データを数値で並び替える。

sort -n ファイル名

・データを降順に並び替える。

sort -r ファイル名

・データを大文字と小文字関係なく並び替える。

sort -f ファイル名

wcコマンド

・ファイル内のテキストの大きさ表示

wc ファイル名

※出力例

4  3 18 hello.txt
→左が行数。真ん中が空白区切りの単語数。右がファイルサイズ(バイト)

・複数ファイルのテキストの大きさ表示

wc ファイル名1ファイル名2・・・

まとめ

  • 今回は、Linuxコマンドメモの第二回目ということで、合計で膨大な数なのに、まだ先の見えないほどの容量を持ち合わせていることに、寛大な心で受け止めながら、ふわふわ気分で記事を書く。
  • 整理とは名ばかりの、ただの検索と暗記からの避難策であるという、返答困難な事実とこれっぽちも向き合うことなく、ひたすら自我を通す徹底ぶり。
  • 今回のコマンド整理も次で最後になりそうなことを、年甲斐もなく無心にはしゃぎながら、また調査という名の無駄遊びをしていくことにしよう。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

samtools が「libcrypto.so.1.0.0 => not found」で実行できなかった件.

samtools をcondaインストールした実行しようとしたら,以下のエラーが出た.

$ samtools
samtools: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory

libcrypto.so.1.0.0が無いようなので,探してみると,

$ ldd $(which samtools)
libcrypto.so.1.0.0 => not found

見事に"not found" になっている.
ほかのpath はしっかりminiconda のlib/にあるようなので中を少し見てみる.
libcrypto.so.1.1ってのがあったので,こいつをlibcrypto.so.1.0.0のリンク先に指定してあげれば良いなとなる.

#lib/ に移動して,
ln -s libcrypto.so.1.1 libcrypto.so.1.0.0

すると,

libcrypto.so.1.0.0 => $HOME/miniconda3/bin/../lib/libcrypto.so.1.0.0 

みたいなかんじなので,解決.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curlコマンドの便利な機能

はじめに

Linux環境で開発をしていると、「Webページを取得する」「APIを叩く」といったシーンでcurlコマンドを使うことがあります。
ですが、私は頻繁に使うコマンドではないので、幾つかの機能(オプション)を備忘録としてまとめてみました。

代表的なオプション

オプション 意味
-o 指定したファイル名で保存する。
-O 転送元と同じファイル名で保存する。
--create-dirs 指定したフォルダが存在しない時に、自動的にフォルダを作成してからファイルとして保存する。
-# プログレスバーを表示する。
-I ヘッダ情報を表示する。
-i ヘッダ情報を付けてページを表示する。

コマンドの利用例

  • 私が一番よく使うのは「オプションなし」のシンプルなcurlコマンドです。
  • ISOイメージなど大きなファイルをダウンロードする際には、"-#"オプションを付けてプログレスバーを表示させると、進行状況を確認できて良さそうです。
[nkojima@kumotori ~]$ # オプションなしで実行する場合
[nkojima@kumotori ~]$ curl https://qiita.com/nkojima
<!DOCTYPE html><html xmlns:og="http://ogp.me/ns#"><head><meta charset="UTF-8" /><title>nkojima - Qiita</title><meta content="width=device-width,init
ial-scale=1" name="viewport" /><meta content="nkojima&#39;s profile. Let&#39;s see nkojima&#39;s posts." name="description" />
...
[nkojima@kumotori ~]$ # 指定したファイル名で保存する。
[nkojima@kumotori ~]$ curl https://qiita.com/nkojima -o qiita.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39134    0 39134    0     0  51056      0 --:--:-- --:--:-- --:--:-- 67940
[nkojima@kumotori ~]$ # 転送元と同じファイル名で保存する。保管先フォルダが無ければ新規作成する。
[nkojima@kumotori ~]$ curl https://qiita.com/nkojima -o ./downloads/qiita.html --create-dirs
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39134    0 39134    0     0   111k      0 --:--:-- --:--:-- --:--:--  278k
[nkojima@kumotori ~]$ # プログレスバーを表示する。
[nkojima@kumotori ~]$ curl http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso -O -#
####################                                                      28.3%
[nkojima@kumotori ~]$ # ヘッダ情報を表示する。
[nkojima@kumotori ~]$ curl https://www.google.co.jp -I
HTTP/1.1 200 OK
Date: Sat, 02 Feb 2019 09:26:13 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2019-02-02-09; expires=Mon, 04-Mar-2019 09:26:13 GMT; path=/; domain=.google.co.jp
Set-Cookie: NID=158=egLwtfuJLqVmt7PCQa7FAqw_v0gbZFTG93iSJ7y5txneEuxwFVRxiqtf21B24wjilHCSsQW29IcOXNtRjc5unznmWFsvdgveWeAZm6LsmdYMmh_pTH-1eCsKrEhby87f4zH8qrxmtQT9ZVK53SAVnT1L5ByA9_tVkj4vGlKcQ1I; expires=Sun, 04-Aug-2019 09:26:13 GMT; path=/; domain=.google.co.jp; HttpOnly
Transfer-Encoding: chunked
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39"
Accept-Ranges: none
Vary: Accept-Encoding

応用編:jqコマンドを併用する

  • 例えば、APIを叩いて得られた結果がJSONの場合、"jq"というコマンドを併用すると結果がとても見やすくなります。
事前にjqをインストールする
[root@kumotori ~]# yum install epel-release -y
[root@kumotori ~]# yum install jq -y
jqを使わない場合
[root@kumotori ~]# curl http://weather.livedoor.com/forecast/webservice/json/v1?city=130010 -s
{"pinpointLocations":[{"link":"http://weather.livedoor.com/area/forecast/1310100","name":"\u5343\u4ee3\u7530\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310200","name":"\u4e2d\u592e\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310300","name":"\u6e2f\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310400","name":"\u65b0\u5bbf\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310500","name":"\u6587\u4eac\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310600","name":"\u53f0\u6771\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310700","name":"\u58a8\u7530\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310800","name":"\u6c5f\u6771\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310900","name":"\u54c1\u5ddd\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311000","name":"\u76ee\u9ed2\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311100","name":"\u5927\u7530\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311200","name":"\u4e16\u7530\u8c37\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311300","name":"\u6e0b\u8c37\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311400","name":"\u4e2d\u91ce\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311500","name":"\u6749\u4e26\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311600","name":"\u8c4a\u5cf6\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311700","name":"\u5317\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311800","name":"\u8352\u5ddd\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1311900","name":"\u677f\u6a4b\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1312000","name":"\u7df4\u99ac\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1312100","name":"\u8db3\u7acb\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1312200","name":"\u845b\u98fe\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1312300","name":"\u6c5f\u6238\u5ddd\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1320100","name":"\u516b\u738b\u5b50\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320200","name":"\u7acb\u5ddd\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320300","name":"\u6b66\u8535\u91ce\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320400","name":"\u4e09\u9df9\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320500","name":"\u9752\u6885\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320600","name":"\u5e9c\u4e2d\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320700","name":"\u662d\u5cf6\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320800","name":"\u8abf\u5e03\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1320900","name":"\u753a\u7530\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321000","name":"\u5c0f\u91d1\u4e95\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321100","name":"\u5c0f\u5e73\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321200","name":"\u65e5\u91ce\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321300","name":"\u6771\u6751\u5c71\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321400","name":"\u56fd\u5206\u5bfa\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321500","name":"\u56fd\u7acb\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321800","name":"\u798f\u751f\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1321900","name":"\u72db\u6c5f\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322000","name":"\u6771\u5927\u548c\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322100","name":"\u6e05\u702c\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322200","name":"\u6771\u4e45\u7559\u7c73\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322300","name":"\u6b66\u8535\u6751\u5c71\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322400","name":"\u591a\u6469\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322500","name":"\u7a32\u57ce\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322700","name":"\u7fbd\u6751\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322800","name":"\u3042\u304d\u308b\u91ce\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1322900","name":"\u897f\u6771\u4eac\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/1330300","name":"\u745e\u7a42\u753a"},{"link":"http://weather.livedoor.com/area/forecast/1330500","name":"\u65e5\u306e\u51fa\u753a"},{"link":"http://weather.livedoor.com/area/forecast/1330700","name":"\u6a9c\u539f\u6751"},{"link":"http://weather.livedoor.com/area/forecast/1330800","name":"\u5965\u591a\u6469\u753a"}],"link":"http://weather.livedoor.com/area/forecast/130010","forecasts":[{"dateLabel":"\u4eca\u65e5","telop":"\u6674\u306e\u3061\u66c7","date":"2019-02-03","temperature":{"min":{"celsius":"1","fahrenheit":"33.8"},"max":{"celsius":"14","fahrenheit":"57.2"}},"image":{"width":50,"url":"http://weather.livedoor.com/img/icon/5.gif","title":"\u6674\u306e\u3061\u66c7","height":31}},{"dateLabel":"\u660e\u65e5","telop":"\u66c7\u306e\u3061\u6674","date":"2019-02-04","temperature":{"min":null,"max":null},"image":{"width":50,"url":"http://weather.livedoor.com/img/icon/12.gif","title":"\u66c7\u306e\u3061\u6674","height":31}}],"location":{"city":"\u6771\u4eac","area":"\u95a2\u6771","prefecture":"\u6771\u4eac\u90fd"},"publicTime":"2019-02-02T22:00:00\u002b0900","copyright":{"provider":[{"link":"http://tenki.jp/","name":"\u65e5\u672c\u6c17\u8c61\u5354\u4f1a"}],"link":"http://weather.livedoor.com/","title":"(C) LINE Corporation","image":{"width":118,"link":"http://weather.livedoor.com/","url":"http://weather.livedoor.com/img/cmn/livedoor.gif","title":"livedoor \u5929\u6c17\u60c5\u5831","height":26}},"title":"\u6771\u4eac\u90fd \u6771\u4eac \u306e\u5929\u6c17","description":{"text":" \u9ad8\u6c17\u5727\u304c\u3001\u65e5\u672c\u306e\u5357\u3092\u6771\u3078\u79fb\u52d5\u3057\u3066\u3044\u307e\u3059\u3002\n\n\u3010\u95a2\u6771\u7532\u4fe1\u5730\u65b9\u3011\n \u95a2\u6771\u7532\u4fe1\u5730\u65b9\u306f\u3001\u304a\u304a\u3080\u306d\u6674\u308c\u3066\u3044\u307e\u3059\u3002\n\n 2\u65e5\u306f\u3001\u9ad8\u6c17\u5727\u306b\u8986\u308f\u308c\u308b\u305f\u3081\u3001\u304a\u304a\u3080\u306d\u6674\u308c\u308b\u3067\u3057\u3087\u3046\u3002 \n \n 3\u65e5\u306f\u3001\u9ad8\u6c17\u5727\u306b\u8986\u308f\u308c\u3066\u6674\u308c\u307e\u3059\u304c\u3001\u65e5\u672c\u6d77\u3092\u6771\u5317\u6771\u306b\u9032\u3080\u4f4e\u6c17\u5727\u306e\u5f71\n\u97ff\u3067\u5348\u5f8c\u306f\u6b21\u7b2c\u306b\u66c7\u308a\u3068\u306a\u308a\u3001\u7532\u4fe1\u5730\u65b9\u3092\u4e2d\u5fc3\u306b\u96e8\u306e\u964d\u308b\u6240\u304c\u3042\u308b\u898b\u8fbc\u307f\u3067\n\u3059\u3002\n\n \u95a2\u6771\u8fd1\u6d77\u3067\u306f\u30012\u65e5\u304b\u30893\u65e5\u306b\u304b\u3051\u3066\u6ce2\u304c\u9ad8\u304f\u30012\u65e5\u306f\u3046\u306d\u308a\u3092\u4f34\u3046\u3067\u3057\n\u3087\u3046\u3002\u8239\u8236\u306f\u9ad8\u6ce2\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u3010\u6771\u4eac\u5730\u65b9\u3011\n 2\u65e5\u306f\u3001\u304a\u304a\u3080\u306d\u6674\u308c\u308b\u3067\u3057\u3087\u3046\u3002\n 3\u65e5\u306f\u3001\u6674\u308c\u3067\u3001\u5915\u65b9\u304b\u3089\u66c7\u308a\u3068\u306a\u308b\u898b\u8fbc\u307f\u3067\u3059\u3002","publicTime":"2019-02-02T22:22:00\u002b0900"}}
jqを併用した場合
[root@kumotori ~]# curl http://weather.livedoor.com/forecast/webservice/json/v1?city=130010 -s | jq "."
{
  "description": {
    "publicTime": "2019-02-02T22:22:00+0900",
    "text": " 高気圧が、日本の南を東へ移動しています。\n\n【関東甲信地方】\n 関東甲信地方は、おおむね晴れています。\n\n 2日は、高気圧に覆われるため
、おおむね晴れるでしょう。 \n \n 3日は、高気圧に覆われて晴れますが、日本海を東北東に進む低気圧の影\n響で午後は次第に曇りとなり、甲信地方を中心に雨の
降る所がある見込みで\nす。\n\n 関東近海では、2日から3日にかけて波が高く、2日はうねりを伴うでし\nょう。船舶は高波に注意してください。\n\n【東京地方】
\n 2日は、おおむね晴れるでしょう。\n 3日は、晴れで、夕方から曇りとなる見込みです。"
  },
  "title": "東京都 東京 の天気",
  "copyright": {
    "image": {
      "height": 26,
      "title": "livedoor 天気情報",
      "url": "http://weather.livedoor.com/img/cmn/livedoor.gif",
      "link": "http://weather.livedoor.com/",
      "width": 118
    },
    "title": "(C) LINE Corporation",
    "link": "http://weather.livedoor.com/",
    "provider": [
      {
        "name": "日本気象協会",
        "link": "http://tenki.jp/"
      }
    ]
  },
  "publicTime": "2019-02-02T22:00:00+0900",
  "location": {
    "prefecture": "東京都",
    "area": "関東",
    "city": "東京"
  },
  "forecasts": [
    {
      "image": {
        "height": 31,
        "title": "晴のち曇",
        "url": "http://weather.livedoor.com/img/icon/5.gif",
        "width": 50
      },
      "temperature": {
        "max": {
          "fahrenheit": "57.2",
          "celsius": "14"
        },
        "min": {
          "fahrenheit": "33.8",
          "celsius": "1"
        }
      },
      "date": "2019-02-03",
      "telop": "晴のち曇",
      "dateLabel": "今日"
    },
    {
      "image": {
        "height": 31,
        "title": "曇のち晴",
        "url": "http://weather.livedoor.com/img/icon/12.gif",
        "width": 50
      },
      "temperature": {
        "max": null,
        "min": null
      },
      "date": "2019-02-04",
      "telop": "曇のち晴",
      "dateLabel": "明日"
    }
  ],
  "link": "http://weather.livedoor.com/area/forecast/130010",
  "pinpointLocations": [
    {
      "name": "千代田区",
      "link": "http://weather.livedoor.com/area/forecast/1310100"
    },
    {
      "name": "中央区",
      "link": "http://weather.livedoor.com/area/forecast/1310200"
    },
    {
      "name": "港区",
      "link": "http://weather.livedoor.com/area/forecast/1310300"
    },
    {
      "name": "新宿区",
      "link": "http://weather.livedoor.com/area/forecast/1310400"
    },
    {
      "name": "文京区",
      "link": "http://weather.livedoor.com/area/forecast/1310500"
    },
    {
      "name": "台東区",
      "link": "http://weather.livedoor.com/area/forecast/1310600"
    },
    {
      "name": "墨田区",
      "link": "http://weather.livedoor.com/area/forecast/1310700"
    },
    {
      "name": "江東区",
      "link": "http://weather.livedoor.com/area/forecast/1310800"
    },
    {
      "name": "品川区",
      "link": "http://weather.livedoor.com/area/forecast/1310900"
    },
    {
      "name": "目黒区",
      "link": "http://weather.livedoor.com/area/forecast/1311000"
    },
    {
      "name": "大田区",
      "link": "http://weather.livedoor.com/area/forecast/1311100"
    },
    {
      "name": "世田谷区",
      "link": "http://weather.livedoor.com/area/forecast/1311200"
    },
    {
      "name": "渋谷区",
      "link": "http://weather.livedoor.com/area/forecast/1311300"
    },
    {
      "name": "中野区",
      "link": "http://weather.livedoor.com/area/forecast/1311400"
    },
    {
      "name": "杉並区",
      "link": "http://weather.livedoor.com/area/forecast/1311500"
    },
    {
      "name": "豊島区",
      "link": "http://weather.livedoor.com/area/forecast/1311600"
    },
    {
      "name": "北区",
      "link": "http://weather.livedoor.com/area/forecast/1311700"
    },
    {
      "name": "荒川区",
      "link": "http://weather.livedoor.com/area/forecast/1311800"
    },
    {
      "name": "板橋区",
      "link": "http://weather.livedoor.com/area/forecast/1311900"
    },
    {
      "name": "練馬区",
      "link": "http://weather.livedoor.com/area/forecast/1312000"
    },
    {
      "name": "足立区",
      "link": "http://weather.livedoor.com/area/forecast/1312100"
    },
    {
      "name": "葛飾区",
      "link": "http://weather.livedoor.com/area/forecast/1312200"
    },
    {
      "name": "江戸川区",
      "link": "http://weather.livedoor.com/area/forecast/1312300"
    },
    {
      "name": "八王子市",
      "link": "http://weather.livedoor.com/area/forecast/1320100"
    },
    {
      "name": "立川市",
      "link": "http://weather.livedoor.com/area/forecast/1320200"
    },
    {
      "name": "武蔵野市",
      "link": "http://weather.livedoor.com/area/forecast/1320300"
    },
    {
      "name": "三鷹市",
      "link": "http://weather.livedoor.com/area/forecast/1320400"
    },
    {
      "name": "青梅市",
      "link": "http://weather.livedoor.com/area/forecast/1320500"
    },
    {
      "name": "府中市",
      "link": "http://weather.livedoor.com/area/forecast/1320600"
    },
    {
      "name": "昭島市",
      "link": "http://weather.livedoor.com/area/forecast/1320700"
    },
    {
      "name": "調布市",
      "link": "http://weather.livedoor.com/area/forecast/1320800"
    },
    {
      "name": "町田市",
      "link": "http://weather.livedoor.com/area/forecast/1320900"
    },
    {
      "name": "小金井市",
      "link": "http://weather.livedoor.com/area/forecast/1321000"
    },
    {
      "name": "小平市",
      "link": "http://weather.livedoor.com/area/forecast/1321100"
    },
    {
      "name": "日野市",
      "link": "http://weather.livedoor.com/area/forecast/1321200"
    },
    {
      "name": "東村山市",
      "link": "http://weather.livedoor.com/area/forecast/1321300"
    },
    {
      "name": "国分寺市",
      "link": "http://weather.livedoor.com/area/forecast/1321400"
    },
    {
      "name": "国立市",
      "link": "http://weather.livedoor.com/area/forecast/1321500"
    },
    {
      "name": "福生市",
      "link": "http://weather.livedoor.com/area/forecast/1321800"
    },
    {
      "name": "狛江市",
      "link": "http://weather.livedoor.com/area/forecast/1321900"
    },
    {
      "name": "東大和市",
      "link": "http://weather.livedoor.com/area/forecast/1322000"
    },
    {
      "name": "清瀬市",
      "link": "http://weather.livedoor.com/area/forecast/1322100"
    },
    {
      "name": "東久留米市",
      "link": "http://weather.livedoor.com/area/forecast/1322200"
    },
    {
      "name": "武蔵村山市",
      "link": "http://weather.livedoor.com/area/forecast/1322300"
    },
    {
      "name": "多摩市",
      "link": "http://weather.livedoor.com/area/forecast/1322400"
    },
    {
      "name": "稲城市",
      "link": "http://weather.livedoor.com/area/forecast/1322500"
    },
    {
      "name": "羽村市",
      "link": "http://weather.livedoor.com/area/forecast/1322700"
    },
    {
      "name": "あきる野市",
      "link": "http://weather.livedoor.com/area/forecast/1322800"
    },
    {
      "name": "西東京市",
      "link": "http://weather.livedoor.com/area/forecast/1322900"
    },
    {
      "name": "瑞穂町",
      "link": "http://weather.livedoor.com/area/forecast/1330300"
    },
    {
      "name": "日の出町",
      "link": "http://weather.livedoor.com/area/forecast/1330500"
    },
    {
      "name": "檜原村",
      "link": "http://weather.livedoor.com/area/forecast/1330700"
    },
    {
      "name": "奥多摩町",
      "link": "http://weather.livedoor.com/area/forecast/1330800"
    }
  ]
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む