0%

SSH使用指南

SSH服务器的安装配置请参阅SSH服务器,这篇文章是ssh主要应用的经验和总结。

目前openssh是Linux界主流的开源ssh软件,它包含了服务器端程序sshd和客户端程序ssh, scp等。

1
# pacman -S openssh

用密码方式远程登录

使用ssh远程登录时服务器地址可以使用其域名或IP,一般命令格式如下:

1
ssh 用户名@服务器地址

如果本机用户名和远程主机相同,可简化为:

1
ssh 服务器地址

如果远程主机的ssh端口号不是默认的22时,请使用:

1
ssh 服务器地址 -p ssh端口号

如果你是第一次登录该主机,系统会出现下面的提示:

1
2
3
The authenticity of host 'haoohaoo.com (74.207.248.33)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxx...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

确认信息后,输入yes,该服务器的指纹信息将被写入~/.ssh/known_hosts,并在终端显示类似信息:

1
2
Warning: Permanently added 'haoohaoo.com,74.207.248.33' (ECDSA) to the list of known hosts.
Password:

如果远程主机允许密码认证,且你输入了正确的密码后就可以看到欢迎信息和命令提示符了。

1
2
3
4
5
6
7
8
    __                      __
/ /_ ____ _____ ____ / /_ ____ _____ ____ _________ ____ ___
/ __ \/ __ `/ __ \/ __ \/ __ \/ __ `/ __ \/ __ \ / ___/ __ \/ __ `__ \
/ / / / /_/ / /_/ / /_/ / / / / /_/ / /_/ / /_/ // /__/ /_/ / / / / / /
/_/ /_/\__,_/\____/\____/_/ /_/\__,_/\____/\____(_)___/\____/_/ /_/ /_/

Last login: Wed Nov 13 10:31:23 2019 from 222.94.89.6
[root@haoohaoo ~]$

用密码方式远程登录

为了服务器的安全,建议禁用密码认证方式而使用密钥认证方式进行远程登录,而且这样登录还可以免于输入密码。注意,要在确认公钥安装好后才能关闭密码认证模式。

生成ssh访问密钥

ssh的密钥分为公钥和私钥,公钥放在远程主机上,私钥留在本地,这样就可以通过这一对密钥进行ssh登录或通信了。

密钥的生成算法默认为RSA,其它还支持:DSA, ECDSA, ED25519。执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ ssh-keygen
# 然后一路回车...
Generating public/private rsa key pair.
Enter file in which to save the key (/home/用户名/.ssh/id_rsa):
Created directory '/home/用户名/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/用户名/.ssh/id_rsa.
Your public key has been saved in /home/用户名/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:LgjlSGRmc/ds5CpGpVT0j+ea5iCjcKBS5ia0KdHH5xo 用户名@服务器地址
The key's randomart image is:
+---[RSA 3072]----+
| * oo= . |
| = + + * |
| . + * |
| o * o o |
|o.* * o S o |
|o*o+ = . o |
|*o+ E + . . |
|o= . = o.o |
| . . o+ |
+----[SHA256]-----+

将生成如下的密钥文件:

1
2
3
~/.ssh/
├── id_rsa # 这是私钥
└── id_rsa.pub # 这是公钥

安装ssh访问密钥

安装ssh访问密钥是指将本地生成的公钥文件内容发送到远程主机上用户家目录中的指定文件(默认是~/.ssh/authorized_keys)中。

可以手工把本地公钥文件(如~/.ssh/id_rsa.pub)中的内容复制粘贴过去,也可以使用ssh-copy-id命令。

安装ssh访问密钥
1
2
3
4
5
6
7
8
9
10
$ ssh-copy-id 用户名@服务器地址
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/用户名/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
用户名@服务器地址's password: ************

Number of key(s) added: 1

Now try logging into the machine, with: "ssh '用户名@服务器地址'"
and check to make sure that only the key(s) you wanted were added.

输入密码,ssh-copy-id会默认将~/.ssh/id_rsa.pub安装到远程主机上。此时,不需要密码就可以用ssh 用户名@服务器地址直接登录远程主机了。

改用ED25519算法生成的密钥

据说4096位的RSA密钥才够安全 ssh-keygen -q -a 100 -N "" -t rsa -b 4096 -f ~/.ssh/id_rsa

又据说ED25519算法生成的密钥比RSA生成的要短小且更安全。下面用稍复杂的命令来让生成一个更加安全的密钥:

用ED25519算法生成密钥
1
2
3
4
5
6
7
$ ssh-keygen -qa 100 -N "" -t ed25519 -f ~/.ssh/id_ed25519 -C user@host
$ tree ~/.ssh
/home/user/.ssh
├── id_ed25519
├── id_ed25519.pub
├── id_rsa
└── id_rsa.pub

参数说明:-q表示不显示过程信息,-a 100表示加密100次,-N ""参数表示不使用密语保护这个密钥, -t参数指定密钥生成算法,-C user@host指定生成的公钥中的备注信息(一般用于表示是谁生成了该密钥),-f参数指定密钥生成的路径。而后,可以使用更完整版的ssh-copy-id命令:$ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host将这个ed25519版的密钥安装到指定的远程主机上。

有了密钥文件的加持,使ssh访问变得更安全和高效!

远程执行命令

有时我们不需要登录远程主机,而只是希望运行一下远程主机上的命令。可以在本地使用ssh user@host 要执行的命令。比如,一个命令远程重启:

远程重启
1
$ ssh user@host sudo reboot

远程文件传送

将文件发送到远程主机,我们可以:

将文件发送到远程主机
1
$ scp -r path1/ path2/ path3/file1 user@host:~/Documents/

scp命令就会将本地的两个路径path1,path2和一个文件file1复制到远程主机的/home/user/Documents/路径中,其中 -r参数可以递归地复制文件,用于传送整个路径。

同理,将远程主机上的文件复制到本地,可以:

将远程主机上的文件复制到本地
1
$ scp user@host:~/Documents/file2 ~/Desktop/

ssh命令的其它参数

  • -C, 要求对ssh通信数据进行压缩,条件是服务器配置中允许通信信息压缩,且有理有弊,因为加重了CPU开销。
  • -i identity_file,指定私钥文件。
  • -l login_name,指定用户名。
  • -p port,指定访问的ssh端口。
  • -q,安静模式,关闭大多数警告等信息的显示。
  • -t,伪终端模式,比如远程执行诸如top这样的基于screen的程序。

ssh客户端配置文件

善用ssh客户端配置文件,会使ssh的操作更加得心应手。

系统全局配置文件/etc/ssh/ssh_config,用户配置文件$HOME/.ssh/config,一般使用用户配置文件即可,举例如下:

.ssh/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Host haoohaoo
HostName haoohaoo.com
Port 51022
User root
IdentityFile ~/.ssh/id_ed25519

Host virtualbox
HostName 192.168.1.200
LogLevel QUIET
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

Host *
Compression yes
ServerAliveInterval 15
ServerAliveCountMax 10

注,对于任何ssh访问,均采用压缩数据传送,且每15秒最多尝试10次,客户端主动相服务器请求消息,可以在网络不佳的情形下减少broken pipeline问题的发生。这样设置好后,使用ssh访问服务器就更加方便了。可以想象一下完整的ssh访问haoohaoo.com的命令:

1
$ ssh -p 51022 -i ~/.ssh/id_ed25519 -l root -C haoohaoo.com

现在只需要ssh haoohaoo就行了!

另,建议设置一下~/.ssh的权限增加安全性:

1
2
$ chmod 0700 ~/.ssh
$ chmod 0600 ~/.ssh/*