- SSH 服务的原理与实验场景
- 2 SSH客户端(Linux)使用
- 3 Linux环境下sftp客户端的使用
- 4 使用sshpass命令
- 5 配置SSH服务器的公钥身份认证
- 生成客户端的公私密钥对,可以用-t指定加密算法,用-f指定密钥文件存放地和文件名。
#默认情况下,为用户创建的公私密钥对存放在~用户名/.ssh目录中。
2 将创建好的客户端公钥传送到SSH服务器
将创建好的客户端公钥传送到SSH服务器上,并保存到登录用户的家目录下的.ssh子目录中,并以特定的文件名保存(authorized_keys)。
方法一:
(1)使用scp命令将上一步中创建的客户端公钥上传服务器的”~登录用户/.ssh”
[root@177 ~]# scp /root/.ssh/id_rsa.pub root@192.168.179.11:/root/.ssh
(2)使用密码登录SSH服务器
[root@177 ~]# ssh root@192.168.179.11
root@192.168.179.11’s password:
Last login: Thu May 23 14:36:23 2019 from 192.168.94.177
在服务器上将复制过来的客户端公钥文件导入到~登录用户/.ssh/authorized_keys文件中。
[root@179-11 .ssh]# cat id_rsa.pub >> authorized_keys
方法二: - 使用ssh-copy-id脚本程序将客户端公钥上传并导入登录用户的家目录下的.ssh子目录下的authorized_keys文件中。
3 在客户端使用ssh客户端进行基于公钥的登录连接
[root@177 .ssh]# ssh root@192.168.179.11 - 6 SSHD服务器端配置文件
SSH 服务的原理与实验场景
SSH服务的原理 略
说明:
(1)Client和Serve之间的网络是畅通的
(2)Sever开放22端口,允许Clinet进行SSH连接
(3)用户掌握了Server上的登录账号(root)
2 SSH客户端(Linux)使用
1.查看ssh客户端的版本
[root@dbserver ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
2.使用ssh客户端连接远程SSH服务器
[root@dbserver ~]# ssh root@192.168.237.201
#root@192.168.237.201,表示使用root账户登录192.168.237.201
The authenticity of host '192.168.237.201 (192.168.237.201)' can't be established.
ECDSA key fingerprint is SHA256:aeQmT5o+YDTiRMbie+ggf5+ks9ID0mBni42KvabPHL4.
ECDSA key fingerprint is MD5:31:80:f4:ec:b2:9e:77:29:d2:91:6a:a8:ac:0f:d4:db.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.237.201' (ECDSA) to the list of known hosts.
root@192.168.237.201's password:
Last login: Tue May 24 11:10:26 2022 from 192.168.237.1
[root@webserver ~]#
[root@webserver ~]# exit
登出
Connection to 192.168.237.201 closed.
#exit命令用于推出登录,返回当前主机
也可以使用如下形式
[root@dbserver ~]# ssh 192.168.237.201 -l student -p 22
#-l 指定登录的用户名,-p 指定端口号
student@192.168.237.201's password:
Last login: Tue May 24 11:44:32 2022 from 192.168.237.202
[student@webserver ~]$
也可以使用如下形式
[root@dbserver ~]# ssh root@192.168.179.231
ssh: connect to host 192.168.179.231 port 22: Network is unreachable
[root@dbserver ~]# ssh -t root@192.168.237.201 ssh root@192.168.179.231
root@192.168.237.201's password:
root@192.168.179.231's password:
Last login: Tue May 24 11:47:33 2022 from 192.168.87.100
[root@myhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:50:56:a0:0a:5d brd ff:ff:ff:ff:ff:ff
inet 192.168.179.231/24 brd 192.168.179.255 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea0:a5d/64 scope link
valid_lft forever preferred_lft forever
[root@myhost ~]#
3 使用ssh远程连接,在远程主机上直接执行命令
ssh 用户名@远程主机 ‘在远程主机上执行的命令行’
[root@client ~]# ssh root@192.168.237.202 'ls -l /root'
root@192.168.237.202's password:
Permission denied, please try again.
root@192.168.237.202's password:
总用量 4
-rw-------. 1 root root 1548 6月 8 2020 anaconda-ks.cfg
drwxr-xr-x. 2 root root 29 6月 8 2020 env3.6.10
drwxr-xr-x. 2 root root 29 6月 8 2020 env3.8.3
-rw-r--r--. 1 root root 0 5月 31 08:41 example
drwxr-xr-x. 2 root root 6 6月 8 2020 perl5
[root@client ~]# ssh root@192.168.237.202 'mkdir /root/test'
root@192.168.237.202's password:
3 Linux环境下sftp客户端的使用
3.1 使用sftp客户端命令连接到远程服务器(交互式连接)
sftp 用户名@远程主机 [ -p 端口号 ]
[root@client ~]# sftp -P 22 root@192.168.237.202
root@192.168.237.202's password:
Connected to 192.168.237.202.
sftp> help
Available commands:
bye Quit sftp
cd path Change remote directory to 'path'
chgrp grp path Change group of file 'path' to 'grp'
chmod mode path Change permissions of file 'path' to 'mode'
chown own path Change owner of file 'path' to 'own'
df [-hi] [path] Display statistics for current directory or
filesystem containing 'path'
exit Quit sftp
get [-afPpRr] remote [local] Download file
reget [-fPpRr] remote [local] Resume download file
reput [-fPpRr] [local] remote Resume upload file
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
lumask umask Set local umask to 'umask'
mkdir path Create remote directory
progress Toggle display of progress meter
put [-afPpRr] local [remote] Upload file
pwd Display remote working directory
quit Quit sftp
rename oldpath newpath Rename remote file
rm path Delete remote file
rmdir path Remove remote directory
symlink oldpath newpath Symlink remote file
version Show SFTP version
!command Execute 'command' in local shell
! Escape to local shell
? Synonym for help
sftp> exit
[root@177 ~]# sftp -P 22 root@192.168.179.11
root@192.168.179.11’s password:
Connected to 192.168.179.11.
sftp> pwd
Remote working directory: /root
[root@177 ~]# sftp root@192.168.179.11:/etc
#直接以root身份等录sftp服务器的/etc目录
[root@177 ~]# sftp root@192.168.179.11:/etc/selinux/config
#以root身份将sftp服务器上的/etc/selinux/config文件下载到本地当前目录中。
3.2 sftp常用的操作命令
(1)服务端操作命令
cd 转换目录
exit 退出登录
ls 查看目录
mkdir 新建目录
mv 移动文件
rm 删除文件
rmdir 删除目录
pwd 查看当前目录
chmod chgrp chown 修改文件权限和所有者
sftp> pwd
Remote working directory: /root
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
sftp> mkdir /tmp/test
sftp> ls -l /tmp/test
sftp> pwd
Remote working directory: /tmp
sftp> cd /tmp/test
sftp> pwd
Remote working directory: /tmp/test
(2)客户端操作命令
lcd 转换目录
lls 查看目录
lmkdir 新建目录
lrm 删除文件
sftp> lcd /etc
sftp> lpwd
Local working directory: /etc
sftp> lls
lpwd 查看客户端当前目录
(3)文件传输操作
get [-r] 从服务器端下载文件到客户端
put [-r] 从客户端上传文件到服务器端
[root@client ~]# sftp -P 22 root@192.168.237.202
#登录sftp服务器
root@192.168.237.202's password:
Connected to 192.168.237.202.
sftp> cd /tmp/test
#切换(服务器)远程工作目录
sftp> ls
#显示远程工作目录中的内容
Hello.txt
sftp> lcd /root
#切换(客户端)本地当前工作目录
sftp> pwd
#显示远程当前工作目录
Remote working directory: /tmp/test
sftp> lpwd
#显示本地当前工作目录
Local working directory: /root
sftp> get Hello.txt
#下载Hello.txt,从远程当前工作目录中下载到本地当前工作目录中
Fetching /tmp/test/Hello.txt to Hello.txt
/tmp/test/Hello.txt 100% 16 13.9KB/s 00:00
sftp> lls
#查看本地当前工作目录中的内容
anaconda-ks.cfg env3.6.10 env3.8.3 Hello.txt perl5
sftp> lcd /etc
sftp> lpwd
Local working directory: /etc
sftp> put fstab
#将fstab文件从本地当前工作目录上传到远程当前工作目录
Uploading fstab to /tmp/test/fstab
fstab 100% 541 962.7KB/s 00:00
sftp> ls
Hello.txt fstab
3.3 scp命令实现文件传送
scp [-r] 本地文件(目录) 用户名@远程主机:/路径
#使用scp实现文件(目录)上传
[root@177 code]# scp /root/code/test2.sh root@192.168.179.11:/tmp
root@192.168.179.11’s password:
test2.sh 100% 126 105.9KB/s 00:00
scp [-r] 用户名@远程主机:/路径/文件 本地文件(目录)
#使用scp实现文件(目录)下载
[root@177 code]# scp -r root@192.168.179.11:/tmp/test0521 /root/code
root@192.168.179.11’s password:
testCron.sh 100% 89 20.0KB/s 00:00
[root@177 code]# ls -ld /root/code/test0521/
drwxr-xr-x. 2 root root 25 5月 21 15:43 /root/code/test0521/
[root@177 code]# ls -ls /root/code/test0521/
总用量 4
4 -rwxr-xr-x. 1 root root 89 5月 21 15:43 testCron.sh
[root@client ~]# mkdir /source
[root@client ~]# echo "Hello,SCP" > /source
-bash: /source: 是一个目录
[root@client ~]# echo "Hello,SCP" > /source/example
[root@client ~]# cat /source/example
Hello,SCP
[root@client ~]# cd /source/
[root@client source]# ls
example
[root@client source]# scp /source/example root@192.168.237.202:/dist
#scp将本地/source/example文件上传到服务器192.168.237.201的/dist目录中
root@192.168.237.202's password:
example 100% 10 7.5KB/s 00:00
[root@client source]# scp root@192.168.237.202:/etc/gshadow /source
#scp将远程服务器上的gshadow文件,下载到本地目录中
root@192.168.237.202's password:
gshadow 100% 509 11.7KB/s 00:00
[root@client source]# ls
example gshadow
4 使用sshpass命令
sshpass是一个简单的轻量级的命令行工具。
使用sshpass可以在命令行将密码传递给ssh、sftp、scp命令。
但是,这个命令是不安全的,在脚本中使用sshpass更为可靠。
4.1 安装sshpass
[root@179-11 tmp]# rpm -qa | grep sshpass
[root@179-11 tmp]# yum -y install sshpass
#或者
[root@client ~]# rpm -ivh sshpass-1.06-2.el7.x86_64.rpm
4.2 使用sshpass免输入密码登录ssh
sshpass –p ‘密码’ ssh 用户名@远程主机 [‘远程主机上的命令’]
[root@client ~]# sshpass -p 'Abc@123!' ssh root@192.168.237.202
Last login: Tue May 31 08:41:13 2022 from 192.168.237.201
[root@client ~]# sshpass -p 'Abc@123!' scp /etc/passwd root@192.168.237.202:/dist
4.3 使用sshpass –e 将用户ssh登录密码写入环境变量SSHPASS中。
[root@client ~]# SSHPASS='Abc@123!'
[root@client ~]# export SSHPASS
[root@client ~]# echo $SSHPASS
Abc@123!
[root@client ~]# sshpass -e ssh root@192.168.237.202
Last login: Tue May 31 09:49:08 2022 from 192.168.237.201
4.4 使用sshpass –f 将用户密码从指定的文件中读取出来
[root@client ~]# touch SSHPASS
[root@client ~]# echo 'Abc@123!' > /root/SSHPASS
[root@client ~]# cat /root/SSHPASS
Abc@123!
[root@client ~]# chmod 600 /root/SSHPASS
[root@client ~]# sshpass -f /root/SSHPASS ssh root@192.168.237.202
Last login: Tue May 31 10:16:34 2022 from 192.168.237.201
5 配置SSH服务器的公钥身份认证
5.1 在Linux的SSH客户端上完成
1 在客户端创建客户端公钥和私钥
[root@client ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
#输入密钥对的存放位置,默认是:/root/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
#输入使用私钥解密时的口令,回车表示口令为空
Enter same passphrase again:
#确认口令
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:BylpSLisTw7vBzUdgpignN5OGFmCmjmJQZIRkiZUKx8 root@client
The key's randomart image is:
+---[RSA 2048]----+
|@@.=. |
|&.B.o... . |
|*% E.o+.o |
|O O +... . |
| = = . S . |
|o = . |
| * o |
| + . |
| ... |
+----[SHA256]-----+
[root@client .ssh]# cd /root/.ssh
[root@client .ssh]# ls -l
总用量 16
-rw-r--r--. 1 root root 824 10月 21 2020 authorized_keys
-rw-------. 1 root root 1679 5月 31 10:32 id_rsa
-rw-r--r--. 1 root root 393 5月 31 10:32 id_rsa.pub
-rw-r--r--. 1 root root 177 5月 31 08:40 known_hosts
生成客户端的公私密钥对,可以用-t指定加密算法,用-f指定密钥文件存放地和文件名。
#默认情况下,为用户创建的公私密钥对存放在~用户名/.ssh目录中。
2 将创建好的客户端公钥传送到SSH服务器
将创建好的客户端公钥传送到SSH服务器上,并保存到登录用户的家目录下的.ssh子目录中,并以特定的文件名保存(authorized_keys)。
方法一:
(1)使用scp命令将上一步中创建的客户端公钥上传服务器的”~登录用户/.ssh”
[root@177 ~]# scp /root/.ssh/id_rsa.pub root@192.168.179.11:/root/.ssh
(2)使用密码登录SSH服务器
[root@177 ~]# ssh root@192.168.179.11
root@192.168.179.11’s password:
Last login: Thu May 23 14:36:23 2019 from 192.168.94.177
在服务器上将复制过来的客户端公钥文件导入到~登录用户/.ssh/authorized_keys文件中。
[root@179-11 .ssh]# cat id_rsa.pub >> authorized_keys
方法二:
[root@client .ssh]# which ssh-copy-id
/usr/bin/ssh-copy-id
[root@client .ssh]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.237.202
#ssh-copy-id脚本用于创建ssh远程免密登录连接 -i选项用来指定客户端的公钥
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.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
root@192.168.237.202's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.237.202'"
and check to make sure that only the key(s) you wanted were added.
使用ssh-copy-id脚本程序将客户端公钥上传并导入登录用户的家目录下的.ssh子目录下的authorized_keys文件中。
3 在客户端使用ssh客户端进行基于公钥的登录连接
[root@177 .ssh]# ssh root@192.168.179.11
5.2 在Windows的SSH客户端(Bitvise SSH Client)上完成
1 创建客户端公私密钥对,并导出客户端公钥文件
打开客户端密钥管理器
创建客户端公私密钥对
导出客户端公钥文件
2 上传客户端公钥文件到SSH服务器~登录用户家目录/.ssh目录中
3. 在SSH服务器上,将上传到客户端公钥文件导入到服务器的~用户/.ssh/authorized_key文件中去。
[root@server ~]# cd /root/.ssh
[root@server .ssh]# ls
authorized_keys client.pub id_rsa.pub
[root@server .ssh]# cat client.pub >> authorized_keys
4.在客户端使用公钥验证登录。
6 SSHD服务器端配置文件
1 sshd服务的配置文件/etc/ssh/sshd_config
2 了解SSHD服务配置文件的常用配置选项
(1)Port 22
指定SSH服务的端口,默认为22,可以增加其他的端口,只需写多行Port指令即可。
(2)Protocol 2
指定SSH服务协议的版本,一般为2,如果需要支持旧的版本,可以写成Protocol 2,1
(3)ListenAddress 0.0.0.0
指定SSH 服务的监听地址,0.0.0.0表示监听本机所有地址。可以改成指定的IP地址。
(4)SSH服务器密钥存放文件(私钥)
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
(5)PermitRootLogin yes
是否允许root通过SSH进行登录,默认是允许,建议设置成no.
(6)PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
定义是否允许用户自行使用密钥对进行验证的登录
(7)PasswordAuthentication yes
定义是否允许使用密码登录
(8)PermitEmptyPassword yes
定义是否允许使用空密码
3 修改配置文件之后,记得重启服务或者重新加载配置文件。