Linux コマンド集
2022/07/10, last updated 2023/08/28 - ~11 Minutes
ファイル関連
ファイル操作
ファイル作成
linux でファイル作成をするコマンドいろいろ
空ファイル作成 - touch コマンド
touch ファイル名
ファイルが存在しなければ、指定したファイル名の空ファイルができる。
(ファイルが存在すれば、ファイルのタイムスタンプ(access と modificationらしい)を現在の日時に変更する。)
テキスト作成その1 - vi (vim) コマンド
vi ファイル名
vim ファイル名
テキストエディタ vi(vim) が開くので、適当にテキストを打って保存する。
テキスト作成その2 ー echo コマンド
echo "hoge" > ファイル名
テキスト作成その3 - cat コマンド
cat > ファイル名 # 入力待ちになるので ctrl d を押して入力を終了する
サイズ指定して作る - dd コマンド
# ランダムな値を 1024 バイトのブロックサイズで 1 ブロック(つまり 1024 バイト)出力する
dd if=/dev/urandom of=ファイル名 bs=1024 count=1
if=/dev/zero だと 0 が 1024 バイト書き込まれる。
ファイル表示
cat コマンド
本来は、ファイルを結合(concat)する目的だと思うが、短いファイルを表示するのに使ったりする。
cat /var/log/messages
スクロールする時は、TeraTerm/Putty など、端末エミュレータのスクロール機能を使う。
less コマンド
1画面に収まらないファイルや標準出力を見る時に使う。
### /var/log/messages を見る
less /var/log/messages
### hoge.tgz 内のファイル一覧を見る
tar tvzf hoge.tgz | less
良く使うキー操作
- j で下方向
- l で上方向
- スペースで次のページ
- b で前のページ
- /単語で下方を検索
- ?単語で上方を検索
- / で前回検索した単語を下へ検索
- ? で前回検索した単語を上へ検索
- F でファイルへの書き出しを待つようになる (tail -f のような動作になる) / CTRL+C で脱出
- & で指定したパターンにマッチする行だけフィルタして表示
ファイルコピー
linux でファイルをコピーするためには、cp コマンドを使う。
# httpd.conf を httpd.conf.orig にコピー
# 何もオプションを付けなければ、コピー先ファイルのタイムスタンプは、現在時刻
cp httpd.conf httpd.conf.orig
# -p を付けると、モード、オーナー、タイムスタンプもコピーする
cp -p httpd.conf httpd.conf.orig
ファイル削除
# ファイル削除
rm ファイル名
rm *.txt # *.txt を削除
# ファイルを削除するかどうか確認してから削除
rm -i ファイル名
# 確認せず、強制的に削除
rm -f ファイル名
ディレクトリ操作
ディレクトリ作成
mkdir コマンドを使う。
mkdir ディレクトリ名
mkdir -p 何か/パス/名 # 途中のディレクトリが無ければ自動的に作る
ディレクトリコピー
cp コマンド
# /var/log 以下を root のホームディレクトリにコピー
cp -rp /var/log ~root # root のホームディレトリに log ディレクトリがコピーされる
# root のホームディレクトリに log.bak ディレクトリがあれば、log.bak ディレクトリ以下に、log ディレクトリができる
# root のホームディレクトリに log.bak ディレクトリがなければ、log.bak ディレクトリとしてコピーされる
cp -rp /var/log ~root/log.bak
tar コマンド
tar コマンドを使うこともできる。
# カレントディレクトリを /dokoka/path にコピー)
tar cf - . | (cd /dokoka/path; tar xf -)
tar cf - . | tar xf - -C /dokoka/path
# カレントディレクトリを dokoka-no-server の /dokoka/path にコピー
# dokoka-no-server に ssh でログインできる場合
tar cf - . | ssh dokoka-no-server tar xf - -C /dokoka/path
rsync コマンド
rsync を使うこともできる。
rsync は、ファイルを比較して新しければコピーしてくれるので、例えば、私は、HTML ファイルのアップロードに使っている。
# カレントディレクトリを /tmp/hoge にコピーする
rsync -av . /tmp/hoge
# カレントディレクトリを my-web-server の ~/www にコピーする。(ssh ログインできる必要あり)
# z フラグは圧縮、C は .git などをコピーしない
# 【危険!!!】--delete はコピー元にファイルが無ければ、コピー先を削除
rsync -avzC --delete . my-account@my-web-server:~/www
ディレクトリ削除
# ディレクトリ内が空の場合は削除できる
rmdir ディレクトリ名
# ディレクトリ内も削除
rm -r ディレクトリ名
# 確認せずに、ディレクトリ内も削除
rm -rf ディレクトリ名
検索
ファイルの検索といっても、ファイル名で探したい場合もあれば、ファイル内の単語で検索したい場合があると思う。
ファイル内の単語で検索 - grep コマンド
# カレントディレクトリの *.md ファイルから hoge が含まれているファイルを検索
grep hoge *.md
# カレントディレクト以下から hoge が含まれているファイルを検索
grep -R hoge . # シンボリックリンクを辿る
grep -r hoge . # シンボリックリンクを辿らない
# 大文字小文字を区別せずに検索
grep -i hoge *.md
# 正規表現で検索
grep -E '(hoge){2,}' *.md # hogehoge や hogehogehoge などがマッチ。hoge にはマッチしない。
詳しくは、man grep や info grep を参照。
ファイル名で検索 - find コマンド
# カレントディレクトリ(.) 以下の *.md を検索
find . -name \*.md -print
find . -name '*.md' -print
# カレントディレクトリ以下の *~ を検索
find . -name '*~' -print
# カレントディレクトリ以下の *~ を削除
find . -name '*~' -delete
# カレントディレクトリ以下の *.log を gzip で圧縮
# {} には、マッチしたファイル名が入る
find . -name '*.log' -exec gzip {} \;
# ファイルを検索
find . -type f -print
find . -type f -name 'hu*' -print # ファイルかつ hu*
find . -type f | grep -E 'hu.*' # find コマンドの結果を grep に渡して検索
# ディレクトリを検索
find . -type d -print
# 更新日が直近 24 時間未満
find . -mtime 0 # 何も付けなければ、-print になる
# 更新日が昨日 (24時間以上、48時間未満)
find . -mtime 1
# 更新日が 30 日未満
find . -mtime -30
find . -mtime -30 -ls
# 更新日が 30 日超
find . -mtime +30
find . -mtime +30 -ls
. の所に、ディレクトリ名を指定すると、指定ディレクトリからの検索になる。
詳しくは、man find や info find を参照。
ディスク使用量
linux でディスク使用量、空き容量を確認する
df コマンド
ファイルシステムの使用量を表示。(disk free の略?)
# ディスク使用量、空き容量を表示
df
# G、K など人間が読みやすい形式で表示
df -h
- df –help でヘルプを表示
- man df コマンドで詳細なドキュメントを表示
du コマンド
ファイル使用量の表示(disk usage の略?)
# カレントディレクトリのディスク使用量を表示(通常は1024バイト単位だが、512バイト単位のこともあり)
du
# 下位のディレクトリの表示を省略する
du -s
# カレントディレクトリ下のディレクトリの容量を表示
du -s *
# /var/log にあるディレクトリの容量をソートして表示
du -sb /var/log/* | sort -n
du -sh /var/log/* | sort -h # KMG で表示、ソート
# バイト単位で表示
du -b
# KiB (1024 バイト単位で表示)
du -k
du --block-size=1k
du -BK # K が付く
# MiB (1024*1024 バイト単位で表示)
du -m
du --block-size=1m
du -BM # M が付く
# GiB (1024*1024*1024 バイト単位で表示)
du --block-size=1g
du -BG # G が付く
- du –help でヘルプを表示
- man du コマンドで詳細なドキュメントを表示
圧縮・解凍
ファイル単体
linux で1個のファイルを圧縮、伸長(展開、解凍)する
圧縮 - gzip コマンド
# hoge というファイルを hoge.gz に圧縮する
gzip hoge
# hoge を圧縮して標準出力に出力する
# 以下の例は、hogehoge.gz に出力
gzip -c hoge > hogehoge.gz
伸長 - gunzip コマンド
# hoge.gz を hoge に戻す
gunzip hoge.gz
# hoge.tgz を元に戻して標準出力に出力する
gunzip -c hoge.gz
伸長 - zcat コマンド
gz ファイルを伸長して cat(ファイルを結合) する。
# messages*.gz を gunzip して cat したものを less で見る
zcat messages*.gz | less
gzcat messages*.gz | less # gzcat の場合もあり?
.tgz (.tar.gz) ファイル圧縮・展開(解凍)
linux で .tgz (.tar.gz) ファイル圧縮、展開(解凍)する
# hoge ディレクトリを hoge.tgz ファイルに圧縮する
tar cvzf hoge.tgz hoge # 昔風の指定方法
tar -cvzf hoge.tgz hoge
# hoge.tgz のファイル一覧を見る
tar tvzf hoge.tgz
tar tvf hoge.tgz # 今時はこれでもいける?
gunzip -c hoge.tgz | tar tvf - # gunzip と tar をパイプして使う
# openssl enc -aes128 -in hoge.tgz -out hoge.tgz.aes128 で aes128 暗号化した圧縮ファイルの一覧表示
openssl enc -aes128 -d -in hoge.tgz.aes128 | tar tvzf -
# hoge.tgz を展開する。
tar xvzf hoge.tgz
# hoge.tgz をディレクトリ /tmp に展開する。
tar xvzf hoge.tgz -C /tmp # 昔風の指定方法
tar -xvzf hoge.tgz -C /tmp
cvzf を czf に、xvzf を xzf にすれば、ファイル一覧を表示しない。
z フラグがなければ、圧縮はされない (tar)になる。
zip ファイル圧縮、展開(解凍)
zip コマンドをインストールする必要がある。
ubuntu の場合、以下のようにする。
sudo apt install zip
ファイル圧縮、展開(解凍)
# hoge フォルダーを hoge.zip に圧縮する
# -r は再帰的(ディレクトリを辿る)
zip -ur hoge.zip hoge
# hoge フォルダーをパスワード付きで hoge.zip に圧縮する
zip -ure hoge.zip hoge
# zip ファイル内の一覧表示
unzip -l hoge.zip
# zip ファイルを展開(解凍)
unzip -x hoge.zip
zip だとパーミッションなどが保存できないので、tar (.tar.gz) を使うことが多い。
zip 暗号化
# hoge ディレクトリを zip でパスワード付きで圧縮する
zip -ure /tmp/hoge.zip hoge
# hoge ディレクトリを zip でパスワード付きで圧縮する
zip -ure /tmp/hoge.zip hoge
# カレントディレクトリに暗号化付き zip を展開(解凍)する
unzip /tmp/hoge.zip
暗号化、復号
linux でファイルを暗号化、復号する
openssl コマンド
# ファイル hoge を aes128 で暗号化し、hoge.aes128 に出力する
openssl enc -aes128 -in hoge -out hoge.aes128
# ファイル hoge.aes128 を aes128 で復号し、hoge.decrypted に出力する
openssl enc -d -aes128 -in hoge.aes128 -out hoge.decrypted
# カレントディレクトリを tar gz し、aes128 で暗号化し、/tmp/hoge.tgz.aes128 に出力する
tar cf - hoge | openssl enc -aes128 -out /tmp/hoge.tgz.aes128
# /tmp/hoge.tgz.aes128 を復号し、tar gz で /tmp に展開(解凍)する
openssl enc -d -aes128 -in /tmp/hoge.tgz.aes128 | tar xf - -C /tmp
ファイル数カウント
linux でファイル数を数える方法
ls や find 出力の 行数を数える
ls | wc -l
ls -l | grep -v '^total' | wc -l
find . -type f | wc -l
システム管理
ユーザー切り替え
現在ユーザーの確認
id
ユーザー切り替え
# root になる
su -
sudo -s
# www になる
su - www
sudo -s -u www
# root で rm /var/log/messages.* を削除
sudo rm /var/log/messages.*
ipアドレス
ip アドレスの確認方法
ifconfig コマンド(昔ながらの方法)
ifconfig -a
ip コマンド
ip addr
メモリ確認
linux でメモリ容量を見る
free コマンド
free
実行すると、メモリの使用量が表示される。
Mem: が物理メモリの使用量
Swap: は スワップファイル の使用量
top コマンド
top
# q で終了する
MiB Memory: の行の xxx free と出ている箇所が残りのメモリ量
os バージョン確認
linux で OS のバージョンを確認する
# カーネルバージョンの確認
uname -a
# ディストリビューションの確認
cat /etc/os-release # debian / redhat 共通?
cat /etc/lsb-release # debian 系 (debian、ubuntu など)
cat /etc/rehat-release # redhat 系 (rhel、centos など)
使用中ポートの確認
netstat
# すべての接続を表示
netstat -an
# リッスン中の接続を表示
netstat -ln
# プログラム名も表示
netstat -anp
lsof
# ipv4 の接続と使用中のプログラム名を表示
lsof -i4
# リッスン状態の接続を表示
lsof -i4 -sTCP:LISTEN
ユーザー一覧
linux でユーザー一覧を確認する
ユーザー一覧
パスワードファイルを表示。一番左端がログインID。
cat /etc/password
ユーザー登録
useradd -m ログインID # 一般ユーザー
useradd -m -G wheel ログインID # wheel グループ(管理者グループ)に追加
ユーザー削除
userdel ログインID # ホームディレクトリは残る
userdel -m ログインID # ホームディレクトリも削除
ユーザー編集
usermod -G wheel ログインID # wheel グループに追加
詳しくは以下を参照
- man useradd
- man userdel
- man usermod
shutdown
linux の停止方法について
電源ボタン
物理的な電源ボタンや、クラウド環境なら、画面上の電源メニューから停止する。
電源 off - shutdown コマンド
# os バージョンやディストリビューションバージョンによって違うかも
shutdown -h now
shutdown -p now
systemctl poweroff
再起動 - reboot コマンド
再起動だけさせたいとき。
reboot
systemctl reboot
など
リモート接続・端末関連
リモート接続 (ssh)
# dokoka に dareka ユーザーで接続
ssh dareka@dokoka
# ポートフォワード(ローカルをリモートに転送)
# dokoka に dareka ユーザーで接続
# ローカルの 12345 番ポートに接続すると、(dokoka から見える)sonosaki の 9999 番ポートに接続
ssh -L 12345:sonosaki:9999 dareka@dokoka
# ポートフォワード(リモートをローカルに転送)
# dokoka に dareka ユーザーで接続
# dokoka の 12345 番ポートに接続すると、localhost の 9999 番ポートに接続
ssh -R 12345:localhost:9999 dareka@dokoka
# dokoka に dareka ユーザーで接続
# 1080 番が socks プロキシになる。
# 例えば、ファイアウォールの外にある dokoka があり、ブラウザのプロキシ設定に、localhost 1080 を設定すると、
# ファイアウォールを越えてアクセスできる。
ssh -D 1080 dareka@dokoka
端末多重化 (tmux)
一つの画面で複数の端末を使う。 一つの画面を分割して使ったり、タブのように切り替えて使うことができる。
また、操作中に、ssh 接続が切れてしまった場合などでも、端末を復元できるので便利である。 ssh 接続が切れてもコマンドを実行させ続けることができる。
何も設定していないと、C-b (ctrl+b) に機能が割り当てられる。 シェルのヒストリを使う時、C-b はカーソルを左に移動するキーとして割り当てられており、C-b が使えないのは不便である。 私は、以下のような設定ファイルを作って、C-t に割り当て直している。C-t はそれほど使わないのと、tmux の頭文字 t なので覚えやすいため。
~/.tmux.conf
set-option -g prefix C-t
unbind-key C-t
bind-key C-t send-prefix
# tmux を起動
tmux
# 切断された tmux に接続
tmux a
最低限覚えておくと便利な tmux のキー操作。(C-t に機能を割り当て直した場合)
- C-t " 画面を上下に分割
- C-t o 分割した画面の移動(other)
- C-t c 別タブを開く(
- C-t p 前のタブに移動(previous)
- C-t n 次のタブに移動(next)
- C-t [ コピーモード
- コピーモードで ctrl+space コピー開始位置を指定(wsl だと space だった)
- 領域選択中 ctrl+w で選択中の領域をコピー(wsl だと enter だった)
- C-t ] ペースト
- C-t d tmux を切断 (tmux a で復元)
- C-t ? ヘルプ
GitHub (github cli)
github cli をインストールしておく。
リポジトリの作成
gh repo create リポジトリ名 --public # リポジトリを公開
gh repo create リポジトリ名 --private # リポジトリを非公開(プライベート)
リポジトリの削除
gh repo delete リポジトリ名
HTTP 403: Must have admin rights to Repository. (リポジトリURL)
This API operation needs the "delete_repo" scope. To request it, run: gh auth refresh -h github.com -s delete_repo
が表示される場合は、
gh auth refresh -h github.com -s delete_repo
を実行する。
プロンプトに対して enter を押すとブラウザが起動するので、ログインすると削除権限が有効になる。
権限を有効にした後、gh repo delete 〜 を再度実行すると削除できる。
AWS (awscli)
route53 でドメインをホスティングする
aws route53 create-hosted-zone help の EXAMPLES より。
実行方法
aws route53 create-hosted-zone --name cli.ink --caller-reference $(date -Iseconds)
–caller-reference は二重に実行されるのを防ぐために付ける必要があり、ユニークな文字列。例えば日付(2023-08-27T10:59:36+09:00 など)。
実行結果
{
"Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z03152101KADHH6ZWJXPP",
"HostedZone": {
"Id": "/hostedzone/Z03152101KADHH6ZWJXPP",
"Name": "cli.ink.",
"CallerReference": "2023-08-27T10:57:06+09:00",
"Config": {
"PrivateZone": false
},
"ResourceRecordSetCount": 2
},
"ChangeInfo": {
"Id": "/change/C09011133GV9PTWRON1ZU",
"Status": "PENDING",
"SubmittedAt": "2023-08-27T01:57:07.629000+00:00"
},
"DelegationSet": {
"NameServers": [
"ns-1694.awsdns-19.co.uk",
"ns-36.awsdns-04.com",
"ns-907.awsdns-49.net",
"ns-1306.awsdns-35.org"
]
}
}
ここで返ってくる NameServers をドメインプロバイダのネームサーバに設定すれば、route53 でドメインの管理をすることができるようになる。