■Linux基本操作
・pwdで今の場所を確認
・ls ファイルのリストを確認
・↑↓の矢印キーを使って、前のコマンドを再表示できる
・Tabキーで補完

◆2.文字列を探す。→ grep
findによるファイル名を探すのとはまた別
①文字を探す(基本)
192.168.1.10という文字列を/etcディレクトリの中から探す場合。

grep "192.168.1.10" /etc/*

②オプション
・サブディレクトリ以下も探す場合は -rオプション(recersive再帰的?)
# grep -r "@seeeko.com" /*

・除外して表示 -vオプション
たとえば、以下をすれば、実際にログインできるユーザがある程度分かる
cat /etc/passwd | grep -v "nologin"

・-i 大文字小文字の区別をしない
# grep "wao" -i -r /var/www
/var/www/html/index.html:waooooo
/var/www/html/a.php:echo 'Hello Wao';

◆コピー
cp -pでアクセス権などを保持したままコピーする。pはpermanentだと思う。このオプションをつけないと、もともとのアクセス権とコピー先のアクセス権の積が新しいアクセス権である。
cp -r (recursive) ディレクトリごとコピーする。ちなみにmvには-rオプションは存在しない。
 (例) cp -r dirA dirB dirAをdirBという名でコピー

こんなコピーの仕方もできる。それほど楽になるわけではないが
cp named.conf{,.org}

◆移動
mvを使う
ディレクトリでも使える。cpと違って-rオプションは不要
-f 移動先にファイルがあっても上書きする場合は-fオプションをつける。
-i 上書きする場合に警告を出す。

・フォルダの異動
配下にファイルがあることを気にせず、以下でよい。
#mv dir1 dir2

◆削除
rm -f 強制削除 (消しますか?と聞かれない)
rm -rf とすると、フォルダ配下のファイルごと消す

◆LinuxでもRDPを使う。
Linuxの場合は、rdesktop(http://www.rdesktop.org/)というプログラムを使えば、制限はあるものの、Windows XP Professionalのリモートデスクトップ機能にアクセスできる。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/431usexprd.html

◆ファイル比較
diff /etc/a.txt  /etc/b.txt とすることで、a.txtとb.txtの2つのファイルを比較することができる。

①一致しているか違うか
diff -q a.txt b.txt
→differと出れば、違う

②どこが違うかもわかる
#diff -q a.txt b.txt
1,2c1,2  

※cはCompare(比較)という意味。左側の1,2が1行目と2行目、cの右側が1行目と2行目。つまり、1行目と2行目が違うと言っている。

◆locate
ファイルの場所を検索できる。(結構使える)
findに比べて、DBを作成するので
apt install locate
updatedb
locate ファイル名(部分的でOK)

◆ファイル(ディレクトリ)の検索 find
①標準の使い方
・基本構文は以下
 find [ 場所 ] -name [ ファイル名 ]  ※ファイル名は' ' で囲っていいと思う。
・例えば、カレントディレクトリから pgsqlというファイルやディレクトリを探す。
find -name pgsql
※全ファイルを検索したいのであれば、cdでルート(/)に移動する、またはファイルの場所として / を指定する。
・ファイル名には*も使える。
find / -name pgs*
・ファイルに限定したい場合は、末尾に -type f ディレクトリに限定するには -type d
find / -name pgs* -type f

②修正された時間や日から検索する。
たとえば、1日以内に修正されたファイルを検索するのであれば
find / -mtime 1
https://qiita.com/narumi_/items/9ea27362a1eb502e2dbc

■ファイルの取得 curl
(1)curlの基本
wgetでも同様にファイルを取得できる。しかし、wgetはHTTPとHTTPS、FTPのみだが、それに比べてSCPなど、対応するプロトコルが多い。
①オプションを付けないと
HTTTPレスポンスのメッセージボディのみを表示
curl http://www.exapmle.com

②-iオプションで
全てのレスポンス

③ファイルをダウンロードする場合は-Oオプションを付ける
普通にそのままcurlコマンドを実行すると、画面に表示する仕様なので、-Oオプション(大文字のO)をつけて、ファイルとして取得する。

※windows curl -o (小文字)で、パスとファイル名を指定できるはず。
curl.exe -o C:\file.txt URL
※wgetの場合は、-Oなどのオプションを付けずに、そのままファイルのURLを指定すればいよい。

(2)curlのメソッドによる操作の違い
まあ、PUTやDELETEメソッドはHTTPサーバ側で拒否されていると思うが、参考までに以下。
以下はWebDavが許可されている場合。
①アップロード (上書きも可能)
curl -T a.txt --url http://10.1.1.115/dav/a.txt -X PUT
②ファイル取得
curl -O http://10.1.1.115/dav/a.txt
以下だと、ファイルを取得せずに中身を表示
curl --url http://10.1.1.115/dav/a.txt -X GET
③ファイルDELETE(削除)
curl --url http://10.1.1.115/dav/a.txt -X DELETE

■言語の状態を確認する
/etc/sysconfig/i18n

LANG= で設定されている言語がわかる

ズや利用率などがわかる。kはキロバイト表示の意味。dfはファイルシステム単位での表示で、duはファイルやディレクトリ単位での表示。
du -s sはsummuryで、合計値を出す。ユーザのホームディレクトリの使用量合計を見る場合などに便利である。
df -hとすると、単位が見やすくなる。
hはhumanのhだと思う。人間が見やすい状態になる。
たとえば 40313964→40G

■ルーティング
・netstat -r ルーティングに関する情報を表示
・スタティックルートの追加
route add -net 10.1.1.0 netmask 255.255.255.0 gw 192.168.1.254 (eth0)
※最後のインターフェース(eth0など)は省略可能。

表示
-a すべての接続を表示
-l Listeningの接続を表示
-s Summery(統計)が表示される。ICMPなどのプロトコルごとに集約される。

◆基礎情報
init=initialize(初期化)
rc.dなどのように、dがついているものは、ディレクトリであることを明示的に示している。

rc=run command

inittab=(initialize table)
/etc/inittabにおいて、デフォルトのランレベルを設定する。

◆起動スクリプトと実行ファイル
(1)起動スクリプト
/etc/rc.d/init.d/sshd
たとえば,start コマンドがわたされた場合にはどうるするか
が記載されている

(2)実行ファイル
/usr/sbin/sshd
バイナリファイルとして存在する.

◆コマンドライン
| パイプ コマンドを続けて実行
> リダイレクト 結果をファイルへ出力。既存のファイルがある場合は、完全に上書きされる。
>> 結果をファイルに追記
; コマンドを続けて実行
& バックグラウンドで実行
&& コマンドの結果がYesなら次のコマンドを実行 逆が ||

■リダイレクト
エラーも含めて表示するには
 rmdir dir1 >& file3
https://webkaru.net/linux/redirect-output-to-file/

■LinuxにおけるPrintScreen
X window dumpという。コマンドは、頭文字をとってxwd

 xwd -frame out ファイル名 
 
frameオプションは、フレームも含めてキャプチャする。

■cron
crontabであるが、最近は使わないかもしれない。
0,7は日曜日 1が月

-e 編集(edit)
-r remove
-l list

★注意点は、AWSの場合は、crondではなく、cron
systemctl status cronをみると、動いていることがわかる。

また、書き方にはいろいろあるが、以下が参考になった。/etc/cron.d/にファイルをおきましょう。
http://thoames.hatenadiary.jp/entry/2018/12/30/101021
/etc/cron.d/にファイルを作る。そうすると、実行される
/etc/cron.d/cert_month
0 0 1 * *       root    /etc/lego/abc.sh
※うまく動くか、さてどうだろうか。

■tcpdump
コマンドラインだとWiresharkをインストールしにくい。GUIじゃなにから、見るのも困難。
だが、Linuxにはパケットキャプチャのコマンドがすでに入っている。それがtcpdump

送信元が192.168.1.10の80ポートへの通信をキャプチャする。
#tcpdump src host 192.168.1.10 and port 80

80番ポートへのパケットをキャプチャする ※例として、Webサーバへのパケットをキャプチャ
# tcpdump -i eth0 dst port 80 -vvv
※vvvは、詳細の意味。パケットのヘッダなどもキャプチャしてくれる。

tcpdump -i ens33 src 100.64.1.75
-iはインターフェース
srcは送信元IPアドレス
https://webkaru.net/linux/tcpdump-command/

■コンパイルしてインストール
たしかmake make installなどの手順を踏む。
・./configure
引数を渡すことで、インストール時の設定を変えることができる。
たとえば、--prefix= によって、インストール先のディレクトリを変えることができます。

◆画面切り替え
Ctrl + Alt + F1~F7によって、コンソール画面を切り替えることが可能になる。これによりXwindowのようなマルチウィンドウ操作が可能である。

■ブラウザの起動
firefox & でブラウザを起動
&をつけておくと、ターミナルで操作を続けることができる

■パス
コマンドが通らない場合
whichで探すといい
# which iptables
/sbin/httpd

・今のパスを表示
# echo $PATH 
・追加する場合は、
# export PATH=$PATH:/usr/xxxx

■CentOSのバージョン確認方法
cat /etc/redhat-release
※uname -rだと、よくわからない。

■ログ
認証エラーは以下に保存される。認証に失敗したら、見るといいだろう
 /var/log/secure
SSHなどの接続ログもここにに記録される。失敗も成功も、ログオフした時間も。
・成功の場合
Jul 13 05:01:54 ip-172-31-41-230 sshd[3221]: Accepted publickey for ec2-user from 203.0.113.184 port 50933 ssh2: RSA SHA256:I8Bm***S3TG7I
・パスワード認証の失敗
Jul 19 10:12:49 ip-172-31-41-230 sshd[12229]: Failed password for user1 from 203.0.113.184 port 61101 ssh2

うまく記録されないときは、サービスがおかしいのかもしれない。
以下をお試しあれ(ネット情報のコピペなので、内容は不明)

rm /var/lib/rsyslog/imjournal.state
systemctl restart rsyslog.service

また、ポートスキャンのログは、特定のファイルには残らないようだ。設定で、何でも取得するというような変更が必要だと思う。

(3)ログの設定
以下から
vi /etc/logrotate.conf
たとえば、以下のようにログの保存期間というかローテーション数が記載されている。
# rotate log files weekly
weekly  ←ローテーションの周期
# keep 4 weeks worth of backlogs
rotate 4 ←どれだけ保存するか

なので、4週分で削除されてしまう。1年間保管したいのであれば、48にする。


■wc
・word count
wc ファイルの単語数を表示できる。
wc -l 行数を表示する

■headとtail
先頭および末尾から指定された行数だけ表示する。
tail はよく使うと思う。
たとえば、以下はfile.txt の先頭の10行を表示する
head -10 file.txt

■vmstat
CPUやメモリの使用状況を見る
#vmstat 1 ←1秒間隔で再表示

■syslogサーバに転送
AWSでSyslogサーバを構築してみる。AWSのセキュリティグループで、TCPとUDPの514番ポートを開けておく
#rsyslogのインストール。awsはすでに入っているが、入っていなければ以下を実行
yum -y install rsyslog

#バージョンの確認
rsyslogd -v
rsyslogd 8.24.0-57.amzn2.1, compiled with:
        PLATFORM:                               x86_64-koji-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes


#/etc/rsyslog.confを編集し、ログを受け付け

#Confファイルのバックアップを取っておこう
cd /etc
cp rsyslog.conf rsyslog.conf.org

#以下の15行目と16行目のコメントアウトを外す
 14 # Provides UDP syslog reception
 15 $ModLoad imudp
 16 $UDPServerRun 514

#再起動
systemctl restart rsyslog
 
#ログの保存場所は、/var/log/messages
#送られて来ているかは、以下で見るといいだろう。
tcpdump port 514

【参考までに、CiscoルータでSyslogサーバを指定する方法】

### IFにIPアドレスの設定
conf t
int gigabitEthernet 0
ip address 192.168.1.120 255.255.255.0
no shutdown
exit

### デフォルトルートの設定
ip route 0.0.0.0 0.0.0.0 192.168.1.1

### Syslogサーバの指定
logging host 203.0.113.125
end

### 疎通確認(インターネットへ接続できるか
ping 8.8.8.8

■CentOSでWireshark
CentOSにWiresharkをインストールする
もちろん、GUIで利用する。CLIじゃわからいよね→tcpdumpの方がいいだろう。
①インストール
# yum install wireshark-gnome
②起動
# wireshark &
・GHEXをインストール →うまくいかなかった。Ubuntu向けのアプリのようだ。
①インストール
#yum -y install ghex

■LinuxにThunderbirdを入れる
#yum install thunderbird
GUI画面のアプリケーション>インターネット に登場する

■ファイルの圧縮、解凍
フォルダの圧縮・解凍には、gzipとgunzip,tarがある

①zipファイル
zip filename で圧縮、unzip filename で解凍できる。では、順にやってみよう。
・3つのファイルをZIPで一つのファイルに圧縮する
# zip total.zip file1.txt file2.txt file3.txt
  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)

・以下で解凍。
# unzip total.zip
Archive:  total.zip
 extracting: file1.txt
 extracting: file2.txt
 extracting: file3.txt

・また、-lをつけると、解凍せずに中身だけみることができる。
# unzip -l total.zip
Archive:  total.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        3  02-12-2020 1:43   file1.txt
        4  02-12-2020 1:43   file2.txt
        5  02-12-2020 1:43   file3.txt
---------                     -------
       12                     3 files

tarで圧縮するとWindowsでは取得できないので、zipがいい。-rはフォルダごとのバックアップ

#zip html -r ./html

②gunzip
#gunzip filename.gz
ただし、フォルダに関しては、gzipが使えないのでtarを使う

よくわからないが、以下の場合は
https://github.com/ctfs/write-ups-2014/tree/master/seccon-ctf-2014/get-the-key-txt
#gunzip < 1

#guzip -c 1  こちらでも成功。
本当は、オプション無しでも解凍できるはずだが、失敗

※TeraTermのSCPではフォルダは転送できないので、圧縮しよう

②gzファイル
gzファイルの解凍
gunzip ファイル名.tar.gz

# ls
ctf2021.tar.gz
# gunzip ctf2021.tar.gz
# ls
ctf2021.tar
# tar -xvf ctf2021.tar

※gzファイルから一気に解凍するには以下かも
tar -zxvf ctf2021.tar.gz

③tar
#tar czf html.tar.gz /var/www/html
※ただし、絶対パスは推奨されていないので、以下のようなエラーがでる。でも、いちおう、圧縮してくれる
tar: Removing leading `/' from member names

ただ、tarで圧縮するとWindowsでは取得できないので、zipがいい。

■パケットを作る
hpingを使う
https://qiita.com/hana_shin/items/8147777ff42e7dad89d6

■その他
・画面をクリアする →clearコマンド
・コマンドを複数並べる → &&
yum -y update && reboot


■コマンドラインでif文
①以下は、数字が一致しているかどうかとう単純なもの
if [ 2 -eq 1 ]; then echo true; else echo false; fi
②以下はファイルを取得してきて、grep -q の後に記載した文字列がindex.htmlに含まれているかどうかで処理を変える。
curl -O http://x.x.x/index.html
if grep -q moji index.html ;then echo "OK">result.html;else echo "NG">result.html;fi

forも使える
https://qiita.com/w_atame/items/6232465079d924eae805