モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

使い所が難しいマイナーな運用コマンド

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/05/26
最終更新最終更新
2022/11/01
記事区分記事区分
一般公開

目次

    AWS EC2 のスポットインスタンスを活用したコスト削減を最近会社で行いました。

    コマンドのエイリアスを登録する (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 コマンド

    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-Typeapplication/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
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    AWS EC2 のスポットインスタンスを活用したコスト削減を最近会社で行いました。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • ipコマンドの基本的な使い方
        ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
        こもれびさんこもれびさん2/8/2017に更新
        いいねアイコン画像0
      • プロセス関連のコマンド
        サムネイル画像-7b5901f600
        プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
        kenken11/27/2021に更新
        いいねアイコン画像0
      • rpmとyumのチートシート
        サムネイル画像-f69c6665b8
        rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
        まるたんまるたん2/2/2022に更新
        いいねアイコン画像0
      • メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識
        メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
        しおまめしおまめ8/30/2017に更新
        いいねアイコン画像0
      • 運用時に大活躍する必須コマンド
        ファイル内容を再帰的に検索 (grep) find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。 $ grep -nri "pattern" dir -n (--li...
        ねこねこ9/7/2021に更新
        いいねアイコン画像0