Linux まとめ

#コマンド

####;　$pwd;ls
左のコマンドでエラーが起きても成功しても右のコマンドを実行する。

####&&　 $ls prog/ruby && pwd
最初のコマンドが正常に終了した時だけ2番目のコマンド実行

####||　$cat temp||echo "file not found"
最初のコマンドが正常に終了しなかった時だけ、2番目のコマンドが実行される。

####() $(date;pwd;ls)>kekka.log
コマンドをまとめて実行

####’’(シングルクォーテーション)
$echo ＄DATE
＞8月31日
$echo '＄DATE'
＞＄DATE
文字列として出力される。

####""(ダブルクォーテーション)
$echo ＄DATE
＞8月31日
$echo "今日の日付は＄DATEです"
＞今日の日付は8月31日です。
''と同じ。$の変数の部分は変数として出力される。

####``(バッククォーテーション)
$echo"カレントディレクトリは'pwd'です。"
＞カレントディレクトリは/home/lpicです。

$echo"カレントディレクトリは＄(pwd)'です。"
＞カレントディレクトリは/home/lpicです。

コマンド結果を出力できる。下の書き方の方がわかりやすいのでおすすめ。

####less

|キー操作|説明|
|---|---|
|スペースキー|下方向に1画面スクロール|
|bキー|上方向に1画面スクロール|
|/|下方向検索|
|?|上方向検索|

####|(パイプ)

ls | wc -l
lsコマンドの実行結果をwcの標準入力に渡す。

dmesg|less
カーネルメッセージをlessの標準入力に渡す。

####>(リダイレクト)
$ls -l > filelist
表示結果をfilelistにいれる。

####>>
$ls -l >> filelist
表示結果をfilelistの末尾に追加。

####<
$grep "lpic" <target.txt>result.txt
標準入力

$cat > sample.txt <<EOF
EOFが入力されるまで、出力。

####2>
$find / -name "*.tmp" 2> error.log
エラー出力のみをファイルに保存。

####cat
cat file1 file2 > newfile
応用:file1 file2をnewfileに連続して書き込む

|オプション|説明|
|---|---|
|-n|行番号をつけて表示|

####nl
テキストファイルに行番号をつけて表示。

####tail
最終行から10行表示。

|オプション|説明|
|---|---|
|-n　行数|指定された行数だけ表示|
|-f|リアルタイム表示。表示中に追加されたら更新する。(ctrl+cで終了)|

####tr
$cat /etc/hosts | tr 'a-z' 'A-Z'
ファイルの中の小文字を全て大文字に変換してcat

####split
$split -100 sample.txt s_sample.

sample.txt s_sample.aa s_sample.ab s_sample.ac

sample.txtを100行ごとに他のファイルに分ける。
(ファイル名はaa,ab,ac...末尾につく)

####ハッシュ
|コマンド|説明|
|---|---|
|md5sum|MD5によるハッシュ値を出力する|
|sha1sum||
|sha256sum||
|sha512sum||

$sha1sum sample.txt
sample.txtファイルのSHA1ハッシュ値を表示

####grep
$grep -i ab sample.txt

$grep -v '^#' /etc/httpd/conf/httpd.conf
冒頭に#がつく行(コメントアウト)を省いて表示。(^:初めの一文字目を表す正規表現)

|オプション|説明|
|---|---|
|-i|大文字小文字を区別せず検索|
|-v|パターンがマッチしない行を表示|


####vi

入力モード

|コマンド|説明|
|---|---|
|i|カーソルの前にテキストを入力する|
|a|カーソルの後にテキストを入力する|
|I|行頭の最初の文字にカーソルを移動し、その直前にテキストを入力する|
|A|行末にカーソルを移動し、その直後にテキストを入力する|
|o|カレント行の下に空白行を挿入し、その行でテキストを入力する|
|O|カレント行の上に空白行を挿入し、その行でテキストを入力する|


コマンドモード

|コマンド|説明|
|---|---|
|h|1文字左へ移動する|
|l|1文字右へ移動する|
|k|1行上へ移動する|
|j|1行下へ移動する|
|o|行の先頭へ移動する|
|$|行の末尾へ移動する|
|H|画面の一番上の行頭へ移動する|
|L|画面の一番下の行頭へ移動する|
|gg|ファイルの先頭行へ移動する|
|G|ファイルの最終行へ移動する|
|nG|ファイルのn行目に移動する|
|:n|ファイルのn行目に移動する|

5hで5文字左に移動

|コマンド|説明|
|---|---|
|:q|ファイルへ保存せずに終了する|
|:q!|編集中の内容を保存せずに終了する|
|:wq|編集中の内容を保存して終了|
|:w|編集中の内容でファイルを上書き保存する|
|:e!|最後に保存した内容に復帰する|
|:! コマンド|viを終了せずにシェルコマンドを実行する|
|:r! コマンド|シェルコマンドの実行結果を挿入する|

:!ls でviを動作させたまま、lsコマンドを実行できる。

viの編集コマンド

|コマンド|説明|
|---|---|
|dd|カレント行を削除|
|dw|カーソル一から次の単語までを削除する|
|yy|カレント行をバッファにコピーする|
|:w|編集中の内容でファイルを上書き保存する|
|p|カレント行の下にバッファの内容を貼り付ける|
|P|カレント行の上にバッファの内容を貼り付ける|
|x|カーソル位置の文字を削除(delete)|
|X|カーソル位置の手前の文字を削除(backspace)|

5dd でカーソル位置から5行削除。

viの検索コマンド

|コマンド|説明|
|---|---|
|/|カーソル位置から後ろ方向に向かって検索|
|?|カーソル位置から後ろ方向に向かって検索|
|n|次を検索する|
|N|次を検索する(逆方向)|
|:noh|候補のハイライト表示を解除する|
|:%s/A/B/|最初に見つかった文字列Aを文字列Bに置換する|
|:%s/A/B/g|全ての文字列Aを文字列Bに置換する|


|コマンド|説明|
|---|---|
|:set nu|行番号を表示する|
|:set nonu|行番号をh非表示する|
|:set ts=タブ幅|タブ幅を数値で指定する|

#ファイル管理

####gzip

|コマンド|説明|
|---|---|
|-d|圧縮ファイルを展開する|
|-c|標準出力へ出力|
|-r|ディレクトリ内のファイル全て圧縮する|

$gzip datafile
ファイルを圧縮

$gzip -r sampled
sampledディレクトリ内にある全てのファイルを個々に圧縮

$gzip -c datafile >datafile.gz
圧縮前のフォルダも残し圧縮

$bzip2 datafile
bzipはgzipよりも時間がかかるが圧縮効率は高い。
(解凍は　オプション　-dをつける)

$xz datafile
xzはbzipよりも時間がかかるが圧縮効率は高い。
(解凍は　オプション　-dをつける)

####zcat,bzcat,xzcat
$zcat sample.gz
圧縮されたテキストファイルを解凍せずに確認する。

####tar
ファイルやディレクトリを1つのアーカイブファイルにまとめたり、それを展開できる。
zオプションでgzip圧縮と同じ。

|コマンド|説明|
|---|---|
|-c|アーカイブを作成する|
|-x|アーカイブからファイルを取り出す|
|-t|アーカイブの内容を確認する|
|-f ファイル名|アーカイブファイル名を指定する|
|-z|gzip 圧縮/展開|
|-j|bzip2 圧縮/展開|
|-J|xz 圧縮/展開|
|-v|詳細な情報を表示する|
|-u|アーカイブ内にある同名のファイルより新しいものだけを追加する|
|-r|アーカイブにファイルを追加する|
|-N|指定した日付より新しいデータのみを対象とする|
|-M|複数デバイスへの分割|
|-delete|アーカイブからファイルを削除する|

tar cvf /dev/st0 /home
/homeのアーカイブファイルを　/dev/st0に作成

tar xvzf software.tar.gz
アーカイブファイルをカレントディレクトリに展開。

tar tf /dev/sdb1 
/dev/sb1にあるアーカイブの内容を表示する。

tar xvf /dev/sdb1 var/log/secure
/var

####cpio
$ls | cpio -o >/tmp/backup
カレントディレクトリを/tmp/backupファイルとしてバックアップ。

####dd
$dd if=/dev/sdb of=/dev/sdc
/dev/sdbに接続されたディスクの内容をそのまま/dev/sdbに出力。

ddコマンドは、ハードディスクやCD-ROMなどのデバイスの内容をそのまま扱える。
cpコマンドは、ファイルをコピーするだけ。

|コマンド|説明|
|---|---|
|-if|入力側ファイルを指定する|
|-of|出力側ファイルを指定する|

####chmod
|オプション|説明|
|---|---|
|-R|指定したディレクトリ以下にある全ファイルのアクセス権を変更する|

|対象|説明|
|---|---|
|u|所有者|
|g|グループ|
|o|その他ユーザー|
|a|全てのユーザー|

|操作|説明|
|---|---|
|+|権限を追加する|
|-|権限を削除する|
|=|権限を指定する|

|許可の種別|説明|
|---|---|
|r|読み取り許可|
|w|書き込み許可|
|x|実行許可|
|s|SUID or SGID|
|t|スティッキービット|

$chmod go+w samplefile
グループとその他ユーザーに書き込み権限を与える

$chmod o-rw samplefile
その他ユーザーから書き込み実行権限をなくす

$chmod 644 samplefile
644に変更

####SUID,SGID
SUID ファイルの所有者の権限で実行可能

chmod u+s samplefile

SGID グループのアクセス権が適用される。

####スティッキービット
書き込み権限はあっても、自分以外のユーザーが所有するファイルを削除できない。

chmod o+t sampledir

####umask
デフォルトのアクセス権が決められている。

$umask
0002

ディレクトリは777からファイルは666からumaskを引いた権限がデフォルト

d→775  file→664

####chown
|オプション|説明|
|---|---|
|-R|指定したディレクトリとその中にある全ファイルの所有者を変更する|

####ハードリンク
それぞれのファイルで同一の実体を参照する。
$ln file.original file.link_hard
####シンボリックリンク
リンク下の場所を示す。(ショートカット)
$ln -s file.original file.link_hard

ls -l 
作成したリンクを確認。

シンボリックリンクのコピーにはdをつける。

cp -d file.link_sym file.link3

付けないとリンク元のファイルがコピーされる。
cp file.link_sym file.link2

####top
プロセスの監視
Qで終了

####バックグラウンドジョブの実行

updatedb &
&を付けることでバックグラウンドで処理を実行できる。

jobs
jobsコマンドで実行中のジョブを確認できる。

長時間にわたって席を外す場合などで実行し続けげ欲しい。
ログアウトしても実行していて欲しい場合。
nohubを付ける。
$nohup updatedb &

現在実行しているジョブをバックグラウンドで行いたい場合。
ctrl + zで一時停止　→　bg 1
(1はジョブの番号　jobsでわかる)
バックグラウンドをフォアグラウンドに変えたいときはfg

####free
メモリの空き状況

|オプション|説明|
|---|---|
|-m|MB単位で表示する|
|-s 秒|指定した間隔で表示し続ける|

####uptime
平均負荷など

####uname
OSの確認

uname -a 
詳細表示

####watch
watch -n 10 uptime
10秒ごとにuptimeを実行。

####nice
コマンド実行時の優先度指定。
$nice -n -10 updatedb

#デバイス管理ファイル管理

####find
$find /root -name "*.txt"
ファイル名で検索

|検索式|説明|
|---|---|
|-name ファイル名|ファイル名で検索する|
|-atime 日時|最終アクセス時刻で検索する|
|-mtime 日時|最終更新時刻で検索する|
|-perm アクセス権|アクセス権で検索する|
|-size サイズ|ファイルサイズで検索する|
|-type ファイルの種類|ファイルの種類で検索するf:ファイル　l:シンボリック　d:ディレクトリ|
|-user ユーザー名|ファイルの所有者で検索する|
|-print|マッチしたファイルを表示する|
|-exec コマンド ｜｜ ¥; |マッチしたファイルに対してコマンドを実行|
|-ok コマンド ｜｜ ¥; |マッチしたファイルに対してコマンドを実行(確認あり)|

$find /data -type f -mtime -1
過去１日以内に更新されたファイルを検索

$find /usr/bin -type f -perm -u+s
/usr/binディレクトリ以下からSUIDが設定されたファイルを検索。

$find /tmp -user student
所有者がstudentであるファイルディレクトリを検索。

$find -atime +30 -exec rm {}¥;
30日を超える日数の間アクセスされていないファイルを検索し、削除。

#シェルとシェルスクリプト
####エイリアス
$alias ls='ls -l'
コマンドに別名をつけることができる。
$alias lsless='ls -l|less'

$unalias lsless
設定されているエイリアスを解除

####関数
$function lslink(){ls -l|grep '^l';}
シンボリックリンク (lから始まる)のみを表示するlslink関数

$function lslink(){ls -l ＄1 | grep '^1';}
$1で引数。引数にディレクトリなどを入れれる。

$declare -f lslink
定義されている関数のみを表示。

unset lslink
lslink関数を削除。

####bashの設定ファイル
|ファイル|説明|
|---|---|
|/etc/profile|ログイン時に実行され、全ユーザーから参照される|
|/etc/bash.basic|bash起動時に実行され、全ユーザーから参照される|
|/etc/bashrc|~/.bashrcから参照される　bash起動時から参照。|
|~/.bash_profile|ログイン時に実行される|
|~/.bash_login|~/.bash_profileがない場合、ログイン時に実行される|
|~/.profile|~/.bash_profileも~/.bash_loginもない場合、ログイン時に実行|
|~/.bashrc|bash起動時に実行される|
|~/.bash_logout|ログアウト時に実行される|

####シェルスクリプト
実行(読み取り権限必要)
$bash lsld

$source lsld

$. lsld

(実行権限必要)
chmod a+x lsld
$./lsls
そのままファイル名で実行される。

|変数名|説明|
|---|---|
|$0|シェルスクリプトファイル名(フルパス)|
|$1|1番目の引数|
|$2|2番目の引数。以下＄３＄４＄５|
|$#|引数の数。|
|$@|全ての引数(スペース区切り)|
|$*|全ての引数(区切りは環境変数IFSで指定されたもの)|

####実行結果の戻り値
正常終了→0
異常終了→0以外

＄echo $?
2

戻り値は＄?に代入される。

####ファイルのチェック
testコマンド

|条件式|実行結果|
|---|---|
||ファイル形式のテスト|
|-f ファイル|(ディレクトリなどを除く)ファイルがあれば真|
|-d ディレクトリ|ディレクトリがあれば真|
|-r ファイル|ファイルが存在し、かつ読み込み可能であれば真|
|-w ファイル|ファイルが存在し、かつ書き込み可能であれば真|
|-x ファイル|ファイルが存在し、かつ実行可能であれば真|
|-s ファイル|サイズが0より大きいファイルがあれば真|
|-L ファイル|シンボリックリンクであるファイルがあれば真|
||ファイル特性のテスト|
|-e ファイル|ファイルがあれば真|
|ファイル1 -nt ファイル2|ファイル1がファイル2より修正時刻が新ければ真|
|ファイル1 -ot ファイル2|ファイル1がファイル2より修正時刻が古ければ真|||ファイル特性のテスト|
||数値のテスト|
|数値1 -eq 数値2|数値1と数値2が等しければ真|
|数値1 -ge 数値2|数値1が数値2より大きい、もしくは等しければ真|
|数値1 -gt 数値2|数値1が数値2より大きければ真|
|数値1 -le 数値2|数値1が数値2より小さい、もしくは等しければ真|
|数値1 -lt 数値2|数値1が数値2より小さいもしくは等しければ真|
|数値1 -ne 数値2|数値1と数値2が等しくなければ真|
||文字列のテスト|
|-n 文字列|文字列の長さが0より大きければ真|
|-z 文字列|文字列の長さが0であれば真|
|文字列1=文字列2|2つの文字列が等しければ真|
|文字列1!=文字列2|2つの文字列が等しくなければ真|
||テストの論理結合|
|!条件|条件が偽であれば真|
|条件1 -a 条件2|両方の条件式が真であれば真(and)|
|条件1 -o 条件2|いずれかの条件式が真であれば真(or)|

####条件分岐
if 条件式
then 
    実行文1
else 
    実行文2
fi

####Case
case $1 in
1)echo "January";;
2)echo "February";;
esac

####read
名前を標準入力から聞くことができる。
echo -n "Who are you?:"
read username    ←ここでユーザーに聞いて
echo "Hello,$username!"   ←ここで使う

シェルスクリプトの1行目
＃!/bin/bash

#管理タスク
ユーザーアカウント設定されているファイル
/etc/passwd

グループ
/etc/group

####useradd
useradd -c "Linux User" -d /home/linux -s /bin/bash linuxuser

|オプション|実行結果|
|---|---|
|-c コメント|コメントフィールドを指定|
|-d ディレクトリ|ホームディレクトリを指定|
|-s パス|デフォルトシェルを指定|

####ジョブスケジューリング
####cron

crontab
/var/spool/cron ディレクトリ以下に置かれる。

|オプション|実行結果|
|---|---|
|-e|crontabを編集(直接viなどで開いてはいけない)|
|-l|内容表示|
|-r|ファイル削除|
|-i|削除時に確認する|
|-u ユーザー名|ユーザー名を指定してcrontabファイルを編集(rootユーザーのみ)|

書式
分　時　日　月　曜日　コマンド

|フィールド|実行結果|
|---|---|
|曜日|0-7までの整数(0,7:日曜〜6土曜）|

15 23 * * * /usr/local/bin/backup
(毎日23:15に起動)


0 9,12 * * 1 /usr/local/bin/syscheck
(月曜の09:00と12:00に起動)

0 */2 * * * /usr/local/bin/syscheck
(2時間ごとに起動)

####at
一回限りのスケジューリング
$at 5:00 tomorrow
at>/usr/local/sbin/backup
at>^D ←ctrl+Dキーを入力で終了。

####systemd
何らかのイベントから一定時間後に発動などができる。

#メール
mail[-s題名][宛先メールアドレスorユーザー名]

mail -s samplemail student
Hello!Student!　　←本文
.
EOT

mail
受信メールを確認

#ネットワークの基礎
####ping

|オプション|実行結果|
|---|---|
|-c 回数|指定した回数だけパケット送信|
|-i 間隔|指定した間隔(秒)ごとにポケット送信|

####traceroute
指定されたホストまでパケットが伝わる経路を表示。

####hostname
現在のホスト名を表示。

ホスト名を指定した場合、ホスト名を変更。

####netstat
ネットワークの様々な情報を表示。
開いているポートの確認など。

####nc
ネットワーク上のcatコマンド

$nc -l -p 12345 -o listen.log
12345番ポートで待ち受けし、受け取ったデータをlisten.logファイルに出力。

$nc centos7.example.com 12345<data.txt
ホストの12345ポートに対し、data.txtファイルの内容を出力。

####ifconfig
ipアドレスの確認。

####DNSの設定ファイル
/etc/resolv.conf

/etc/nsswitch.conf
hostsを優先するかDNSサーバーを優先するかの順序を選択。

####host
ホストのipがわかる。ipのホストがわかる。

#セキュリティ
####nmap

$nmap www.example.net
開いているポート番号とサービス名(ssh,http)が確認できる。

####SUIDが設定されているファイルを確認する方法。
定期的に確認を行うべし。
＃find / -perm -u+s -ls

####一般ユーザーのログインを停止する
＃touch /etc/nologin
nologinファイルを作成しておくことで、ルート以外のログイン以外は禁止される。

####scp
scp コピー元ファイル名　[ユーザー名@]　コピー先ホスト:[コピー先ファイル名]

scp /etc/hosts sv3.example.jp:/tmp 
ローカルホストの/etx/hostsをリモートホストsv3.example.jpの/tmp以下にコピー。

scp 　[ユーザー名@]コピー元ホスト:コピー元ファイル名 コピー先ファイル名

$scp sv3.example.jp:/etc/hosts .
リモートホストsv3.example.jpの/etc/hostsをカレントディレクトリにコピー。

$scp data.txt fred@sv3.example.jp:
リモートホストsv3.example.jpのfredユーザーのホームディレクトリにローカルホストのdata.txtファイルをコピー