ssh詳解–讓你徹底學(xué)會(huì)ssh
概念
SSH全稱secure shell,安全外殼協(xié)議(安全的shell),是一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議(默認(rèn)端口號(hào)為22)。通過(guò)ssh協(xié)議可以在客戶端安全(提供身份認(rèn)證、信息加密)的遠(yuǎn)程連接LInux服務(wù)器或其他設(shè)備。
使用廣泛的Xshell軟件就是基于SSH協(xié)議遠(yuǎn)程連接。
SSH遠(yuǎn)程連接之后能干什么?
SSH遠(yuǎn)程連接之后,就可以像操作本地的機(jī)器一樣操作遠(yuǎn)程機(jī)器。當(dāng)需要操控的機(jī)器不在本地時(shí)就可以使用ssh協(xié)議遠(yuǎn)程連接操控。
實(shí)現(xiàn)
OpenSSH
SSH協(xié)議有諸多的實(shí)現(xiàn)軟件,廣泛使用的SSH實(shí)現(xiàn)軟件是OpenSSH。OpenSSH是SSH協(xié)議的一種開(kāi)源實(shí)現(xiàn),現(xiàn)在已經(jīng)成為L(zhǎng)inux、Unix等操作系統(tǒng)的SSH協(xié)議默認(rèn)實(shí)現(xiàn)。
OpenSSH官網(wǎng):點(diǎn)這里
官網(wǎng)的介紹:
OpenSSH is the premier connectivity tool for remote login with the SSH protocol. It encrypts all traffic to eliminate eavesdropping, connection hijacking, and other attacks. In addition, OpenSSH provides a large suite of secure tunneling capabilities, several authentication methods, and sophisticated configuration options.
OpenSSH軟件分為兩個(gè)部分:client端和server端
OpenSSH 服務(wù)端主要提供遠(yuǎn)程登錄和文件傳輸?shù)裙δ?,可以被其他用戶或系統(tǒng)通過(guò) SSH 協(xié)議連接并訪問(wèn)。通過(guò) SSH 連接到 OpenSSH 服務(wù)端后,用戶可以在服務(wù)器上執(zhí)行命令、上傳或下載文件等操作。
OpenSSH 客戶端則是用來(lái)連接遠(yuǎn)程服務(wù)端的工具。用戶可以使用命令行或圖形界面工具來(lái)連接到 OpenSSH 服務(wù)端,并通過(guò) SSH 協(xié)議進(jìn)行通信。OpenSSH 客戶端可以通過(guò)用戶名和密碼、公鑰驗(yàn)證等方式進(jìn)行身份驗(yàn)證,一旦連接成功,用戶就可以在遠(yuǎn)程服務(wù)器上執(zhí)行命令、上傳或下載文件等操作。
使用OpenSSH控制遠(yuǎn)程機(jī)器,需要對(duì)方安裝了OpenSSH服務(wù)端。
安裝
OpenSSH基本不需要大家自己安裝,大部分的Linux發(fā)行版,比如Debian、Ubuntu、CentOS等都默認(rèn)安裝好OpenSSH,相當(dāng)于系統(tǒng)軟件,當(dāng)然如果因?yàn)槟承┰驔](méi)有安裝OpenSSH,也可以使用下面的命令安裝。
在 CentOS 或 Red Hat Enterprise Linux 中可以使用以下命令安裝:
sudo yum install openssh-clients openssh-server
在 Ubuntu 或 Debian 中可以使用以下命令安裝:
sudo apt install openssh-client openssh-server
查看安裝版本(可以驗(yàn)證是否安裝)
ssh -V
確認(rèn)SSH服務(wù)正在運(yùn)行
systemctl status sshd
使用
確認(rèn)安裝好OpenSSH之后,就可以使用ssh
遠(yuǎn)程控制其他機(jī)器了,當(dāng)然被控制的機(jī)器也需要安裝OpenSSH。在Linux中使用OpenSSH與其他軟件相同都是通過(guò)命令的形式使用,其中進(jìn)行連接的命令為ssh
。
OpenSSH客戶端連接服務(wù)端時(shí)需要進(jìn)行身份認(rèn)證,常用的認(rèn)證方式有兩種:密碼認(rèn)證和密鑰認(rèn)證。這里將用密碼認(rèn)證的方式進(jìn)行基本的使用。
ssh
命令進(jìn)行遠(yuǎn)程連接有三種命令格式:
ssh 用戶名@hostname
ssh -l [用戶名] hostname
ssh hostname
加深對(duì)ssh的理解:使用Linux操作系統(tǒng)的時(shí)候,開(kāi)機(jī)完成之后的第一件事就是登錄用戶,輸入用戶名然后輸入密碼,這個(gè)用戶是Linux中已經(jīng)創(chuàng)建的,然后密碼存儲(chǔ)在/etc/shadow中,這是本地登錄的時(shí)候的過(guò)程。
而SSH遠(yuǎn)程登錄也是差不多的,只是從本地?fù)Q成遠(yuǎn)程。在前兩個(gè)命令中,都可以傳入用戶名,這個(gè)用戶名要求遠(yuǎn)程機(jī)器中已經(jīng)創(chuàng)建,命令本質(zhì)就是使用這個(gè)用戶名去登錄遠(yuǎn)程機(jī)器,然后第三個(gè)命令形式?jīng)]有用戶名,它默認(rèn)使用的是你當(dāng)前本地機(jī)器登錄的用戶名去登錄遠(yuǎn)程機(jī)器(第二個(gè)命令不指定效果相同),比如你當(dāng)前本地機(jī)器是root用戶,使用第三個(gè)命令去遠(yuǎn)程連接,則會(huì)使用root用戶去登錄。hostname一般為遠(yuǎn)程機(jī)器的IP地址,也可使用主機(jī)域名。
連接完成之后就可以遠(yuǎn)程控制主機(jī)。
示例:使用ssh 用戶名@hostname
的形式連接遠(yuǎn)程機(jī)器。
host1模擬本地機(jī)器,IP地址:192.168.94.142
;host2模擬遠(yuǎn)程服務(wù)器,IP地址:192.168.94.143
,連接成功之后會(huì)發(fā)現(xiàn)第一提示符已經(jīng)變?yōu)閔ost2,這時(shí)就可以遠(yuǎn)程操縱host2了。連接過(guò)程截圖如下所示:
- ssh命令運(yùn)行過(guò)程:
- 當(dāng)?shù)谝淮芜B接時(shí)會(huì)提醒
The autheticity of host '192.168.94.143' can't be establised
,這是由于第一次連接,~/.ssh
下的konwn_hosts文件無(wú)相關(guān)的主機(jī)信息(甚至這個(gè)文件都沒(méi)有),無(wú)法信任對(duì)方主機(jī),所以后續(xù)還會(huì)詢問(wèn)你是否進(jìn)行連接,需要輸入yes - 當(dāng)輸入yes之后,就會(huì)將該主機(jī)的信息放入known_hosts文件中(沒(méi)有文件會(huì)自動(dòng)生成),然后提示輸入密碼。
- 當(dāng)?shù)谝淮芜B接時(shí)會(huì)提醒
~/.ssh文件路徑
~/.ssh
是存放SSH客戶端相關(guān)配置和密鑰文件的目錄,但是第一次使用ssh的時(shí)候這個(gè)目錄一般是空的,上述的konwn_hosts只有使用了ssh之后才會(huì)自動(dòng)創(chuàng)建,然后其他主機(jī)發(fā)送公鑰至本機(jī)之后,本機(jī)會(huì)生成authorized_keys
文件用于存放相關(guān)的主機(jī)和密鑰信息。如果想要對(duì)客戶端的配置進(jìn)行修改,也可以在該目錄下創(chuàng)建config文件。
進(jìn)階
如果你只是想在本地控制遠(yuǎn)程機(jī)器,上述的ssh
命令已經(jīng)能夠滿足你,但是關(guān)于ssh
還有很多拓展。
配置文件
一般我們想要更深刻的了解Linux的軟件,基本都是從它的配置文件入手。
OpenSSH分為服務(wù)端和客戶端,它的配置文件也有兩個(gè),sshd_config(server配置文件)和ssh_config(client配置文件)。
- 會(huì)發(fā)現(xiàn)一般Linux系統(tǒng)一些軟件進(jìn)程是name加一個(gè)d,這個(gè)d的含義是守護(hù)進(jìn)程(daemon)。
ssh_config
ssh_config是OpenSSH客戶端的配置文件,這是一個(gè)全局的配置文件,文件內(nèi)容大多為遠(yuǎn)程連接時(shí)使用的參數(shù),文件的路徑/etc/ssh/ssh_config
。雖然這個(gè)文件是客戶端的全局配置文件,但是一般不會(huì)對(duì)這個(gè)配置文件進(jìn)行修改。在配置文件中可以查看到下列內(nèi)容。
由上圖可知:ssh客戶端的全局配置文件的優(yōu)先級(jí)是最低的,優(yōu)先級(jí)最高是使用命令時(shí)指定的參數(shù),其次為單個(gè)用戶的配置文件(路徑設(shè)置~/.ssh/config
,這個(gè)文件默認(rèn)不存在,需要用戶進(jìn)行創(chuàng)建)。
基于以上的規(guī)則,修改的客戶端全局配置文件并不是一個(gè)很好的選擇,當(dāng)需要對(duì)某一參數(shù)進(jìn)行改變時(shí),直接在使用ssh
命令連接時(shí)指定相對(duì)應(yīng)的參數(shù)更加方便靈活。
sshd_config
sshd_config是OpenSSH服務(wù)端的配置文件,路徑etc/ssh/sshd_config
,該文件包括服務(wù)端的安全配置等。ssh服務(wù)器的連接配置都由這個(gè)文件決定,包括SSH協(xié)議連接端口號(hào)等。
常規(guī)sshd_config文件內(nèi)容:
1 # $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
2
3 # This is the sshd server system-wide configuration file. See
4 # sshd_config(5) for more information.
5
6 # This sshd was compiled with PATH=/usr/local/bin:/usr/bin
7
8 # The strategy used for options in the default sshd_config shipped with
9 # OpenSSH is to specify options with their default value where
10 # possible, but leave them commented. Uncommented options override the
11 # default value.
12
13 # If you want to change the port on a SELinux system, you have to tell
14 # SELinux about this change.
15 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
16 #
17 #Port 22
18 #AddressFamily any
19 #ListenAddress 0.0.0.0
20 #ListenAddress ::
21
22 HostKey /etc/ssh/ssh_host_rsa_key
23 #HostKey /etc/ssh/ssh_host_dsa_key
24 HostKey /etc/ssh/ssh_host_ecdsa_key
25 HostKey /etc/ssh/ssh_host_ed25519_key
26
27 # Ciphers and keying
28 #RekeyLimit default none
29
30 # Logging
31 #SyslogFacility AUTH
32
33 #LogLevel INFO
34
35 # Authentication:
36
37 #LoginGraceTime 2m
38 #PermitRootLogin yes
39 #StrictModes yes
40 #MaxAuthTries 6
41 #MaxSessions 10
42
43 #PubkeyAuthentication yes
44
45 # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
46 # but this is overridden so installations will only check .ssh/authorized_keys
47 AuthorizedKeysFile .ssh/authorized_keys
48
49 #AuthorizedPrincipalsFile none
50
51 #AuthorizedKeysCommand none
52 #AuthorizedKeysCommandUser nobody
53
54 # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
55 #HostbasedAuthentication no
56 # Change to yes if you don't trust ~/.ssh/known_hosts for
57 # HostbasedAuthentication
58 #IgnoreUserKnownHosts no
59 # Don't read the user's ~/.rhosts and ~/.shosts files
60 #IgnoreRhosts yes
61
62 # To disable tunneled clear text passwords, change to no here!
63 #PermitEmptyPasswords no
64
65
66 # Change to no to disable s/key passwords
67 #ChallengeResponseAuthentication yes
68 ChallengeResponseAuthentication no
69
70 # Kerberos options
71 #KerberosAuthentication no
72 #KerberosOrLocalPasswd yes
73 #KerberosTicketCleanup yes
74 #KerberosGetAFSToken no
75 #KerberosUseKuserok yes
76
77 # GSSAPI options
78 GSSAPIAuthentication yes
79 GSSAPICleanupCredentials no
80 #GSSAPIStrictAcceptorCheck yes
81 #GSSAPIKeyExchange no
82 #GSSAPIEnablek5users no
83
84 # Set this to 'yes' to enable PAM authentication, account processing,
85 # and session processing. If this is enabled, PAM authentication will
86 # be allowed through the ChallengeResponseAuthentication and
87 # PAM authentication via ChallengeResponseAuthentication may bypass
88 # the setting of "PermitRootLogin without-password".
89 # If you just want the PAM account and session checks to run without
90 # and ChallengeResponseAuthentication to 'no'.
91 # WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
92 # problems.
93 UsePAM yes
94
95 #AllowAgentForwarding yes
96 #AllowTcpForwarding yes
97 #GatewayPorts no
98 X11Forwarding yes
99 #X11DisplayOffset 10
100 #X11UseLocalhost yes
101 #PermitTTY yes
102 #PrintMotd yes
103 #PrintLastLog yes
104 #TCPKeepAlive yes
105 #UseLogin no
106 #UsePrivilegeSeparation sandbox
107 #PermitUserEnvironment no
108 #Compression delayed
109 #ClientAliveInterval 0
110 #ClientAliveCountMax 3
111 #ShowPatchLevel no
112 #UseDNS yes
113 #PidFile /var/run/sshd.pid
114 #MaxStartups 10:30:100
115 #PermitTunnel no
116 #ChrootDirectory none
117 #VersionAddendum none
118
119 # no default banner path
120 #Banner none
121
122 # Accept locale-related environment variables
123 AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
124 AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
125 AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
126 AcceptEnv XMODIFIERS
127
128 # override default of no subsystems
129 Subsystem sftp /usr/libexec/openssh/sftp-server
130
131 # Example of overriding settings on a per-user basis
132 #Match User anoncvs
133 # X11Forwarding no
134 # AllowTcpForwarding no
135 # PermitTTY no
136 # ForceCommand cvs server
137
138 UseDNS no
139 AddressFamily inet
140 SyslogFacility AUTHPRIV
141 PermitRootLogin yes
142 PasswordAuthentication yes
-
修改端口號(hào),修改17行內(nèi)容,取消注釋,將22改成其他值,然后重啟刷新服務(wù)(守護(hù)進(jìn)程都需要重新啟動(dòng)服務(wù)才能使用新的配置),這時(shí)默認(rèn)端口號(hào)將會(huì)改成其他值。
例:將端口號(hào)改為23后,如何使用ssh
命令連接。
這個(gè)時(shí)候連接該機(jī)器則需要使用23號(hào)端口,不然會(huì)連接不上,使用ssh
命令指定相應(yīng)的23端口如下所示,三種格式都是可以使用-p參數(shù)的。# 使用-p參數(shù)指定接口 ssh 用戶名@hostname -p 23
-
19行和20行,ListenAddress,指定SSH監(jiān)聽(tīng)的IP地址,19行是ipv4地址,20行是ipv6地址,通過(guò)更改設(shè)置,可以指定哪些IP地址的機(jī)器通過(guò)SSH連接本機(jī)(0.0.0.0和::代表監(jiān)聽(tīng)所有IP地址)。
-
31行,
#SyslogFacility AUTH
這個(gè)是日志相關(guān)的配置,指定記錄日志facility,與日志記錄相關(guān),在日志學(xué)習(xí)中可以學(xué)到。 -
38行,
#PermitRootLogin yes
設(shè)置是否允許使用root用戶進(jìn)行遠(yuǎn)程登錄。默認(rèn)為yes表示允許,去掉注釋改為no則不再允許使用root用戶遠(yuǎn)程登錄。 -
43行,
#PubkeyAuthentication yes
設(shè)置是否允許使用密鑰認(rèn)證,上文提到ssh有兩種認(rèn)證方式:密碼認(rèn)證和密鑰認(rèn)證。設(shè)置為no禁止使用密鑰認(rèn)證。 -
142行,
#PasswordAuthentication yes
設(shè)置是否允許使用密碼認(rèn)證,設(shè)置為no則禁止密碼認(rèn)證。 -
123行,
#Banner none
設(shè)置歡迎橫幅,就是遠(yuǎn)程登錄之后,出現(xiàn)的文字。
其他基本不用的配置:
- 23行,
HostKey
指定ssh主機(jī)密鑰路徑,每個(gè)加密方法一個(gè)加密路徑。 - 69行,
ChallengeResponseAuthentication no
設(shè)置挑戰(zhàn)-響應(yīng)式身份認(rèn)證 - 93行,
UsePAM yes
設(shè)置使用PAM認(rèn)證(可以理解為一個(gè)認(rèn)證機(jī)制,密碼認(rèn)證是PAM的認(rèn)證模塊之一)
- 可能每臺(tái)機(jī)器配置文件的行數(shù)會(huì)不相同,這里的行數(shù)只是上面示例配置文件的行數(shù)
? 以上是常見(jiàn)的關(guān)于sshd的配置。那么修改這些配置的原因是什么?直接使用默認(rèn)配置就已經(jīng)能夠正常使用ssh協(xié)議,修改配置的意義涉及另一個(gè)方面:安全。
? 每臺(tái)Linux系統(tǒng)的ssh默認(rèn)配置是相同的,這樣所有人都知道ssh協(xié)議默認(rèn)是22號(hào)端口,那么這個(gè)時(shí)候IP地址再泄露,可以通過(guò)猜密碼的方式去惡意的遠(yuǎn)程控制主機(jī)。而修改這些默認(rèn)設(shè)置,比如修改端口號(hào),其他人就很難知道該主機(jī)的ssh端口號(hào),再進(jìn)一步比如禁止root用戶登錄,降低遠(yuǎn)程登錄的權(quán)限,通過(guò)一步步的加固,可以讓Linux服務(wù)器更加安全。
命令進(jìn)階
上文提到了ssh
命令進(jìn)行遠(yuǎn)程連接,這部分對(duì)ssh
命令的參數(shù)進(jìn)行詳細(xì)的講解。
ssh 命令
-
遠(yuǎn)程登錄,前面說(shuō)過(guò)了,不再贅述(包括使用端口號(hào)登錄)
-
登錄同時(shí)執(zhí)行命令
# 執(zhí)行command格式、 # 命令執(zhí)行完自動(dòng)斷開(kāi)遠(yuǎn)程連接 ssh 用戶名@hostname 'command' # 登錄同時(shí)執(zhí)行l(wèi)s命令 ssh user@hostname 'ls' # 執(zhí)行多條command,使用;分隔 ssh 用戶名@hostname 'command1;command2;command3' # 例 ssh user@hostname 'ls;pwd;whoami'
-
-t
選項(xiàng):提供互動(dòng)式的shell,當(dāng)執(zhí)行命令需要一個(gè)互動(dòng)的shell時(shí)使用,例如vim命令# 不加-t選項(xiàng)時(shí),下面命令報(bào)錯(cuò) ssh user@hostname 'vim' # 添加-t不報(bào)錯(cuò) ssh -t user@hostname 'vim'
-
-f
和-F
- -f:后臺(tái)運(yùn)行ssh連接
- -F:指定參數(shù)配置文件,后接文件路徑(path/ssh_config)
-
-v
(小寫):顯示命令的詳細(xì)執(zhí)行過(guò)程 -
-q
(quiet):靜默模式,不會(huì)輸出警告信息(用了參數(shù)輸錯(cuò)密碼也不會(huì)提示,如下圖所示)
-
ssh
其他參數(shù)大多不常用。
-
ssh
還有一個(gè)端口轉(zhuǎn)發(fā)的功能,但是大多時(shí)候用不上,類似端口轉(zhuǎn)發(fā)的場(chǎng)景基本也不是用ssh去實(shí)現(xiàn),這里就不作講解了。
scp 命令
當(dāng)需要在本地和遠(yuǎn)程進(jìn)行文件傳輸時(shí)就可以使用scp命令,scp
和cp
命令效果完全相同(拷貝文件,包括拷貝多個(gè)文件),只是scp
是遠(yuǎn)程拷貝,而cp
是本地拷貝。scp
分為將遠(yuǎn)程文件拷貝到本地和將本地文件拷貝到遠(yuǎn)端。
命令格式:
-
將本地文件拷貝至遠(yuǎn)程機(jī)器
# 將本地機(jī)器中的文件復(fù)制到遠(yuǎn)程機(jī)器中 scp /path/local_file remote_username@remote_ip:/path/target_file # 拷貝多個(gè)文件 scp file1.txt file2.txt file3.txt username@hostname:/remote/directory/ # 添加-r參數(shù),遞歸拷貝目錄 scp -r /path/local_directory remote_username@remote_ip:/path/target_directory
- 當(dāng)不指定target_file的時(shí)候,會(huì)在遠(yuǎn)程機(jī)器上產(chǎn)生local_file同名文件
-
將遠(yuǎn)程機(jī)器文件拷貝至本地
# 將遠(yuǎn)程機(jī)器中的文件復(fù)制到本地機(jī)器中 # 遠(yuǎn)程拷貝多個(gè)文件的命令形式比較繁瑣,就不寫了 scp remote_username@remote_ip:/path/source_file /path/target_file
- 也可使用
-r
參數(shù)
- 也可使用
其他參數(shù)
-
-v
:輸出更詳細(xì) -
-P
(大寫P):指定ssh協(xié)議端口號(hào)# 指定使用23號(hào)端口 scp -P 23 /path/local_file remote_username@remote_ip:/path/target_file
-
-l
:限制傳輸速率(單位:kbit/s)
sftp 命令
sftp是一種通過(guò)安全通道進(jìn)行文件傳輸?shù)膮f(xié)議。與scp命令相同,sftp命令也能夠進(jìn)行本地和遠(yuǎn)端的文件傳輸。
sftp與scp的區(qū)別:scp在拷貝完文件之后會(huì)立即退出遠(yuǎn)程控制,不會(huì)提供交互式的shell,而sftp是交互式的,不需要一次完成,并且sftp有專門的命令語(yǔ)法對(duì)遠(yuǎn)程和本地機(jī)器的文件拷貝進(jìn)行控制,功能更強(qiáng)大。
命令格式:
sftp remote_username@remote_ip
sftp是先使用ssh協(xié)議連接到遠(yuǎn)程主機(jī),然后提供一個(gè)交換式shell,通過(guò)這個(gè)交互式的shell運(yùn)行自帶的命令實(shí)現(xiàn)文件傳輸。
在sftp
成功之后,會(huì)發(fā)現(xiàn)第一標(biāo)識(shí)符變?yōu)?code>sftp>,這時(shí)已經(jīng)切換到交互式shell:
當(dāng)?shù)谝粯?biāo)識(shí)符變?yōu)?code>sftp之后,就可使用sftp自帶的命令進(jìn)行文件傳輸。
sftp自帶命令
sftp自帶命令與平常的Linux命令十分相似,然后控制本地主機(jī)和遠(yuǎn)程主機(jī)命令是一致的,唯一的區(qū)別:控制本地機(jī)器時(shí)需要在命令之前加!
,不加!
控制遠(yuǎn)程機(jī)器。
命令如下所示:
# 與Linux中命令完全相同
pwd
ls
cd
mkdir
rmdir:刪除命令
# 不同指令,方括號(hào)中的參數(shù)可選,不指定本地或遠(yuǎn)程目錄時(shí),默認(rèn)放在當(dāng)前目錄
put local_file [remotefile]:將本地文件傳輸?shù)竭h(yuǎn)程主機(jī)
get remotefile [local_file]:將遠(yuǎn)程文件傳輸?shù)奖緳C(jī)
exit:退出sftp
部分操作演示:
在host1/root
創(chuàng)建文件test,然后使用sftp遠(yuǎn)程連接host2,host2/root
不創(chuàng)建test目錄
- host1sftp連接host2之后直接使用ls命令查看的是host2的
/root
,加上!
則是查看host1的/root
-
將host1的test文件傳輸至host2
ssh 密鑰(配置免密通道)
最開(kāi)始介紹了ssh的密碼認(rèn)證,ssh還有另一種更方便更安全的常用認(rèn)證方式:密鑰認(rèn)證。在進(jìn)行相關(guān)配置之后,連接比密碼認(rèn)證更便捷,只需配置一次,之后就不需要像密碼認(rèn)證一般每次連接輸入密碼(免密通道),而密碼認(rèn)證,每次都需要輸入密碼進(jìn)行認(rèn)證,有泄露密碼的風(fēng)險(xiǎn)。
ssh密鑰認(rèn)證算法原理使用了非對(duì)稱加密算法原理,通過(guò)使用公鑰和私鑰來(lái)實(shí)現(xiàn)。
非對(duì)稱加密
非對(duì)稱加密是一種使用不同的密鑰進(jìn)行加密和解密的加密算法,另外還有使用相同密鑰加密解密的算法——對(duì)稱加密算法。在非對(duì)稱加密中,有兩個(gè)密鑰:公鑰(Public Key)和私鑰(Private Key)。公鑰用于加密數(shù)據(jù),而私鑰用于解密數(shù)據(jù),使用不同的密鑰進(jìn)行加密解密安全性更高。
非對(duì)稱加密通信過(guò)程:
在兩臺(tái)主機(jī)進(jìn)行數(shù)據(jù)通信時(shí),接受方將生成的公鑰傳送給發(fā)送方,發(fā)送方使用接收方的公鑰對(duì)數(shù)據(jù)加密傳輸給接收方,接收方使用私鑰進(jìn)行解密。使用非對(duì)稱加密時(shí),只將公鑰傳輸給對(duì)方,私鑰不發(fā)送,并且只有私鑰能夠?qū)π畔⑦M(jìn)行解密,對(duì)比對(duì)稱加密,安全性更高。
常用的非對(duì)稱加密算法:rsa,dsa等
ssh 密鑰認(rèn)證原理
雖然ssh密鑰認(rèn)證使用非對(duì)稱加密的原理,但是ssh密鑰認(rèn)證過(guò)程并不是與非對(duì)稱加密通信過(guò)程完全相同,而是和數(shù)字簽名的過(guò)程的比較相似,數(shù)字簽名也使用了非對(duì)稱加密,但是它是私鑰加密,公鑰解密,用于識(shí)別發(fā)送方的身份和驗(yàn)證數(shù)據(jù)的完整性。 ssh使用數(shù)字簽名相似的原理進(jìn)行了身份驗(yàn)證。
在SSH密鑰認(rèn)證中,客戶端會(huì)生成一對(duì)密鑰:私鑰和公鑰。私鑰保存在客戶端本地,而公鑰則傳輸?shù)椒?wù)器上。當(dāng)客戶端嘗試連接到服務(wù)器時(shí),客戶端會(huì)使用私鑰對(duì)一個(gè)挑戰(zhàn)(challenge)進(jìn)行加密,并將加密結(jié)果發(fā)送給服務(wù)器。服務(wù)器端會(huì)使用之前保存的公鑰來(lái)驗(yàn)證客戶端發(fā)送的數(shù)據(jù)。如果驗(yàn)證成功,服務(wù)器就確認(rèn)客戶端的身份,允許其登錄。
ssh 配置免密通道實(shí)操
使用ssh公鑰認(rèn)證時(shí)請(qǐng)確保ssh服務(wù)器開(kāi)啟了公鑰認(rèn)證權(quán)限配置,下面是實(shí)現(xiàn)的具體步驟:
host1模擬本地機(jī)器,host2模擬遠(yuǎn)程機(jī)器
-
首先在ssh客戶端生成公鑰和私鑰對(duì)
# 使用ssh-keygen命令生成密鑰對(duì),不帶參數(shù)時(shí)默認(rèn)使用rsa算法 ssh-keygen # 使用-t參數(shù)指定非對(duì)稱加密算法 ssh-keygen -t dsa
-
使用上述命令時(shí),會(huì)有兩次輸入請(qǐng)求:
- 詢問(wèn)你將密鑰對(duì)放置位置,默認(rèn)放置在~/.ssh路徑下。不設(shè)置直接回車即可
- 詢問(wèn)你是否對(duì)密鑰對(duì)設(shè)置密碼(一般不設(shè)置,更方便,不然每次連接還是需要輸入密碼)。不設(shè)置直接回車即可, 這里需要回車兩次,第二次是確認(rèn)密碼
-
當(dāng)生成完畢之后,可以在
~/.ssh
路徑下可以看到新生成的密鑰對(duì)(會(huì)多出兩個(gè)文件),在不指定文件名稱時(shí),文件名稱為加密算法名稱,其中.pub結(jié)尾的為公鑰:
-
-
生成完畢之后,將公鑰發(fā)送給需要遠(yuǎn)程連接的機(jī)器
# 可以使用-i參數(shù)指定傳送的公鑰文件,如不指定自動(dòng)在~/.ssh中進(jìn)行查找 # 直接使用ssh-copy-id命令發(fā)送公鑰 ssh-copy-id username@hostname # 使用-i參數(shù)指定公鑰文件 ssh-copy-id -i key_file username@hostname
-
傳輸公鑰時(shí),會(huì)要求輸入服務(wù)器端的用戶密碼
-
傳輸完成后,在host2的
~/.ssh
下可以看到多了個(gè)文件authorized_keys,這個(gè)文件儲(chǔ)存有host1的公鑰,如下圖,圖二為文件內(nèi)容:
-
-
將公鑰發(fā)送給服務(wù)器之后即可進(jìn)行連接
# 使用ssh進(jìn)行連接,會(huì)發(fā)現(xiàn)不再提醒你輸入密碼,直接連接成功 # 只要在生成密鑰時(shí)未設(shè)置密碼,之后的ssh連接都不再需要輸入密碼 ssh 用戶名@hostname
其他
這部分是一些和ssh協(xié)議有關(guān)系的操作或者命令的簡(jiǎn)單介紹
rsync命令
rsync命令是一個(gè)文件同步備份的命令,除了本地同步,還支持遠(yuǎn)程同步,可以將其理解為remote sync(遠(yuǎn)程同步)。除了支持遠(yuǎn)程同步備份與cp,tar等命令不同之外,rsync是一個(gè)增量同步的命令,只有數(shù)據(jù)存在差異時(shí),才會(huì)覆蓋不同的部分。
rsync命令十分好用,這個(gè)命令底層有兩個(gè)實(shí)現(xiàn)協(xié)議:ssh協(xié)議和rsync協(xié)議。因?yàn)樗灿玫搅藄sh協(xié)議這里順帶講一下。(只是簡(jiǎn)單提一下)
rsync和scp很相像,但是rsync的性能比scp好,還支持增量同步,而且rsync支持更復(fù)雜的參數(shù),有更多的控制選項(xiàng),rsync相當(dāng)于scp的上位命令。
使用rsync命令需要兩臺(tái)機(jī)器都安裝rsync命令。
# 安裝rsync
yum install rsync -y
sudo apt install rsync
rsync命令有幾種格式:
# 用于本地備份
rsync SRC DEST
# 將本地?cái)?shù)據(jù)備份到遠(yuǎn)程機(jī)器上
rsync SRC [USER@]HOST:DEST
# 將遠(yuǎn)程數(shù)據(jù)備份到本地
rsync [USER@]HOST:SRC DEST
# 剩下的兩個(gè)格式和上面兩個(gè)是相同的,只是用來(lái)兩個(gè)`:`,這代表使用rsync協(xié)議,而上面的命令則是使用ssh協(xié)議
rsync [USER@]HOST::SRC DEST
rsync SRC [USER@]HOST::DEST
可用參數(shù):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-744404.html
-
-a, --archive
: 歸檔模式,遞歸復(fù)制文件和文件夾,并保留所有屬性、權(quán)限和時(shí)間信息。 -
-v, --verbose
: 顯示詳細(xì)輸出,包括復(fù)制的文件列表和進(jìn)度信息。 -
-r, --recursive
: 遞歸復(fù)制目錄及其內(nèi)容。 -
-u, --update
: 僅復(fù)制源文件中更新的部分。 -
-z, --compress
: 在傳輸過(guò)程中壓縮文件,可以加快傳輸速度。 -
-P, --partial --progress
: 顯示傳輸過(guò)程的進(jìn)度信息,并保留未完成的文件。 -
--delete
: 刪除目標(biāo)路徑上多余的文件。
rsync相較于使用ssh協(xié)議,使用更多的是rsync協(xié)議,一般稱為rsync-daemon
模式,這個(gè)模式更穩(wěn)定,更安全,只是沒(méi)有但用rsync命令那么靈活,需要在被傳輸機(jī)器上進(jìn)行相關(guān)配置,這里就不講解了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744404.html
到了這里,關(guān)于ssh詳解–讓你徹底學(xué)會(huì)ssh的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!