# Linux

## Useful commands and tips

### ssh
Do not use default `22` port
```bash
ssh user@ip -p 22222
```

Login without password

```bash
# adds private key identities to the authentication agent
ssh-add ~/.ssh/id_rsa

# use locally available keys to authorise logins on a remote machine

ssh-copy-id user@ip -p 22222
```

### Add user to the sudo group

```bash
usermod -aG sudo youruser
```

### IP table

### Cron job

List cron jobs for current user

```bash
crontab -l
```

List cron jobs for some user

```bash
crontab -u user -l
```

Edit cron jobs

```bash
crontab -e
```

#### An example cron job

For example, you can run a backup of all your user accounts

```bash
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
```
#### Check cron jobs logs

```bash
grep CRON /var/log/syslog
```

#### Cron job expression

`MIN HOUR DOM MON DOW`

Field    Description    Allowed Value
MIN      Minute field    0 to 59
HOUR     Hour field      0 to 23
DOM      Day of Month    1-31
MON      Month field     1-12
DOW      Day Of Week     0-6

### PS
```bash
ps aux | grep 'ruby'
```
List process, using `grep` to filter processes
### tail
Tailing texts from file in realtime

```bash
tail -f a.log
```
`f` means following, auto append texts to console
### nohup
Simply running application in background


### df
```bash
df -h
```
Show disk usage and left, `h` means show in human readable way. Normally by MB/GB.
### free
```bash
              total        used        free      shared  buff/cache   available
Mem:        3960624      416720      270024       22252     3273880     3264060
Swap:       4104188      109688     3994500
```
Show memory usage and

### Watch
```
watch kubectl get pods
```
Continuous running the commands, watching the changes. By default it refresh the result every `2s`.

### Change timezone
```bash
TZ=Asia/Shanghai;
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
```

### Check release
```bash
cat /etc/*-release
```

### Debian check system version
```bash
cat /etc/issue

cat /etc/debian_version
```

### htop

like top, but more

#### mosh

auto reconnect ssh

### show last something time

```bash
last shutdown
last reboot
```

### Count files in current folder

```bash
find . -type f | wc -l
```
### Check if a port is open

Used Netcat

```bash
if ! nc -z localhost 5672; then
sleep 3;
fi
```

### scp copy files between host

#### Copy files from remote server

```bash
scp your_username@remotehost.edu:foobar.txt /local/dir
```

### Copy local files to remote server

```bash
scp /path/to/local/file user@server:/path/to/remote/file
```

### Merge video files into one

```bash
ffmpeg -f concat -safe 0 -i ./files.txt -c copy output.mp4
```

In the `files.txt` you should list all the video clips like the following

```txt
file 1.flv
file 2.flv
file 3.flv
```

### Curl

Curl is a very popular and powerful HTTP client, there is also another very good tool called `httpie` written in Python which is even eaiser to use.

The following are some useful commands:

#### Post request with file
```bash
curl --data "@$(pwd)/fixure/sample.json" --user "foo:bar" localhost:8080/api/abc
```

### Mount

#### Mount NFS(Network file system) to local

```bash

mkdir /to-local-folder
# mount
mount -t nfs -O user=abc,pass=pass 192.168.1.2:/nfs-folder  /to-local-folder

# remount
mount -o remount /to-local-folder
```

#### Mount folder permanently

In the example above, the mounted folder will lost the connection when you restart your system, in order to permanently mount the folder, you will need to edit `/etc/fstab` by adding one more line

```
192.168.1.2:/nfs-folder   /to-local-folder    nfs    defaults    0 0
```
You can specify more options

```
192.168.0.216:/nfs-folder   /to-local-folder    nfs    defaults,proto=tcp,port=2049    0 0
```

### Rsync

Sync folders and files between folders and hosts

### sync between directories

```bash
rsync -avzh /root/rpmpkgs /tmp/backups/
```
#### sync folders between hosts

```bash
rsync -avz --exclude downloads --exclude 'some-folder' /mnt rsync://user@192.168.1.2/rsync/ -v -c
```

You can export `RSYNC_PASSWORD` to pass password to the command.

#### Check rsync logs

```bash
grep -ir rsync /var/log
```

## Popular Distributions

### Debian
### Ubuntu

### Manjaro

### Fedora

Fedora is the main project, and it’s a community-based, free distro focused on quick releases of new features and functionality.

### CentOS

CentOS is basically the community version of Redhat. So it’s pretty much identical, but it is free and support comes from the community as opposed to Redhat itself.

### RHEL (RedHat Enterprise Linux)

![redhat](https://raw.githubusercontent.com/wahyd4/knowledge-mind-mapping/master/assets/images/redhat.webp)


RHEL is the corporate version based on the progress of that project, and it has slower releases, comes with support, and isn’t free.

### Arch Linux

## Package manager

* [snap](https://snapcraft.io/)
* [Brew](https://brew.sh/)
