ssh remote login

安装ssh

一般都是在本地PC通过ssh远程连接服务器,在本地PC基本都有ssh client程序,而服务器不一定会有ssh server程序。所以首先第一步要确认服务器是否已经安装了ssh server程序(即openssh-server),若已经安装,则跳过;若没有安装,则接下来安装步骤。

  • 服务器上检查是否安装 openssh-server

    可以通过如下命令查询:dpkg -l | grep openssh-server

  • 服务器上安装openssh-server

    可以通过如下命令安装:sudo apt update && sudo apt install openssh-server

  • 服务器上检查sshd服务是否启动

    可以通过几种方式去查询,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    # 方式1
    ps -ef | grep sshd

    # 方式2
    systemctl status ssh

    # 方式3
    service ssh status

    若服务没有启动,则可以通过几种方式去启动,如下:

    1
    2
    3
    4
    5
    # 方式1
    systtemctl start ssh

    # 方式2
    service ssh start

至此,在服务器上安装ssh(即openssh-server)完成。

登录ssh

在服务器上安装ssh后,可以在本地PC通过ssh client连接到服务器ssh server,登录的方式有:秘钥登录公钥登录

秘钥登录

秘钥登录就是通过用户名和密码进行登录,例如通过秘钥登录到树莓派(作为服务器角色)

1
2
# raspberry是树莓派的主机名,也可以替换为树莓派的IP地址。执行命令后,会要求输入pi用户的密码。
ssh pi@raspberrypi

注意:这里没有使用树莓派的IP,而是使用树莓派的主机名。因为树莓派启动了avahi-daemon服务,将树莓派主机名通过mDNS组播,这样树莓派主机名就可以替换它的IP地址。

1
2
3
4
5
pi@raspberrypi:~$ ps -ef | grep avahi
avahi 1014 1 0 15:29 ? 00:00:00 avahi-daemon: running [raspberrypi.local]
avahi 1051 1014 0 15:30 ? 00:00:00 avahi-daemon: chroot helper
pi 3046 3029 50 15:50 pts/1 00:00:00 grep --color=auto avahi

公钥登录

公钥登录是指将本地PC的公钥上传到服务器上,本地PC将登录信息用私钥签名给服务器,服务器用本地PC的公钥鉴别。

  • 本地PC创建公钥

    通过命令创建公钥:ssh-keygen,接下来按下两次次回车键即可创建完成。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    pi@raspberrypi:~$ ssh-keygen -t rsa -C "caoj97141@gmail.com" -f ~/.ssh/id_rsa
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/pi/.ssh/id_rsa
    Your public key has been saved in /home/pi/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:*****ro74Dm9Zn****sfk91dbb****CLjnEOzJD**** caoj97141@gmail.com
    The key's randomart image is:
    +---[RSA 3072]----+
    | |
    | |
    | E |
    | = o o|
    | S o .+|
    | .* .B|
    | . +* o .*=|
    | +.=Xo=oo*|
    | =%@*o+=B|
    +----[SHA256]-----+

    执行命令后会提示输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),当然也不可以不输入密码,直接回车跳过。这样设置之后,git push时就不需要输入密码,直接提交到git仓库。

    命令执行完成后,生成秘钥文件(公钥和私钥):~/.ssh/id_rsa.pub~/.ssh/id_rsa

  • 上传公钥到服务器

    通过命令将公钥上传到服务器,可以使用如下命令:cd ~/.ssh && scp id_rsa.pub pi@raspberrypi:/home/pi

  • 服务器修改ssh配置

    先在服务器创建 ~/.ssh/authorized_keys,然后将本地PC的公钥写进入。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 创建文件
    mkdir /home/pi/.ssh
    touch /home/pi/.ssh/authorized_keys

    # 公钥写入
    cd /home/pi/.ssh
    cat /home/pi/id_rsa.pub >> authorized_keys

    # 修改文件权限
    chmod 600 authorized_keys

    最后修改ssh的配置文件:/etc/ssh/sshd_config,涉及到的选项有:

    1
    2
    3
    # 公钥登录许可
    PubkeyAuthentication yes

  • 公钥登录

    修改完ssh服务的配置文件后,重启ssh服务,接着本地PC通过公钥登录服务器

    1
    2
    3
    4
    5
    # 重启ssh服务 方式1
    systemctl restart ssh

    # # 重启ssh服务 方式2
    service ssh restart

本地PC通过ssh client公钥认证登录:ssh pi@raspberrypi,此时会直接登录,无需密码。

登录成功提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
eiSouthBoy@eiSouthBoy-NMH-WCX9:~$ ssh  pi@raspberrypi
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-1009-raspi aarch64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

*** System restart required ***
Last login: Thu Aug 22 11:10:19 2024 from fdfc:869c:9ebb:0:2803:5d58:2f66:5d78

管理多个Git仓库

同时拥有Github和Gitee两个账户下的仓库需要管理,如何通过ssh管理?

在PC上分别为Gihub和Gitee创建ssh key,然后编写ssh config文件

1
2
3
4
5
6
# 为Github创建ssh key
pi@raspberrypi:~$ ssh-keygen -t rsa -C "caoj97141@gmail.com" -f ~/.ssh/id_rsa-github

# 为Gitee创建ssh key
pi@raspberrypi:~$ ssh-keygen -t rsa -C "caoj97141@gmail.com" -f ~/.ssh/id_rsa-gitee

编写ssh config文件(vim ~/.ssh/config),若没有该文件就创建它(touch ~/.ssh/config)。

1
2
3
4
5
6
7
8
9
10
11
12
Host github.com
HostName github.com
User yourname@gmail.com
IdentityFile ~/.ssh/id_rsa-github
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
Host gitee.com
HostName gitee.com
User yourname@163.com
IdentityFile ~/.ssh/id_rsa-gitee
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null