Openssh

首先安装Openssh

用户名密码方式连接

默认配置文件的路径为 /etc/ssh/sshd_config,可更改是否禁用以密码方式登录、是否显示欢迎信息等…

1
2
# ssh -p 端口号 用户名@主机名或者IP
ssh -p 22 user@hostname_or_ip

设置新密码

1
passwd      #此方式与更改linux当前登录用户密码是一样的,由于ssh连接主机一般使用主机用户名&密码

通过公私钥方式连接

腾讯云需要额外特殊配置

阿里云正常配置

技巧:拿私钥的一般是连接方,拿公钥的一般是被连接方

参考:

腾讯云:使用 SSH 登录 Linux 实例

phoenixnap:How to Fix SSH Failed Permission Denied (publickey,gssapi-keyex,gssapi-with-mic)

配置/etc/ssh/sshd_config(非root 命令前加sudo)

1
2
3
4
5
6
7
8
PermitRootLogin yes		#开启密钥验证
PubkeyAuthentication yes # 开启密钥验证
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件位置
PasswordAuthentication no # 密钥验证可选关闭密码验证方式
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes

配置完成执行

1
sudo systemctl restart sshd

用户端/服务器端生成密钥对

1
2
3
4
5
6
7
8
9
ssh-keygen      #生成后连接时的默认密钥对

ssh-keygen -f .ssh/centos #指定文件路径名称名称,会生成centos(私) centos.pub(公)

ls ~/.ssh #生成后一般有3个文件
id_rsa id_rsa.pub known_hosts
# id_rsa,私钥(一般不外传)
# id_rsa.pub,公钥
# known_hosts,本机(连接方)已经连接过的主机记录,可进行删除来解决一部分问题

复制公钥到服务器

由于复制的公钥,只能决定被连接方,黑客截取到公钥也没什么用,除非他喜欢定义自己的服务器为被连接方给你玩。

复制公钥到服务器的authorized_keys文件/删除某个客户端的公钥都是立即生效的。

1
2
3
4
5
6
7
8
9
# 一定先要在客户端生成id_rsa.pub,再将其拷贝到被连接方
# 此处是被连接端

ls ~/.ssh
id_rsa.pub authorized_keys id_rsa id_rsa.pub known_hosts #id_rsa.pub是拷贝过来的

cat id_rsa.pub >> authorized_keys # 公钥写入 ~/.ssh/authorized_keys 文件的作用是允许指定的私钥对应的公钥进行 SSH 密钥验证

chmod 600 authorized_keys # 如果是腾讯云请执行

指定私钥连接

1
2
3
4
5

 ~/ls
id_rsa id_rsa.pub centos centos.pub #若此处的id_rsa_centOS.pub内容已经复制到服务器 authorized_keys
 ~/ ~/ ssh root@fuding.qicp.vip -p 22 -i .ssh/centos #回车即可连接成功

默认私钥连接

1
2
 ~/ ~/ ssh root@fuding.qicp.vip -p 22		#回车即可连接成功(默认会选择id_rsa)

ssh-agent

SSH代理是一个用于管理SSH密钥的程序。它可以在用户登录时启动,并在用户会话期间持续运行。当用户需要使用SSH密钥进行身份验证时,代理会提供密钥,免去了每次都需要输入密码的麻烦。

设置环境变量

执行以下命令可输出

1
2
3
$ ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-ZXjlJaw2fUZe/agent.28975; export SSH_AUTH_SOCK;
SSH_AGENT_PID=28976; export SSH_AGENT_PID;

执行以下命令后,相关的环境变量(如SSH_AUTH_SOCKSSH_AGENT_PID)将被设置到当前shell会话中

1
eval $(ssh-agent -s)

生成ssh密钥对

可以使用ssh-keygen命令生成SSH密钥对,该命令将生成一个公钥文件(通常是id_rsa.pub)和一个私钥文件(通常是id_rsa)。公钥文件是你需要将其添加到目标服务器上的文件。

添加公钥后的主机为目标主机(服务端),生成密钥对机器是客户端。

添加私钥到SSH代理

可以添加多个私钥绑定同一个环境变量中,当连接某个目标主机时,ssh-agent会使用递归的方式加载私钥尝试连接目标主机,直到连接成功。

1
2
# 使用`ssh-add`命令时,它会尝试加载默认的私钥文件`~/.ssh/id_rsa`到ssh-agent
ssh-add

以下是ssh-add命令的一些常用用法:

  1. 加载默认私钥文件:

    1
    2
    3
    # 执行示例
    $ ssh-add
    Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
  2. 加载指定路径的私钥文件:

    1
    ssh-add /path/to/private_key
  3. 列出当前已加载到SSH代理的私钥:

    1
    2
    3
    # 执行示例
    $ ssh-add -l
    2048 SHA256:GmzywdSI/RZA5lqnrdtuqFlkZF02sYwOyuyNiAegHaA /root/.ssh/id_rsa (RSA)
  4. 从SSH代理中删除指定私钥:

    1
    ssh-add -d /path/to/private_key
  5. 从SSH代理中删除所有私钥:

    1
    ssh-add -D

SSH安全协议传输文件

SSH 不仅仅可以远程连接服务器,同样也可以使用SSH自带的scp命令进行文件上传(本地文件/文件夹)

参考:

知乎:SCP命令如何使用密钥传输

scp文件/目录上传操作

上传文件:

1
2
# scp 本地文件路径 远程主机用户名@远程主机名或IP:远程文件保存的位置路径
scp local_file remote_username@remote_ip:remote_folder
  • 加上 -i 可以指定秘钥文件进行上传

上传目录:

1
2
# scp -r 本地文件夹路径 远程主机用户名@远程主机名或IP:远程文件夹保存的位置路径
scp -r local_folder remote_username@remote_ip:remote_folder

例:

1
2
3
# 必须加-r才能复制目录里的所有文件及目录
scp -r ./public/* root@ding.fu:/www/wwwroot/Hexo/

SFTP服务器

文件下载推荐访问OpenSSH自带的sftp服务器(一般情况服务器22端口开启默认就可以使用客户端命令进行连接)

ssh 连接通常是这样:

1
2
3
4
#用户名@主机名或IP
#-p 小写p指定端口号,一般情况22
$ ssh root@immor.com -p 22

sftp 用法也一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#大写p指定端口号且不能写在主机之后
$ sftp -P 22 root@immor.com
#回车后一般情况下会请求输入密码
#如果以前有使用SRA公钥/私钥加密方式连接就会直接进入

sftp> #登录成功显示,默认登录进去任何主机都位于`~`之下
sftp> help
Available commands:

put [-afpR] local [remote] Upload file #上传本地的文件或整个目录 文件夹必须加-R/-r
get [-afpR] remote [local] Download file #得到远程目录的文件或整个目录 文件夹必须加-R/-r


bye Quit sftp #退出sftp
cd path Change remote directory to 'path' #改变目录
chmod [-h] mode path Change permissions of file 'path' to 'mode' #改变远程目录文件权限
exit Quit sftp #退出sftp
help Display this help text #打印帮助信息
lcd path Change local directory to 'path' #改变本地目录
lls [ls-options [path]] Display local directory listing #列出本地目录
lmkdir path Create local directory #创建本地目录
ln [-s] oldpath newpath Link remote file (-s for symlink) #为远程文件创建软链
lpwd Print local working directory #打印本地所处目录
ls [-1afhlnrSt] [path] Display remote directory listing #显示远程目录内容
mkdir path Create remote directory #创建远程目录
pwd Display remote working directory #显示远程主机所处路径
quit Quit sftp #退出sftp
reget [-fpR] remote [local] Resume download file #续传下载所需文件
rename oldpath newpath Rename remote file #重命名远程文件
reput [-fpR] local [remote] Resume upload file #续上传本地文件
rm path Delete remote file #删除远程文件
rmdir path Remove remote directory #删除远程目录
symlink oldpath newpath Symlink remote file #创建远程文件符号链接
version Show SFTP version #显示SFTP服务器版本
!command Execute 'command' in local shell #执行linux命令在本地主机
! Escape to local shell #退出
? Synonym for help #和help作用一致


通过配置本地私钥进行连接配置远程公钥的服务器:

1
2
sftp -i .ssh/id_rsa_centos -P 222 root@fuding.qicp.vip		#此处的用户名和主机一定要放到最后,不然会报错
sftp -oIdentityFile=.ssh/id_rsa_centos -oPort=222 root@fuding.qicp.vip #这个也是一样的

疑难

ssh易断开问题解决

一个互联网上的机器连接服务器非常容易断开,于是有以下两种方式来解决这个问题,当然也可以两个方式都用上。

  1. 在Linux客户端上修改文件/etc/ssh/ssh_config,添加如下内容:
1
2
3
# 添加
ServerAliveInterval 3 #每隔3秒客户端给服务器发送一次心跳
ServerAliveCountMax 9 #如果服务器没有回复超过9次,主动断开
  1. 在Linux服务器上修改文件/etc/ssh/sshd_config
1
2
3
# 添加
ClientAliveInterval 3 #与上面一样的作用
ClientAliveCountMax 15

最后一定要重启配置过的机器的sshd

1
systemctl restart sshd 

Too many authentication failures

如果你确定不是因为你输入了太多次错误密码,那么产生这个问题的一个可能原因是:
在发起连接的机器(记为A)的 ~/.ssh 目录下放了太多密钥文件,当你连接一台新的服务器并且没有在 ~/.ssh/config 文件中做过特殊的配置时,默认会挨个尝试所有密钥文件,而这些密钥文件,都不是适配那台新服务器的,所以会连接失败。

参考:编码无悔:ssh连接Linux服务器时提示”Too many authentication failures”的解决办法

  • 仍然要使用 用户名+密码 的方式登录目标服务器,加“PubkeyAuthentication=no”参数来指定不使用密钥文件

    1
    ssh -o PubkeyAuthentication=no root@192.168.15.16
  • 禁止密码登陆,使用密钥对