コマンドのエイリアスを登録する (update-alternatives)
mybin
という名前のコマンドを登録
sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10
sudo update-alternatives --install /usr/local/bin/mybin mybin /bin/ls 10
シンボリックリンク先となる候補が複数ある場合は選択して有効化
sudo update-alternatives --config mybin
There are 2 choices for the alternative mybin (providing /usr/local/bin/mybin).
Selection Path Priority Status
------------------------------------------------------------
0 /bin/ls 10 auto mode
* 1 /bin/ls 10 manual mode
2 /usr/bin/echo 10 manual mode
削除
sudo update-alternatives --remove-all mybin
CPU 情報を表示 (lscpu)
lscpu
バイナリファイルから文字列を抽出する (strings)
文字列らしい部分をバイナリファイルから抽出して出力するコマンドです。得体の知れないコマンドのオプションを調べたり
$ strings /usr/bin/gcc | grep ^--
--help
--target-help
--sysroot=
--all-warnings
--ansi
--assemble
--assert
--classpath
--bootclasspath
--CLASSPATH
...
あるいは、tcpダンプの出力結果であるバイナリログファイルを解析したりできます。
$ cat http.cap | strings
<!w@
(!x@
CT5_
GET / HTTP/1.1
User-Agent: curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: www.yahoo.co.jp
Accept: */*
CTSa
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Oct 2014 15:08:09 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
...
コマンドの出力結果の差分を表示 (diffの応用)
$ diff -u <(echo 'test') <(echo 'test2')
--- /dev/fd/63 2014-11-02 16:53:41.872004003 +0900
+++ /dev/fd/62 2014-11-02 16:53:41.874003932 +0900
@@ -1 +1 @@
-test
+test2
クリップボードの操作 (xclip)
xclip -out -selection clipboard > txt
xclip -in -selection clipboard < txt
ファイルを横に連結 (paste, join)
1.txt
1 A
2 B
3 C
5 E
6 F
2.txt
1 X
3 Z
2 Y
4 S
paste
$ paste 1.txt 2.txt
1 A 1 X
2 B 3 Z
3 C 2 Y
5 E 4 S
6 F
$ paste 1.txt 2.txt -d':'
1 A:1 X
2 B:3 Z
3 C:2 Y
5 E:4 S
6 F:
join
$ join <(sort 1.txt) <(sort 2.txt) -1 1 -2 1 -i -t' ' -o'1.1 1.2 2.1 2.2'
1 A 1 X
2 B 2 Y
3 C 3 Z
$ join <(sort 1.txt) <(sort 2.txt) -1 1 -2 1 -i -t' ' -o'1.1 1.2 2.1 2.2' -a 1 -a 2
1 A 1 X
2 B 2 Y
3 C 3 Z
4 S
5 E
6 F
$ join <(sort 1.txt) <(sort 2.txt) -1 1 -2 1 -i -t' ' -o'1.1 1.2 2.1 2.2' -v 1 -v 2
4 S
5 E
6 F
-1 1
一つ目のファイルの第一列をキー-2 1
二つ目のファイルの第一列をキー-i
キーの大文字小文字を区別しない-t ' '
入力ファイルと出力ファイルの列の区切り文字-t $'\t'
とするとタブを指定できます。
-o'...'
出力する列とその順番 (n.k は第 n ファイルの第 k 列)-a 1 -a 2
一つ目と二つ目のファイルの一致しなかった行も出力-v 1 -v 2
一つ目と二つ目のファイルの一致しなかった行だけを出力
数値を ASCII コードに変換
$ echo '65,66,67' | perl -M-warnings -lne "print map {chr} split /,/"
ABC
16 進数表記の場合は echo コマンドが便利です。
$ echo -e "\x41\x42\x43"
ABC
$ echo -e '\xE3\x81\x82'
あ
ルートディレクトリを変更 (chroot)
いわゆるルートディレクトリ '/' を任意のディレクトリに変更するコマンドです。動作検証のできていない外部プログラムを実行する際などに使用します。FreeBSD では同様の機能を提供する jail コマンドが有名です。
$ sudo mkdir -p /chroot/a
$ sudo chroot /chroot/a
bash-4.1# pwd
/
bash-4.1# exit
chroot の引数に指定する新しいルートディレクトリには少なくとも /bin/sh およびそれが依存するライブラリが格納されている必要があります。
$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 7 2014 /bin/sh -> bash
$ ldd /bin/bash
linux-vdso.so.1 => (0x00007fff07fc2000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fa658494000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fa658290000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa657efb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa6586bb000)
$ sudo mkdir /chroot/a/lib64
$ sudo cp /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 /chroot/a/lib64/
$ sudo mkdir /chroot/a/bin
$ sudo cp /bin/bash /bin/sh /chroot/a/bin/
ハッシュ値を計算 (md5sum)
md5 ではなく md5sum コマンドを使用します。
$ echo 'abc' | md5sum
900150983cd24fb0d6963f7d28e17f72 *-
ほとんどの方には関係ありませんが Emacs の組み込み関数 md5 とは挙動が異なるため注意しましょう。
$ md5 abc
900150983cd24fb0d6963f7d28e17f72
環境変数を引き継いで sudo
sudo を実行する際に環境変数を引き継ぎたい場合は -E オプションを使用します。
準備
$ export MY_ENV=777
$ cat test.sh
echo $MY_ENV
$ chmod +x test.sh
$ ./test.sh
777
比較
$ sudo ./test.sh
← 何も表示されません
$ sudo -E ./test.sh
777
環境変数を一時的に変更してコマンド実行 (env)
コマンド env は環境変数を一覧表示する機能だけでなく、実行時の環境変数を一時的に変更する機能も提供します。表示するだけであれば printenv
と同様です。
$ env | grep LANG
LANG=ja_JP.UTF-8
$ env LANG=C date
Thu Feb 12 01:13:10 JST 2015
$ date
2015年 2月 12日 木曜日 01:13:14 JST
DISPLAY
環境変数を指定して SSH 先の GNOME 端末に AA を表示する。関連: wall コマンド
DISPLAY=:0 gnome-terminal -e 'bash -c "cowsay hello; sleep 5"'
サーバ稼動時間を表示 (uptime)
サーバ稼動時間、ログインユーザ数、過去1,5,15分前までのロードアベレージの平均値が順に表示されます。
$ uptime
16:26:57 up 1:43, 1 user, load average: 0.00, 0.00, 0.00
システムの情報を表示 (uname)
ネットワークノード情報 (ホスト名, ドメイン名)
$ uname -n
localhost.localdomain
OS名
$ uname -o
GNU/Linux
CPU情報
$ uname -m
i686
OS のリリース番号
$ uname -r
2.6.32-504.3.3.el6.x86_64
(参考) OS の情報は以下のようにしても確認できます
$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
テキストを行列に見立てて特定の列のみを切り出す (cut)
左から何番目かを指定して切り出す
$ echo '0,1,2,3,4
5,6,7,8,9' | cut -c1,3-4
実行結果
01,
56,
区切り文字を基準として切り出す
$ echo '0,1,2,3,4
5,6,7,8,9' | cut -d',' -f1,3-4
実行結果
0,2,3
5,7,8
ユーザパスワードを削除
$ sudo passwd -d username
公開鍵の fingerprint を調査
RSA 鍵として妥当性の検証や、鍵長の調査にもなります。
$ ssh-keygen -lf ~/.ssh/id_rsa.pub
行番号を表示する (cat -n)
$ cat -n sample.pl
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use utf8;
5 use Data::Dumper;
...
LVS (Linux Virtual Server) の設定を確認 (ipvsadm)
sudo yum install ipvsadm
sudo ipvsadm -Ln
システムリソースの上限を確認 (ulimit -a)
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3518
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited ←物理メモリの使用サイズ上限
open files (-n) 1024 ←ファイルディスクリプタ数の上限
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited ←CPU時間の上限
max user processes (-u) 1024 ←プロセス数の上限
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
root ユーザで作業中に他のユーザ権限でコマンド実行 (su)
sudo と異なり、例えば疑似端末 tty がない場合でも問題なく実行できます。rc.local で一般ユーザ権限のプロセスを起動したい場合などに有用です。
$ su -l username -c 'echo $HOME'
システム起動時に実行するコマンドを登録 (/etc/rc.local)
Windows のスタートアップのようなものは /etc/rc.local として提供されています。すべての init スクリプトが完了した後に登録された内容が実行されます。AWS EC2 を利用している場合、User Data という似た機能があります。
$ cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
# 何らかのシステム的な処理を一般ユーザで実行
su -l username -c /usr/etc/sample.sh
プロセスが殺せない (kill -s 9)
kill はオプション無指定で SIGTERM シグナルを送信します。状況によって SIGTERM ではプロセスを殺せないことがあります。そのような場合は SIGKILL を送信することでプロセスを殺せることがあります。
$ kill -s 9 PID
プロセスが止められない
SIGINT (Ctrl-C) で止められない場合、SIGSTOP(Ctrl-z) でバックグラウンドに移してから SIGKILL を発行します。%1
はジョブ番号です。
kill -9 %1
XML および JSON をコマンドライン上で見易く表示 (xmllint, jq)
XML (xmllint)
CentOS 6.6 の場合は /usr/bin/xmllint に標準インストールされています。
$ echo '<?xml version="1.0" ?><venture><company><name>ABC</name><url>http://www.abc.co.jp/</url></company><company><name>XYZ</name><url>http://www.xyz.co.jp/</url></company></venture>' | xmllint --format -
<?xml version="1.0"?>
<venture>
<company>
<name>ABC</name>
<url>http://www.abc.co.jp/</url>
</company>
<company>
<name>XYZ</name>
<url>http://www.xyz.co.jp/</url>
</company>
</venture>
- --format → インデントなどによって整形
-
→ ファイル名を指定せずに標準入力からデータを受け取る
JSON (jq)
CentOS 6.6 の場合は epel からインストール可能です。
$ sudo yum install epel-release
$ sudo yum --enablerepo=epel install jq
使用例 ('.' でルートを指定)
$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.'
[
{
"good": true,
"name": "JSON"
},
{
"good": false,
"name": "XML"
}
]
また jq が使用できない環境では perl に付属の json_pp
コマンドの存在も確認します。
cat /path/to/xxx.json | json_pp
YAML ファイルをコマンドライン上でパース (shyaml)
macOS であれば brew コマンドでインストールできます。
brew install shyaml
以下のように値を取得できます。詳細はこちらをご参照ください。
test.yaml
name: "MyName !!"
subvalue:
how-much: 1.1
things:
- first
- second
- third
コマンド例
cat test.yaml | shyaml keys
cat test.yaml | shyaml get-value name
cat test.yaml | shyaml get-value subvalue.how-much
cat test.yaml | shyaml get-value subvalue.things.0
ポートを使用しているプロセスを調査 (lsof, macOS でも可)
$ sudo lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 2314 mysql 14u IPv6 9521 0t0 TCP *:mysql (LISTEN)
開いているポートを確認
sudo lsof | grep TCP | grep LISTEN
sudo lsof -P | grep TCP | grep LISTEN ←ポート番号で強制表示
サーバー証明書チェーンの確認 (openssl s_client)
$ openssl s_client -connect www.qoosky.io:443 -showcerts > www.qoosky.io.crt
サーバー証明書 (一部抜粋したもの → server.crt)
0 s:/OU=GT53696254/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=www.qoosky.io
i:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
-----BEGIN CERTIFICATE-----
MIIEqzCCA5OgAwIBAgIDBhQqMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMSAwHgYDVQQDExdSYXBpZFNTTCBTSEEy
NTYgQ0EgLSBHMzAeFw0xNTA4MDIwOTU3NTJaFw0xODEwMDMxMTM0MThaMIGSMRMw
EQYDVQQLEwpHVDUzNjk2MjU0MTEwLwYDVQQLEyhTZWUgd3d3LnJhcGlkc3NsLmNv
bS9yZXNvdXJjZXMvY3BzIChjKTE1MS8wLQYDVQQLEyZEb21haW4gQ29udHJvbCBW
YWxpZGF0ZWQgLSBSYXBpZFNTTChSKTEXMBUGA1UEAxMOd3d3LnFvb3NreS5uZXQw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbHL0Y+hMAD7PShvRJdQIr
9vFLF5mNEYaZvW+Zc/0FYCkqiWAXyYl76M6ZJlMUbDBSyTFB64BDuezNCKjsd6Uj
6g/PcE4AvJpteVcQiXKtuNRdBxj1brqidarRaGU+Not1twKXuwUffZf5nJVVAa63
EdTKnskAUWBNFwG423ami7lbe2P9fu3iOQDMbdz1yItt4p3p1NMyDoKRlN5IKkMB
jcd05947CTvSCfGD8f/tId4ovkkqTSimz/qGwu+11/65THobr8K26p28UnixYy3W
wys2WsB7rzW7vuztyxHMKyxsHix/uwFbk2VF6EIKh0B1wIJwpY40e0Ey8oF6mBI3
AgMBAAGjggFSMIIBTjAfBgNVHSMEGDAWgBTDnPP800YINLvORn+gfFvz4gjLWTBX
BggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9ndi5zeW1jZC5jb20w
JgYIKwYBBQUHMAKGGmh0dHA6Ly9ndi5zeW1jYi5jb20vZ3YuY3J0MA4GA1UdDwEB
/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwJQYDVR0RBB4w
HIIOd3d3LnFvb3NreS5uZXSCCnFvb3NreS5uZXQwKwYDVR0fBCQwIjAgoB6gHIYa
aHR0cDovL2d2LnN5bWNiLmNvbS9ndi5jcmwwDAYDVR0TAQH/BAIwADBBBgNVHSAE
OjA4MDYGBmeBDAECATAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5yYXBpZHNz
bC5jb20vbGVnYWwwDQYJKoZIhvcNAQELBQADggEBAC9QJx6LJ7OlEr0qPDbNIH0c
0PRVHBpabScIIAny770OPASRjDDneB278yD4AsAs4MISgIuiMZbzcSfxA65XfxIi
tCKHo/JUp4AlzGas09Q2GrZ4twXMlB4ppoGLhYK0VNHuGTvtquFIOrw/T9we7Qwn
3Fa+uWq/nj+hfEnV85FEwBbbTnecnOnY/rZnmLAmpq1A2yHRlNaNy/Fit0GUK9JA
c/s9FJyV1+AL+xTor4+L7D/mYfj3wpY+JUnYeoz111icrJBAdpC3Tk80WlrwGWg+
vC5UU3b9TdfZoaB2sOs9V+qz1yQADSs6HcEXCeN2Gy7uvcpVsp4Q6rC0pn/VABY=
-----END CERTIFICATE-----
中間証明書 (一部抜粋したもの → intermediate.crt)
1 s:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg
U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS
1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp
YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry
dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs
rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH
uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O
ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
gP8L8mJMcCaY
-----END CERTIFICATE-----
それぞれの署名アルゴリズムの確認などを個別に行えます。
$ openssl x509 -text -in server.crt | egrep '(Signature Algorithm|Subject|Issuer):'
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3
Subject: OU=GT53696254, OU=See www.rapidssl.com/resources/cps (c)15, OU=Domain Control Validated - RapidSSL(R), CN=www.qoosky.io
$ openssl x509 -text -in intermediate.crt | egrep '(Signature Algorithm|Subject|Issuer):'
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
Subject: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3
証明書チェーンは以下のようになっていることが分かりました。
www.qoosky.io ← RapidSSL SHA256 CA - G3 ← GeoTrust Global CA
tree コマンドがない場合は ls -R で代用
$ tree .
.
└── mydir
└── myfile
$ ls -R
.:
mydir
./mydir:
myfile
SSH 先に綺麗にペーストする (vim set paste)
vim file.txt
でエディタを起動してから
:set paste
を設定します。
マウスコピーを vim で有効化する
:set mouse=v
読取専用の vim を起動 (view, vim -R)
view file.txt
vim -R file.txt
ネットワークの疎通確認 (nc)
nc (netcat) コマンドは TCP/UDP 通信の万能コマンドです。
ポートがあいているか確認
nmap のようにポートスキャンが行えます。
-z
スキャンするだけで実際にデータを送信しない-w
タイムアウト時間を設定-v
詳細な情報を出力する-u
UDP 通信を行う
TCP 80
$ nc -z -w 5 -v www.example.com 80
TCP 80-81
$ nc -z -w 5 -v www.example.com 80-81
UDP 68 (少なくともパケットが到達したら succeed となります。UDP は後述のサーバークライアントで疎通確認するとよいです)
$ nc -u -z -w 5 -v scanme.nmap.org 68
$ nc -u -z -w 5 -v dummy.example.com 68
簡易サーバーを立てる
コネクションが確立したら、どちらかのターミナルで 'test' などと打ち込みます。別のターミナルにそのまま出力されます。前述の通り、UDP の疎通確認に有用です。
-l
指定したポートをリッスンします-u
UDP で通信します
サーバー
$ nc -l 1234
$ nc -l -p 1234 ← Debian 等の場合は `-p` が必要です。
クライアント
$ nc 127.0.0.1 1234
memcached の stats
をパイプで実行
$ echo 'stats' | nc 127.0.0.1 11211
仮想シリアルポートを TCP で二つのホストで共有 (socat)
socat を利用すると仮想シリアルポートを作成して TCP で二つのホストで共有できます。キャラクタデバイス ptsの作成です。
sudo apt install socat
サーバ側
socat pty,link=/tmp/mycom1,rawer tcp-listen:12345
クライアント側
socat pty,link=/tmp/mycom2,rawer tcp:127.0.0.1:12345
動作検証
cat < /tmp/mycom1
echo 'hi' > /tmp/mycom2
仮想ブロックデバイスファイルを TCP で別のホストに転送 (socat)
キャラクタデバイスであれば上記方法で双方向にシリアル通信できます。デバイスファイルの種類がブロックデバイスである場合は同様に socat を利用して以下のようにできます。ただし、双方向ではなく片方向の通信になります。
ブロックデバイスファイルに書き込む側
dd if=/dev/zero of=/dev/shm/myport bs=16K count=1 # shm; shared memory
socat -U TCP-LISTEN:12345,reuseaddr,fork OPEN:/dev/shm/myport
読み出す側
sudo /tmp/socat.bash &
/tmp/socat.bash
#!/bin/bash
while true; do socat -u TCP:127.0.0.1:12345 STDIO > /dev/myport; sleep 1; done &
tail -f /dev/null
パイプ時に改行を削除または置換 (tr)
tr で改行を操作した後に、他のコマンドの引数として使用すると便利です。
コマンド $(サブコマンド)
置換
$ echo $(echo -en '1\n2\n3' | tr '\n' ',')
1,2,3
削除
$ echo $(echo -en '1\n2\n3' | tr -d '\n')
123
置換してから sed で加工して足し算
$ expr $(echo -e '1\n2\n3' | tr '\n' ',' | sed 's/,$//' | sed 's/,/ + /g')
6
プロセスの優先度を変更する (nice, renice)
nice 値の既定は 0 です。nice 値が小さいプロセスほど CPU 時間を優先して割り当てられます。一般ユーザーは 0-19 の値を指定できます。root ユーザーは -20-19 の値を指定できます。nice 値 NI
は ps の 'l' オプションまたは top コマンドで確認できます。PRI または PR は 20 + NI となっています。nice 値を変更したユーザープロセスによって使用された CPU 時間の割合は sar -u の %nice
項目で確認できます。nice 値が上げられたプロセスは CPU 時間を割り当てられにくくなっているため TIME 項目の増加速度はゆるやかになります。
$ sleep 10 &
[1] 7166
$ ps lp 7166
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 7166 7151 20 0 100908 616 hrtime S pts/0 0:00 sleep 10
nice コマンドで実行
$ nice -n 19 sleep 10 &
[1] 7175
$ ps lp 7175
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 7175 7151 39 19 100908 612 hrtime SN pts/0 0:00 sleep 10
nice コマンドで実行 (root)
$ sudo su -l
# nice -n -20 sleep 10 &
[1] 7198
# ps lp 7198
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 7198 7185 0 -20 100908 612 hrtime S< pts/0 0:00 sleep 10
実行中のプロセスの nice 値を renice コマンドで変更
$ sleep 100 &
[1] 7252
$ ps lp 7252
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 7252 7234 20 0 100908 616 hrtime S pts/0 0:00 sleep 100
$ renice 19 -p 7252
7252: 古い優先度は 0、新たな優先度は 19 です
$ ps lp 7252
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 7252 7234 39 19 100908 616 hrtime SN pts/0 0:00 sleep 100
マルチスレッドのプロセスについては PID 指定で nice 値を変更しても、ps axml で確認するとメインスレッド以外のスレッドの nice 値は変化していないことが分かります。その場合は -g
オプションを利用して PGID 指定で renice します。PGID は ps axjf で確認できます。
$ renice 19 -g `マルチスレッドのプロセスのPGID`
一定期間アクセスのないファイルを削除 (tmpwatch)
30 日間アクセスがないファイルを指定ディレクトリから削除するには以下のようにします。
sudo yum install tmpwatch
tmpwatch 30d /path/to/somewhere -v
/tmp
と /var/tmp
のファイル削除は tmpwatch を利用した cron で実行されています。以下の例ではそれぞれ 10d, 30d で削除するようになっています。
/etc/cron.daily/tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
-X '/tmp/hsperfdata_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \
10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
アクセス日時ではなくファイル変更日時で判定するためには -m
オプションを利用します。
tmpwatch 30d /path/to/somewhere -v -m
空になったディレクトリを削除しないためには -d
オプションを利用します。
tmpwatch 30d /path/to/somewhere -v -d
特定のディレクトリを除外するためには -x
オプションを利用します。
tmpwatch 30d /path/to/somewhere -v -x /path/to/somewhere/subdir
同じようなことは find コマンドでも実現できます。以下の二つは同じです。
tmpwatch 30d /path/to/somewhere -v -d -m
find /path/to/somewhere -type f -mtime +30 -exec rm -f {} \;
ディスク読み込み速度をチェックする (hdparm)
インストールされていない場合
$ sudo yum install hdparm
対象となるデバイスを確認
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7.5G 0 part
├─VolGroup-lv_root (dm-0) 253:0 0 6.7G 0 lvm /
└─VolGroup-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
/
にマウントされているデバイスを調査したい場合は sda
デバイスを計測すればよいことが分かります。以下のコマンドを実行します。
$ sudo hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 1348 MB in 3.00 seconds = 448.62 MB/sec
AWS において、自作の AMI から作成したルートボリュームや、スナップショットから作成した EBS ボリュームの読み書き速度が遅い場合があります。そのような場合は、一度以下のコマンドを実行することで改善する可能性があります。完了するまでに非常に時間がかかります。
$ sudo fio --filename=/dev/sda --rw=randread --bs=128k --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize
ディスク書き込み速度をチェックする (dd)
ディスク容量を圧迫します。実行時は注意してください。
$ sudo dd if=/dev/zero of=/tmp/test.img bs=1M count=1024
268435456 bytes (268 MB) copied, 0.416738 s, 644 MB/s
- if=/dev/zero → input file から 0 を読み出します
- of=/tmp/test.img → 出力ファイル (output file)
- bs=1M → 一度に書き込むバイト数
- count=1024 → ブロック "bs=1M" をコピーする回数
ファイル作成時の read/write パーミッションを設定 (umask)
現在の設定を確認
$ umask
0002
設定を変更
$ umask 022 ← touch すると 644
$ umask 000 ← touch すると 666 (read/write をすべてのユーザーに許可)
$ umask 666 ← touch すると 000 (誰も read/write/execute できない)
改行コードを調査 (cat -e)
DOS 形式 ^M$
と UNIX 形式 $
のどちらであるかを調査できます。
cat -e filename.txt
ソースファイルのない実行ファイルのデバッグ (strace、gdb)
strace
strace コマンドで実行時に開く動的ライブラリを調査できます。ldd と異なり実行時エラーの原因調査に役立ちます。以下のように -e trace=xxxx
で監視したいシステムコールを指定してフィルタリングすることができます。-v
と -f
は子プロセス等を含めてかつメッセージを省略させないためのオプションです。
$ strace -vfe trace=open echo 123
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
123
+++ exited with 0 +++
実行中のプロセスを監視する場合は -p
を利用します。監視するシステムコールは複数指定できます。
sudo strace -vfe trace=open,read,write -p 1247
gdb
$ gdb /bin/echo
(gdb) set args 123
(gdb) run
Starting program: /bin/echo 123
123
Program exited normally.
リモートホストの複数ファイルを圧縮して SSH ダウンロード (tar、7z、gzip)
7z を利用する場合はインストール
sudo apt install p7zip-full
ダウンロードするファイルを用意
sudo dd if=/dev/zero of=/tmp/xxx.data bs=1M count=2048
sudo dd if=/dev/zero of=/tmp/yyy.data bs=1M count=2048
tar で一つのファイルに書庫化 → xz や gzip で圧縮 → ローカルホストで解凍して書庫ファイルを展開 → ファイル名から dirname を除去
time ssh vagrant "tar cf - /tmp/xxx.data /tmp/yyy.data | gzip" | gunzip | tar xf - --transform='s/.*\///'
time ssh vagrant "tar cf - /tmp/xxx.data /tmp/yyy.data | 7z a -an -txz -si -so" | 7z e -txz -si -so | tar xf - --transform='s/.*\///'
ログファイルを監視して特定行に対してコマンド実行 (taif)
grep の --line-buffered
オプションを利用することで grep がバッファすることを回避します。
tailf /var/log/mylog.txt | grep --line-buffered 'xxxx' | while read line; do ./myscript.bash "$line"; done
./myscript.bash
#!/bin/bash
echo $1
出力例
$ sudo sh -c "echo 'xxxx xxxx' >> /var/log/mylog.txt"
↓
xxxx xxxx
一定時間以内に終わらない場合に kill (timeout)
timeout -sKILL 5 sleep 10
一時ディレクトリの作成 (mktemp)
mktemp -d
=> /tmp/tmp.hDHrvpO5Rm
スレッドを含めてプロセス確認
以下のようなコマンドが利用できます。
ps auxwH
top -H
htop
GPU の使用状況を確認
lspci
で GPU を確認します。
lspci
Intel GPU の場合
sudo apt install intel-gpu-tools
sudo intel_gpu_top
NVIDIA GPU の場合 (GPU-Util
や GPU を使用しているプロセスが確認できます)
sudo bash NVIDIA-Linux-x86_64-430.40.run
nvidia-smi
GUI の diff (meld)
meld file1.txt file2.txt
コンソールを切り換える
ctrl + alt + f1-6
ISO を USB に書き込む
sudo dd if=./debian-9.6.0-amd64-DVD-1.iso of=/dev/sdb
GlusterFS コマンド
ノード上で情報の確認
sudo /usr/sbin/gluster volume info
sudo less /var/log/glusterfs/glustershd.log
ノード外からマウントして利用
sudo apt install glusterfs-client
sudo mkdir -p /mnt/gluster1
sudo mkdir -p /mnt/gluster2
sudo mount -t glusterfs mygluster-0001:/gluster-volume /mnt/gluster1
sudo mount -t glusterfs mygluster-0002:/gluster-volume /mnt/gluster2
sudo su -l
echo ok > /mnt/gluster1/ok.txt
cat /mnt/gluster2/ok.txt
sudo umount /mnt/gluster1
sudo umount /mnt/gluster2
Debian 既定のブラウザで URL を開く (sensible-browser)
sensible-browser http://www.example.com/ &
FAT ファイルシステムの作成 (Debian)
必要なコマンド /sbin/mkfs.vfat
をインストールします。
sudo apt install dosfstools
USB を umount します。
sudo lsblk
sudo umount /dev/sdb1
/dev/sdb
内に /dev/sdb1
パーティションを作成します。
sudo fdisk /dev/sdb
o
create a new empty DOS partition table
Command (m for help): o
n
add a new partition (p
primary、残りすべてデフォルト)
Command (m for help): n
t
change a partition type (b
W95 FAT32)
Command (m for help): t
w
write table to disk and exit
Command (m for help): w
フォーマットします。
sudo mkfs.vfat -F 32 -n MyFlashDrive /dev/sdb1
結果を確認します。
sudo file -s /dev/sdb
sudo file -s /dev/sdb1
参考
ext4
にフォーマットする場合は以下のようにします。
sudo mkfs -t ext4 /dev/sdb
Samba による Windows と Debian のファイル共有
インストールします。
sudo apt install samba
共有ディレクトリを作成します。
sudo mkdir /home/share
sudo chown nobody:nogroup /home/share
sudo chmod 777 /home/share
設定ファイルを編集します。
sudo vi /etc/samba/smb.conf
以下を [global]
設定に追加します。
[global]
unix charset = UTF-8
dos charset = CP932
workgroup = WORKGROUP
bind interfaces only = yes
map to guest = Bad User
interfaces = 192.168.101.124 enp0s25
以下をファイルの末尾に追加します。
[Share]
path = /home/share
writable = yes
guest ok = yes
guest only = yes
create mode = 0777
directory mode = 0777
サービスの状態を確認します。
systemctl list-unit-files --no-pager -t service | grep smbd
systemctl is-enabled smbd.service
sudo systemctl enable smbd.service
#sudo systemctl disable smbd.service
systemctl status smbd.service
パイプの進捗を表示 (pv; pipe viewer)
sudo apt install pv
cat
に進捗を表示する機能を追加したようなものです。
pv /tmp/data.bin | gzip > /tmp/data.bin.gz
ファイルサイズが不明な場合は経過時間とサイズのみ表示されます。
cat /tmp/data.bin | pv | gzip > /tmp/data.bin.gz
SSH サーバ の SOCKS プロキシとして利用 (DynamicForward)
SOCKS プロキシは、OSI 参照モデルにおけるアプリケーション層 L7 よりも下位のセッション層 L5 で動作します。SSH サーバは以下のようにして SOCKS プロキシとして利用できます。
ポート 3333 で待ち受ける SOCKS サーバとして SSH サーバ step.example.com
を利用
ssh -D 0.0.0.0:3333 step.example.com
-D
オプションの代わりに以下のように ssh config を設定することもできます。
DynamicForward 0.0.0.0:3333
以下のようにして SOCKS プロキシを利用します。以下のいずれも同じ意味です。名前解決もリモートの SSH サーバ側で行われます。
curl --socks5-hostname 127.0.0.1:3333 http://internal.example.com/
curl --proxy socks5h://127.0.0.1:3333 http://internal.example.com/
curl -x socks5h://127.0.0.1:3333 http://internal.example.com/
名前解決をローカルサーバで行うためには以下のようにします。
curl --socks5 127.0.0.1:3333 http://internal.example.com/
curl --proxy socks5://127.0.0.1:3333 http://internal.example.com/
curl -x socks5://127.0.0.1:3333 http://internal.example.com/
カメラの RTSP 配信を観る
RTSP (Real Time Streaming Protocol) 配信されるカメラからの映像を確認できます。カメラが複数ある場合は channel
を変更して切り換えます。
sudo apt install vlc
SSH トンネルと併用する場合
ssh remote.example.com -L 8554:192.168.100.123:554
vlc rtsp://localhost:8554/user=admin\&password=\&channel=1\&stream=0.sdp?real_stream--rtp-caching=100
PCI デバイスの確認
NIC (Network Interface Card) や GPU など様々なデバイスが PCI (Peripheral Component Interconnect) デバイスとして接続されます。
接続されている PCI デバイスが認識できているかの確認
sudo apt install pciutils
sudo lspci -v
PCI デバイスのドライバが存在するかの確認
lsmod | grep xxx
cat /proc/modules | grep xxx
デバイスドライバは一般に以下の場所に保存されます。
$ find /lib/modules -name *atlantic*
/lib/modules/4.9.0-11-amd64/updates/dkms/atlantic.ko
インターフェースを指定してルーティングを確認 (traceroute -i)
sudo traceroute -i ens4 172.16.10.101
sudo traceroute -i enp10s0 172.16.10.101
テンプレートファイルに環境変数を埋め込む (envsubst)
sample.yaml
hello:
${MYKEY}: ${MYVALUE}
実行例
export MYKEY=aaa
export MYVALUE=123
cat sample.yaml | envsubst
hello:
aaa: 123
curl による GraphQL リクエスト
Query
Content-Type
に application/graphql
を指定する場合は URL エンコードが必要です。
curl -sS -XGET -H 'Content-Type: application/graphql' "http://localhost:8080/graphql?query=$(echo {users{id}} | jq -srR @uri)"
json としてリクエストすることもできます。
curl -sS -XGET -H 'Content-Type: application/json' 'http://localhost:8080/graphql' -d '{ "query": "{users{id}}" }'
ホストのローカル IP を取得
hostname -i
関連記事
- ipコマンドの基本的な使い方ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
- プロセス関連のコマンドプロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
- rpmとyumのチートシートrpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
- メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
- 運用時に大活躍する必須コマンドファイル内容を再帰的に検索 (grep) find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。 $ grep -nri "pattern" dir -n (--li...