コンテンツにスキップ

コマンドメモ

bash

除外のglob

ls !(*.txt)

*.txt以外を展開

forループワンライナー

for i in `seq 1 3`; do curl 192.168.0.16; done

seqの値を参照

for i in `seq 1 3`; do curl 192.168.0.${i}; done

if/elseワンライナー

if [ $value == "fobar" ]; then command_a; else commandb; fi

less

終了時にクリアしない

起動時に-Xオプションを付加する

less -X

制御文字を認識させる

ESC[32mとか大量に表示されたときは、表示中に-r押下してenter

大文字小文字無視して検索

表示中に-i押下してenter

行番号表示

実行時のオプションで-Nを付与するか、表示中に-N押下する。

less -N

find

ディレクトリ除外

$ find /path/to -path (除外パス) -prune -o (検索条件) -print
find . -path "*venv" -prune -o -name "*.py" -print

とか。

スペース込みのパスとxargsの連携

以下で、findの結果が\0区切りになり、xargsのデリミタの扱いが\0になる。

$ find path [opt] -print0 | xargs -0 command

findは結果を改行区切りで出力し、xargsは改行とスペースを区切りとみなすのがデフォルト。
find-print0を付与すると区切りが\0に変更され、xargs-0を付与すると\0区切りで動作する。

zaki@salva% find . -name "*txt"
./a b.txt
./a.txt
./b.txt
./sub/a b.txt
./sub/a.txt
./sub/b.txt
zaki@salva% find . -name "*txt" | od -c
0000000   .   /   a       b   .   t   x   t  \n   .   /   a   .   t   x
0000020   t  \n   .   /   b   .   t   x   t  \n   .   /   s   u   b   /
0000040   a       b   .   t   x   t  \n   .   /   s   u   b   /   a   .
0000060   t   x   t  \n   .   /   s   u   b   /   b   .   t   x   t  \n
zaki@salva% find . -name "*txt" -print0 | od -c
0000000   .   /   a       b   .   t   x   t  \0   .   /   a   .   t   x
0000020   t  \0   .   /   b   .   t   x   t  \0   .   /   s   u   b   /
0000040   a       b   .   t   x   t  \0   .   /   s   u   b   /   a   .
0000060   t   x   t  \0   .   /   s   u   b   /   b   .   t   x   t  \0

date

書式

入力を指定

  • 文字列
$ date -d "2021/06/25 09:00"
2021年  6月 25日 金曜日 09:00:00 JST
$ date -d "2021/06/25 09:00" +%s
1624579200
  • epoch
$ date -d @1624579200
2021年  6月 25日 金曜日 09:00:00 JST
$ date -d @1624579200 "+%Y-%m-%d %H-%M-%S"
2021-06-25 09-00-00

man

セクション番号を指定するには

$ man 5 crontab

など

curl

名前解決オプション

curl --resolve ansible.example.org:443:192.168.0.41 https://ansible.example.org/

ansible.example.orgという名前で192.168.0.41:443へアクセスする。

basic認証

curl -u username:password http://example.org/

ステータスコードのみ取得

curl http://www.example.org/ -w '%{http_code}\n' -sS -o /dev/null

レスポンスヘッダ

curl -I http://www.exmaple.org

タイムアウト設定

$ curl --connect-timeout 2 http://192.168.0.249
curl: (28) Failed to connect to 192.168.0.249 port 80 after 2000 ms: Timeout was reached

wget

リソースの内容をstdoutへ出力

$ wget -q -O - https://storage.googleapis.com/kubernetes-release/release/stable.txt
v1.24.3

base64

デコード

# stdinから
command | base64 -d
# ファイルから
base64 -d FILENAME

sed

$ sed -i -e 's/regexp/string/' file

-iでファイル更新を行う。
-ieって書くと、-i.bakfile.bakのバックアップ作成と解釈されるので分ける。

デリミタ変更

普通に使えばOK

sed -e 's#foo#bar#' file

awk

ps auxの結果の3カラム目を抜き出す。

$ ps aux | awk '{print $3}'

3カラム目と4カラム目をタブで区切って出力。

$ ps aux | awk '{print $3, "\t", $4}'

または、OFS変数(output field separator)にタブをセットし以下。

$ ps aux | awk 'BEGIN { OFS="\t" } {print $3, $4}'

if文

1カラム目がrootの場合の11カラム目を出力

ps aux | awk '{if($1 == "root"){print $11}}'

if文で正規表現

1カラム目が数字のみの場合の行全部

ps aux | awk '{if($1 ~ /[0-9]+/){print $0}}'

envsubst

$ cat sample.template 
hello ${USER}

環境変数$USERが定義されてる状態で、stdinから↑の内容を入力にあたえると

$ envsubst < sample.template 
hello zaki

変数名の書式で記述した箇所が環境変数で展開される。

diff

コマンド実行結果のstdout同士を比較したい場合は以下。

$ diff -u <(command1) <(command2)

screen

マウススクロールで表示をスクロールする

.screenrcに以下追加

termcapinfo xterm* ti@:te@

gzip

.gzファイルを展開してstdoutへ出力

gz圧縮されたログファイルの中身を見たいときなど

gzip -dc /var/log/syslog.10.gz | less

tar

ファイルの追加

既存のtarファイルへ新たにファイルを追加する(append)

tar rvf archive.tar.gz file.txt

展開時の形式指定オプション

gzの場合はzとかは不要。
今はtar xf hoge.tar.gzだけで形式は自動認識する。

指定ディレクトリで展開したい

$ tar xf archive.tar.gz -C /tmp

tarファイル内の特定ファイルを取り出したい

$ tar xf archive.tar.gz hoge

特定ファイルだけを指定ディレクトリ展開

$ tar xf archive.tar.gz hoge -C /tmp

または

$ tar -C /tmp -xf archive.tar.gz hoge

zip

[コマンドメモ] Linuxでzip操作 - zaki work log

ファイル一覧

$ zipinfo <zip-file>

展開

-q付ければquietモードでファイル名が出力されない

$ unzip -q <zip-file>

-dで出力先ディレクトリ指定

$ unzip <zip-file> -d <dirname>

圧縮

$ zip gitlab-compose.zip gitlab-compose/ -r

-rは必須

ps

子プロセスツリー表示

$ ps 
    PID TTY          TIME CMD
 434128 pts/2    00:00:00 bash
 456871 pts/2    00:00:00 ps
$ ps f
    PID TTY      STAT   TIME COMMAND
 434128 pts/2    Ss     0:00 /bin/bash
 456875 pts/2    R+     0:00  \_ ps f

子プロセス一覧

$ ps auxf
:
:
root        1961  0.0  1.1 1104052 91304 ?       Ssl   5月12   6:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd
root      241047  0.0  0.0 438492  4124 ?        Sl    5月26   0:00  \_ /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 
root      241052  0.0  0.0 217040  5636 ?        Sl    5月26   0:00  \_ /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8000 
root      241066  0.0  0.0 298968  5572 ?        Sl    5月26   0:00  \_ /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 
root      241073  0.0  0.0 218448  5628 ?        Sl    5月26   0:00  \_ /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 49155
:
$ ps --ppid 1961
    PID TTY          TIME CMD
 241047 ?        00:00:00 docker-proxy
 241052 ?        00:00:00 docker-proxy
 241066 ?        00:00:00 docker-proxy
 241073 ?        00:00:00 docker-proxy

孫プロセスは出ない

ヘッダ無し

$ ps --ppid 1961 --no-headers
 241047 ?        00:00:00 docker-proxy
 241052 ?        00:00:00 docker-proxy
 241066 ?        00:00:00 docker-proxy
 241073 ?        00:00:00 docker-proxy

kill

kill -0

If sig is 0, then no signal is sent, but existence and permission checks are still performed; this can be used to check for the existence of a process ID or process group ID that the caller is permitted to signal.

sig に 0 を指定した場合、シグナルは送られないが、 プロセスの存在と権限のチェックは行われる。これを使って、送信者がシグナルを送信できるプロセス ID や プロセスグループ ID の存在確認を行うことができる。

man kill(2)

linux - kill -0 は何をするのでしょうか? - スタック・オーバーフロー

top

ソート

実行中にPでCPU使用率、Mでメモリ使用率でソートされる。

分かりづらいけどx押下でソート基準のカラムが太字になる。

CPUコア毎

実行中に1押下

top - 09:18:32 up 69 days, 11:39,  0 users,  load average: 0.01, 0.02, 0.05
Tasks: 134 total,   1 running, 133 sleeping,   0 stopped,   0 zombie
%Cpu0  :  2.0 us,  0.7 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.7 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  1.3 us,  0.7 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7990048 total,   717480 free,  1974248 used,  5298320 buff/cache
KiB Swap:  3670012 total,  3670012 free,        0 used.  5665228 avail Mem 

コマンドフルパス・引数表示

実行中にc押下

top - 09:20:43 up 69 days, 11:41,  0 users,  load average: 0.00, 0.01, 0.05
Tasks: 134 total,   1 running, 133 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7990048 total,   715400 free,  1976168 used,  5298480 buff/cache
KiB Swap:  3670012 total,  3670012 free,        0 used.  5663308 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                             
 351149 zaki      20   0 1280996 358920   9912 S   0.0  4.5   8:37.98 /home/zaki/.vscode-server/data/User/globalStorage/hashicorp.terraform/bin/terraform-ls serve                        
 350657 zaki      20   0 1029428 147820  21832 S   0.3  1.9   2:04.98 /home/zaki/.vscode-server/bin/899d46d82c4c95423fb7e10e68eba52050e30ba3/node /home/zaki/.vscode-server/bin/899d46d8+ 
 350535 zaki      20   0  963792 102092  18036 S   0.0  1.3   2:00.07 /home/zaki/.vscode-server/bin/899d46d82c4c95423fb7e10e68eba52050e30ba3/node /home/zaki/.vscode-server/bin/899d46d8+ 
 385441 root      20   0 1130612  62204  26536 S   0.0  0.8   0:10.18 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock      

ユーザー作成

作成する

useradd zaki -m -d /home/zaki -s /bin/bash -G admin,sudo
オプション 動作
-m ホームディレクトリ作成を有効
-d ホームディレクトリのパス
-s デフォルトシェル指定
-G 追加の所属グループ指定

削除する

userdel zaki -r
オプション 動作
-r ホームディレクトリなどのデータを削除

timedatectl

NTPの無効・有効

timedatectl set-ntp false

trueで有効

タイムゾーン設定

timedatectl set-timezone Asia/Tokyo

dig

Aレコード

デフォルトは実行ホストのOSで設定されているネームサーバーに対してAレコードを問い合わせる。

$ dig gmail.com

; <<>> DiG 9.16.28-RH <<>> gmail.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20838
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;gmail.com.                     IN      A

;; ANSWER SECTION:
gmail.com.              180     IN      A       142.251.42.197

;; Query time: 7 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Thu Apr 28 10:31:34 JST 2022
;; MSG SIZE  rcvd: 54

逆引き

-xオプションを使う

$ dig -x 192.168.0.16

; <<>> DiG 9.16.33-RH <<>> -x 192.168.0.16
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3719
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;16.0.168.192.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
16.0.168.192.in-addr.arpa. 0    IN      PTR     cloud-dev2.
16.0.168.192.in-addr.arpa. 0    IN      PTR     cloud-dev2.local.

;; Query time: 2 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Thu Dec 15 17:03:57 JST 2022
;; MSG SIZE  rcvd: 108

ip

指定インタフェースのみ

showも付与する。

ip a s ens18

aaddressの、sshowの省略形。上記はip address show ens18が正しい表記。

ルーティングテーブル確認

ip route

ip rも可

スタティックルート追加

192.168.0.0/24宛のパケットは、enp4s0インタフェース経由で172.16.1.0へルーティングする」場合

ip route add 192.168.0.0/24 via 172.16.1.0 dev enp4s0

デフォルトルート追加

ip route add default via 172.16.1.0 dev eth1 metric 1000

デフォルトルート削除

ip route delete default dev eth0

NetworkManager

インタフェース一覧

接続してるもの全部

$ nmcli connection

デバイス一覧

$ nmcli device

connectiondeviceは、それぞれcdに短縮可能。

インタフェース詳細

sまたはshowの引数に、インタフェース名を指定する。

# nmcli c s ens192
connection.id:                          ens192
connection.uuid:                        fd81b589-db4b-445d-9e60-22524aab4e9f
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              ens192
connection.autoconnect:                 はい
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
:
:

名称変更

デフォルトの有線接続 1ens192とかに変えたい場合

[zaki@fedora-node ~]$ nmcli c s
NAME             UUID                                  TYPE      DEVICE
有線接続 1       e8d83bb5-ce0a-3fe8-911e-8bc57153091c  ethernet  ens18
[zaki@fedora-node ~]$ sudo nmcli c m "有線接続 1" connection.id ens18
[zaki@fedora-node ~]$ nmcli c s
NAME             UUID                                  TYPE      DEVICE
ens18            e8d83bb5-ce0a-3fe8-911e-8bc57153091c  ethernet  ens18

インタフェースの接続と切断

# nmcli con up ens224
# nmcli con down ens224

インタフェースの削除

nmcli c delete ens224

IPアドレスをstaticに変更

DHCPでインストールしたあとに変更したいときとか。
methodをmanualに変更するのはaddressesをセットしたあとでないとエラーになるので注意。

nmcli c m ens192 ipv4.addresses "192.168.0.79/24"
nmcli c m ens192 ipv4.gateway "192.168.0.1"
nmcli c m ens192 ipv4.method manual

最後に再起動

nmcli c down ens192
nmcli c up ens192

DNSの設定変更

# nmcli c m ens192 ipv4.dns 192.168.0.11

これで設定ファイルが更新されるので、systemctl restart NetworkManagerすれば設定が反映される。

DNSのセカンダリ追加

追加する項目であるipv4.dnsの手前に+を付与すると「追加」になる。
-を付与すると対象を削除になる。

DNS1の設定がある状態で下記を実行すると、DNS2の設定として追加される。

# nmcli c m "System ens192" +ipv4.dns 192.168.0.1

DNSのsearch行追加

my.example.orgを設定するには

# nmcli c m ens192 ipv4.dns-search my.example.org
# systemctl restart NetworkManager

デフォルトゲートウェイ変更

192.168.39.89に設定する

# nmcli c m ens192 ipv4.gateway 192.168.39.89

設定削除する

# nmcli c m ens192 ipv4.gateway ""

[Ansible] ターゲットホストのIPアドレスの参照とデフォルトゲートウェイの設定についてのメモ - zaki work log

スタティックルート追加

環境: [VyOS] NAT設定を使ったネットワーク間のルーティング (手動 & Ansible / vyos_config) - zaki work log

やりたいこと

  • デフォルトゲートウェイはens192側の192.168.0.1
  • NICは2面 (ens192: 192.168.0.44/24, ens224: 172.16.0.44/23)
  • 172.29.0.89 へ疎通を追加したい
    • このアドレスはens224の先の172.16.1.3/23がルーティングする

コマンド

# nmcli c m ens224 +ipv4.routes "172.29.0.0/24 172.16.1.3"
# nmcli c u ens224

4.2. nmcli を使った静的ルートの設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal

この辺が追加される。
リブートしても有効

[root@fedora-node ~]# ip r
default via 192.168.0.1 dev ens192 proto static metric 100 
:
:
172.29.0.0/24 via 172.16.1.3 dev ens224 proto static metric 101 

Fedora34だと設定ファイルは/etc/NetworkManager/system-connections/ens224.nmconnectionで、内容はこんな感じ。

[ipv4]
address1=172.16.0.44/23
dns=172.16.2.0;
dns-search=
method=manual
route1=172.29.0.0/24,172.16.1.3

設定解除は-を付けて実行。

# nmcli c m ens224 -ipv4.routes "172.29.0.0/24 172.16.1.3"

systemd

一覧

systemctl list-unit-files

ホスト名

変更

sudo hostnamectl set-hostname rhel8

resolvectl

Fedoraなど。

DNS設定確認

resolvectl status

ファイアウォール

iptables

ルール確認

# iptables -L

TCPポート許可追加

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

リダイレクト
10.0.0.1からの80/tcpアクセスを8080/tcpへリダイレクトする場合。(8080/tcpも許可は必要)

# iptables -t nat -A PREROUTING -p tcp -s 10.0.0.1 --dport 80 -j REDIRECT --to 8080

自分への443/tcpアクセスをリモートの172.29.0.14:443へリダイレクトする場合。

iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 172.29.0.14:443

リダイレクトルールの削除

まずルールの確認を--line-numbersを付与して行番号を確認。

# iptables -L -t nat --line-numbers

番号を確認したら、それを引数に以下を実行。(PREROUTINGルールの場合)

# iptables -t nat -D PREROUTING 1

firewall-cmd

[コマンドメモ] firewall-cmd備忘録 (firewalld) - zaki work log

確認

ゾーンの設定確認

firewall-cmd --list-all [--zone=internal]

全ゾーンの設定確認

firewall-cmd --list-all-zones

ゾーン一覧

firewall-cmd --get-zones

アクティブなゾーンの一覧

firewall-cmd --get-active-zones

ゾーン設定

ゾーンに指定インタフェースを設定

firewall-cmd --permanent --zone=trusted --change-interface=cni0

ゾーンから指定インタフェースを削除

firewall-cmd --permanent --zone=trusted --remove-interface=cni0

ufw

現在の状態。
※アクティブになっていない

root@oci-g-a1-ubuntu:~# ufw status
Status: inactive

有効化する。
ssh経由の場合警告される。(iptables -nLあたりで22/tcpが開いてる事を確認しておけば…良いのかな)

root@oci-g-a1-ubuntu:~# ufw enable 
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

再読み込みと状態確認。

root@oci-g-a1-ubuntu:~# ufw reload 
Firewall reloaded
root@oci-g-a1-ubuntu:~# ufw status
Status: active

TCPポートの許可

root@oci-g-a1-ubuntu:~# ufw allow 6443
Rule added
Rule added (v6)
root@oci-g-a1-ubuntu:~# ufw reload 
Firewall reloaded
root@oci-g-a1-ubuntu:~# ufw status
Status: active

To                         Action      From
--                         ------      ----
6443                       ALLOW       Anywhere                  
6443 (v6)                  ALLOW       Anywhere (v6)             

※ 操作のみ。この環境はufwを使ってないらしく動作は未確認

alternatives

ubuntuだとupdate-alternativesで、RHEL系だとalternativesになる。

設定一覧

ubuntuの場合

root@oci-ap-a1-ubuntu:~# update-alternatives --get-selections 
arptables                      auto     /usr/sbin/arptables-nft
awk                            auto     /usr/bin/gawk
builtins.7.gz                  auto     /usr/share/man/man7/bash-builtins.7.gz
c++                            auto     /usr/bin/g++
:
:

Fedoraの場合

[root@cloud-dev2 ~]# update-alternatives --list 
libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
soelim                  auto    /usr/bin/soelim.groff
iptables                auto    /usr/sbin/iptables-nft
:

設定の登録

pythonという名前で、/usr/bin/pythonを優先度10で登録する。

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
update-alternatives: using /usr/bin/python3 to provide /usr/bin/python (python) in auto mode

これで、以下のリンクが作成される。

$ ls -l /usr/bin/python /etc/alternatives/python 
lrwxrwxrwx 1 root root 16 Mar 31 15:16 /etc/alternatives/python -> /usr/bin/python3
lrwxrwxrwx 1 root root 24 Mar 31 15:16 /usr/bin/python -> /etc/alternatives/python

設定

$ update-alternatives --display python
python - auto mode
  link best version is /usr/bin/python3
  link currently points to /usr/bin/python3
  link python is /usr/bin/python
/usr/bin/python3 - priority 10