Last modified on 01 Oct 2021.
How it works?
- Local creates
public_key
(id_rsa.pub
) &private_key
(id_rsa
). - Only
private_key
can understandpublic_key
. - Remote sends messages encrypted based on
public_key
. - Local has to use
private_key
to understand (decrypt) remote’s messages.
Generate a public key
- Windows: Using below command, if it asks for a location, indicate
C:\Users\dinha\.ssh\
- Linux:
/home/thi/.ssh/
ssh-keygen -t rsa -b 4096 -C "[email protected]" # without email ssh-keygen -t rsa -f ~/.ssh/id_rsa.home
Multiple ssh keys
- Create key with different names, e.g.
id_rsa.home
,id_rsa.work
. - Add to
~/.ssh/config
,Host home Hostname home.example.com IdentityFile ~/.ssh/id_rsa.home User <your home acct> Host work Hostname work.example.com IdentityFile ~/.ssh/id_rsa.work User <your work acct>
- Add to ssh-agent (don’t need to retype password again)
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa.home ssh-add ~/.ssh/id_rsa.work
- Don’t forget to clone you repo with
git
instead ofhttps
.
Add public key to remote
Suppose that we wanna connect to a remote host [email protected]
from a local machine.
- On local machine, copy public key at
C:/Users/dinha/.ssh
(Windows) and~/.ssh
(Linux) (something likeid_rsa.pub
) (copy its content). - On remote server (Linux), go to
~/.ssh
, open file authorized_keys byvim authorized_keys
- Be carefull, you can modify the current keys!
- Go to the end of this file (by W)
- Press I to enter to the editing mode, press Enter for a new line.
- Using mouse to copy/paste the key in the 1st step (on your local machine).
- Note that, each key stays in a separated line.
- ESC and then type
:wq
to quick and save. - Try to connect again!
Connecting
ssh remote_username@remote_host
ssh remote_username@remote_host -p remote_port
# CHECK VERSION
ssh -V
# DISCONNECT
exit
# COPY FILE: LOCAL -> REMOTE
scp local_file user@remote-host:/var/tmp/
# multiple files, using wildcat "\*"
# REMOTE -> LOCAL
scp user@remote:/usr/local/bin/add.sh .
# multiple files, using wildcat "\*"
# pass inside the command
sudo apt-get install sshpass
sshpass -p your_password ssh user@hostname
# copy with sudo on remote
# 1. copy to a place you have permissions
scp * thi@remote:/home/thi/tmp/
# 2. move to the place you want
ssh thi@remote sudo mv /home/thi/tmp/\* /place/we/want
Command line parameters
# FOR EXAMPLE
ssh -C # use data compression
Usage: Access jupyter notebooks from remote server on local machine.
Below are some popular commands[ref] :
# check the full list
man ssh
# exit background running
sudo apt install net-tools
netstat -lepunt
# kill a process, e.g. 29231/ssh
kill <pid> # eg. kill 29231
-C
: use data compression.-f
: Requests ssh to go to background just before command execution-L
: local port forwarding[ref] .-N
: Do not execute a remote command. This is useful for just forwarding ports-p <port>
: port to connect.-q
: quiet mode.-v
: verbose mode.-X
: running GUI remote app locally.
Errors
# REMOTE HOST IDENTIFICATION HAS CHANGED
# Offending ECDSA key in /home/thi/.ssh/known_hosts:21
# SOLUTION:
# Open /home/thi/.ssh/known_host and delete line 21