コマンドメモ
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.bak
でfile.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
まぁなんでこれ試したかってーと、-Cの説明よく読んだら「ディレクトリDIRへ移動」ってあるんで、ファイル指定より前にこれ指定したら、もしかして移動処理が先に行われてから指定ファイル取り出し処理が走るんじゃね?
— z a k i 🌈 (@zaki_hmkc) September 18, 2020
と思ったのがたまたま当たったという
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
a
はaddress
の、s
はshow
の省略形。上記は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
connection
とdevice
は、それぞれc
とd
に短縮可能。
インタフェース詳細
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)
:
:
名称変更
デフォルトの有線接続 1
をens192
とかに変えたい場合
[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