推薦閱讀(點擊即可跳轉閱讀)

1. SpringBoot內容聚合

2. 面試題內容聚合

3. 設計模式內容聚合

4. 排序演算法內容聚合

5. 多線程內容聚合

1.前言

在Mac下登陸遠程伺服器並沒有Windows那麼方便的使用XShell,相比較而言,在Mac下更多的是依賴終端輸入SSH命令登陸遠程伺服器。

使用SSH命令行的好處就是可以近距離接觸底層,用的越多,用的越溜,對SSH的原理就越瞭解。相反,使用現成的SSH工具(PuTTY、XShell),我們其實並不會有涉及使用ssh命令的機會,對大多數人而言,怕是隻知道最基本的ssh root@ip

本文將帶大家瞭解ssh的原理與使用技巧,幫助更多終端愛好者更方便更隨心所欲的使用終端。

2.SSH是什麼

SSH服務其實是一個守護進程(demon),系統後臺會監聽客戶端的連接,ssh服務端的進程名為sshd,負責實時監聽客戶端的請求(IP 22埠),包括公共祕鑰等交換等信息。SSH服務端由2部分組成:openssh(提供ssh服務)、openssl(提供加密的程序)。

3.對稱加密和非對稱加密

在學習SSH的工作機制之前,我們需要了解對稱加密和非對稱加密的原理。

對稱加密

所謂對稱加密,是採用對稱密碼編碼技術的加密措施,它的特點是文件加密和解密都是使用相同的密鑰。

這種方法在密碼學中叫做對稱加密演算法,對稱加密演算法使用起來簡單快捷,密鑰較短,且破譯困難,除了數據加密標準(DES),另一個對稱密鑰加密系統是國際數據加密演算法(IDEA),它比DES的加密性好,而且對計算機功能要求也沒有那麼高。

非對稱加密

與對稱加密演算法不同,非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。

公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。

因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。

4.SSH如何工作

瞭解了對稱加密和非對稱加密是什麼之後,再來瞭解SSH如何使用非對稱加密技術,大致流程如下:

在伺服器啟動的時候會產生一個密鑰(也就是768bit公鑰),本地的ssh客戶端發送連接請求到ssh伺服器,伺服器檢查連接點客戶端發送的數據和IP地址,確認合法後發送密鑰(768bits公鑰)給客戶端,此時客戶端將本地私鑰(256bit)和伺服器的公鑰(768bit)結合成密鑰對key(1024bit),發回給伺服器端,服務端利用自己的私鑰解密,讀取出客戶端的本地私鑰,建立連接通過key-pair數據傳輸,在此之後,服務端與客戶端就愉快的使用客戶端私鑰進行溝通。

5.SSH命令詳解

SSH命令最簡單的用法只需要指定用戶名和主機名參數即可,主機名可以是 IP 地址或者域名。

ssh [email protected]

指定埠號

SSH 默認連接到目標主機的 22 埠上,我們可以使用 -p 選項指定埠號。

ssh -p 22 [email protected]

追加命令

使用 SSH 在遠程主機執行一條命令並顯示到本地,然後繼續本地工作,只需要直接連接並在後面加上要執行的命令。

ssh -p 22 [email protected] ls -l

圖形界面

在遠程主機運行一個圖形界面的程序,只需使用SSH的-X選項,然後主機就會開啟 X11轉發功能。

ssh -X 22 [email protected]

綁定源地址

如果你的客戶端有多於兩個以上的 IP 地址,你就不可能分得清楚在使用哪一個 IP 連接到 SSH 伺服器。為瞭解決這種情況,我們可以使用 -b 選項來指定一個IP 地址。這個 IP 將會被使用做建立連接的源地址。

ssh -b 192.168.0.200 [email protected]

對所有數據請求壓縮

使用 -C 選項,所有通過 SSH 發送或接收的數據將會被壓縮,並且仍然是加密的。

ssh -C [email protected]

打開調試模式

因為某些原因,我們想要追蹤調試我們建立的 SSH 連接情況。SSH 提供的 -v 選項參數正是為此而設的。其可以看到在哪個環節出了問題。

ssh -v [email protected]

6.SSH免密登陸

通過SSH命令登陸遠程伺服器需要手動的每次輸入密碼,解決這個問題其實非常簡單,通過 ssh-keygen 生成本地公鑰和私鑰,將公鑰Copy到遠程伺服器就可以。

1.構建 SSH 密鑰對

使用 ssh-keygen -t +演算法名,現在大多數都使用 RSA 或者 DSA 演算法。

如果你在安裝Git時已經做過此步驟,那麼忽略這一步即可。

ssh-keygen -t rsa

2.拷貝本地公鑰給遠程伺服器

ssh-copy-id [email protected]

你可以通過參數 -i 指定公鑰文件

ssh-copy-id -i id_dsa.pub [email protected]

3.查看是否已經添加了對應主機的密鑰

使用 -F 選項

ssh-keygen -F 192.168.0.1

4.刪除主機密鑰

使用-R選項,也可以在 ~/.ssh/known_hosts 文件中手動刪除

ssh-keygen -R 192.168.0.1

7.如何配置 SSH

SSH 的配置文件在 /etc/ssh/sshd_config 中,你可以看到埠號,空閑超時時間等配置項。

cat /etc/ssh/sshd_config

/etc/ssh/sshd_config 配置文件詳細說明

#############1. 關於 SSH Server 的整體設定##############
#Port 22
##port用來設置sshd監聽的埠,為了安全起見,建議更改默認的22埠為5位以上陌生埠
#Protocol 2,1
Protocol 2
##設置協議版本為SSH1或SSH2,SSH1存在漏洞與缺陷,選擇SSH2
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress用來設置sshd伺服器綁定的IP地址
##監聽的主機適配卡,舉個例子來說,如果您有兩個 IP, 分別是 192.168.0.11 及 192.168.2.20 ,那麼只想要
###開放 192.168.0.11 時,就可以設置為:ListenAddress 192.168.0.11
####表示只監聽來自 192.168.0.11 這個 IP 的SSH聯機。如果不使用設定的話,則預設所有介面均接受 SSH

#############2. 說明主機的 Private Key 放置的檔案##########                 
#ListenAddress ::
##HostKey用來設置伺服器祕鑰文件的路徑
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
##設置SSH version 1 使用的私鑰

# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
##設置SSH version 2 使用的 RSA 私鑰

#HostKey /etc/ssh/ssh_host_dsa_key
##設置SSH version 2 使用的 DSA 私鑰

#Compression yes      
##設置是否可以使用壓縮指令

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
##KeyRegenerationInterval用來設置多長時間後系統自動重新生成伺服器的祕鑰,
###(如果使用密鑰)。重新生成祕鑰是為了防止利用盜用的密鑰解密被截獲的信息。

#ServerKeyBits 768
##ServerKeyBits用來定義伺服器密鑰的長度
###指定臨時伺服器密鑰的長度。僅用於SSH-1。默認值是 768(位)。最小值是 512 。

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
##SyslogFacility用來設定在記錄來自sshd的消息的時候,是否給出「facility code」

#LogLevel INFO
##LogLevel用來設定sshd日誌消息的級別

#################3.安全認證方面的設定################
#############3.1、有關安全登錄的設定###############
# Authentication:
##限制用戶必須在指定的時限內認證成功,0 表示無限制。默認值是 120 秒。

#LoginGraceTime 2m
##LoginGraceTime用來設定如果用戶登錄失敗,在切斷連接前伺服器需要等待的時間,單位為妙

#PermitRootLogin yes
##PermitRootLogin用來設置能不能直接以超級用戶ssh登錄,root遠程登錄Linux很危險,建議註銷或設置為no

#StrictModes yes
##StrictModes用來設置ssh在接收登錄請求之前是否檢查用戶根目錄和rhosts文件的許可權和所有權,建議開啟
###建議使用默認值"yes"來預防可能出現的低級錯誤。

#RSAAuthentication yes
##RSAAuthentication用來設置是否開啟RSA密鑰驗證,只針對SSH1

#PubkeyAuthentication yes
##PubkeyAuthentication用來設置是否開啟公鑰驗證,如果使用公鑰驗證的方式登錄時,則設置為yes

#AuthorizedKeysFile .ssh/authorized_keys
##AuthorizedKeysFile用來設置公鑰驗證文件的路徑,與PubkeyAuthentication配合使用,默認值是".ssh/authorized_keys"。
###該指令中可以使用下列根據連接時的實際情況進行展開的符號: %% 表示%、%h 表示用戶的主目錄、%u 表示該用戶的用戶名
####經過擴展之後的值必須要麼是絕對路徑,要麼是相對於用戶主目錄的相對路徑。

#############3.2、安全驗證的設定###############
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
##是否使用強可信主機認證(通過檢查遠程主機名和關聯的用戶名進行認證)。僅用於SSH-1。
###這是通過在RSA認證成功後再檢查 ~/.rhosts 或 /etc/hosts.equiv 進行認證的。出於安全考慮,建議使用默認值"no"。

# similar for protocol version 2
#HostbasedAuthentication no
##這個指令與 RhostsRSAAuthentication 類似,但是僅可以用於SSH-2。

# Change to yes if you dont trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication

#IgnoreUserKnownHosts no
##IgnoreUserKnownHosts用來設置ssh在進行RhostsRSAAuthentication安全驗證時是否忽略用戶的「/$HOME/.ssh/known_hosts」文件
# Dont read the users ~/.rhosts and ~/.shosts files

#IgnoreRhosts yes
##IgnoreRhosts用來設置驗證的時候是否使用「~/.rhosts」和「~/.shosts」文件

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
##PasswordAuthentication用來設置是否開啟密碼驗證機制,如果用密碼登錄系統,則設置yes

#PermitEmptyPasswords no
#PermitEmptyPasswords用來設置是否允許用口令為空的賬號登錄系統,設置no

#PasswordAuthentication yes
##是否允許使用基於密碼的認證。默認為"yes"。
PasswordAuthentication yes

# Change to no to disable s/key passwords
##設置禁用s/key密碼
#ChallengeResponseAuthentication yes
##ChallengeResponseAuthentication 是否允許質疑-應答(challenge-response)認證
ChallengeResponseAuthentication no

########3.3、與 Kerberos 有關的參數設定,指定是否允許基於Kerberos的用戶認證########
#Kerberos options
#KerberosAuthentication no
##是否要求用戶為PasswdAuthentication提供的密碼必須通過Kerberos KDC認證,要使用Kerberos認證,
###伺服器必須提供一個可以校驗KDC identity的Kerberos servtab。默認值為no

#KerberosOrLocalPasswd yes
##如果Kerberos密碼認證失敗,那麼該密碼還將要通過其他的的認證機制,如/etc/passwd
###在啟用此項後,如果無法通過Kerberos驗證,則密碼的正確性將由本地的機制來決定,如/etc/passwd,默認為yes

#KerberosTicketCleanup yes
##設置是否在用戶退出登錄是自動銷毀用戶的ticket

#KerberosGetAFSToken no
##如果使用AFS並且該用戶有一個Kerberos 5 TGT,那麼開啟該指令後,
###將會在訪問用戶的家目錄前嘗試獲取一個AFS token,並嘗試傳送 AFS token 給 Server 端,默認為no

####3.4、與 GSSAPI 有關的參數設定,指定是否允許基於GSSAPI的用戶認證,僅適用於SSH2####
##GSSAPI 是一套類似 Kerberos 5 的通用網路安全系統介面。
###如果你擁有一套 GSSAPI庫,就可以通過 tcp 連接直接建立 cvs 連接,由 GSSAPI 進行安全鑒別。

# GSSAPI options
#GSSAPIAuthentication no
##GSSAPIAuthentication 指定是否允許基於GSSAPI的用戶認證,默認為no

GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
##GSSAPICleanupCredentials 設置是否在用戶退出登錄是自動銷毀用戶的憑證緩存
GSSAPICleanupCredentials yes

# Set this to yes to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication mechanism.
# Depending on your PAM configuration, this may bypass the setting of
# PasswordAuthentication, PermitEmptyPasswords, and
# "PermitRootLogin without-password". If you just want the PAM account and
# session checks to run without PAM authentication, then enable this but set
# ChallengeResponseAuthentication=no
#UsePAM no
##設置是否通過PAM驗證
UsePAM yes

# Accept locale-related environment variables
##AcceptEnv 指定客戶端發送的哪些環境變數將會被傳遞到會話環境中。
###[注意]只有SSH-2協議支持環境變數的傳遞。指令的值是空格分隔的變數名列表(其中可以使用*和?作為通配符)。
####也可以使用多個 AcceptEnv 達到同樣的目的。需要注意的是,有些環境變數可能會被用於繞過禁止用戶使用的環境變數。
#####由於這個原因,該指令應當小心使用。默認是不傳遞任何環境變數。

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
AllowTcpForwarding yes

##AllowTcpForwarding設置是否允許允許tcp埠轉發,保護其他的tcp連接

#GatewayPorts no
##GatewayPorts 設置是否允許遠程客戶端使用本地主機的埠轉發功能,出於安全考慮,建議禁止

#############3.5、X-Window下使用的相關設定###############

#X11Forwarding no
##X11Forwarding 用來設置是否允許X11轉發
X11Forwarding yes

#X11DisplayOffset 10
##指定X11 轉發的第一個可用的顯示區(display)數字。默認值是 10 。
###可以用於防止 sshd 佔用了真實的 X11 伺服器顯示區,從而發生混淆。
X11DisplayOffset 10

#X11UseLocalhost yes

#################3.6、登入後的相關設定#################

#PrintMotd yes
##PrintMotd用來設置sshd是否在用戶登錄時顯示「/etc/motd」中的信息,可以選在在「/etc/motd」中加入警告的信息

#PrintLastLog yes
#PrintLastLog 是否顯示上次登錄信息

#TCPKeepAlive yes
##TCPKeepAlive 是否持續連接,設置yes可以防止死連接
###一般而言,如果設定這項目的話,那麼 SSH Server 會傳送 KeepAlive 的訊息給 Client 端,以確保兩者的聯機正常!
####這種消息可以檢測到死連接、連接不當關閉、客戶端崩潰等異常。在這個情況下,任何一端死掉後, SSH 可以立刻知道,而不會有殭屍程序的發生!

#UseLogin no
##UseLogin 設置是否在互動式會話的登錄過程中使用。默認值是"no"。
###如果開啟此指令,那麼X11Forwarding 將會被禁止,因為login不知道如何處理 xauth cookies 。
####需要注意的是,在SSH底下本來就不接受 login 這個程序的登入,如果指UsePrivilegeSeparation ,那麼它將在認證完成後被禁用。
UserLogin no       

#UsePrivilegeSeparation yes
##UsePrivilegeSeparation 設置使用者的許可權
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no

#UseDNS yes
##UseDNS是否使用dns反向解析

#PidFile /var/run/sshd.pid

#MaxStartups 10
##MaxStartups 設置同時允許幾個尚未登入的聯機,當用戶連上ssh但並未輸入密碼即為所謂的聯機,
###在這個聯機中,為了保護主機,所以需要設置最大值,預設為10個,而已經建立聯機的不計算入內,
####所以一般5個即可,這個設置可以防止惡意對伺服器進行連接

#MaxAuthTries 6
##MaxAuthTries 用來設置最大失敗嘗試登陸次數為6,合理設置辭職,可以防止攻擊者窮舉登錄伺服器
#PermitTunnel no

############3.7、開放禁止用戶設定############

#AllowUsers<用戶名1> <用戶名2> <用戶名3> ...
##指定允許通過遠程訪問的用戶,多個用戶以空格隔開

#AllowGroups<組名1> <組名2> <組名3> ...
##指定允許通過遠程訪問的組,多個組以空格隔開。當多個用戶需要通過ssh登錄系統時,可將所有用戶加入一個組中。

#DenyUsers<用戶名1> <用戶名2> <用戶名3> ...
##指定禁止通過遠程訪問的用戶,多個用戶以空格隔開

#DenyGroups<組名1> <組名2> <組名3> ...
##指定禁止通過遠程訪問的組,多個組以空格隔開。

# no default banner path
#Banner /some/path

# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
ClientAliveInterval 3600
ClientAliveCountMax 0

8.sftp是什麼

SFTP是Secure FileTransferProtocol的縮寫,安全文件傳送協議。

SFTP和FTP是兩種協議,它們是不同的,sftp是ssh內含的協議,只要sshd伺服器啟動了,它就可用,它本身沒有單獨的守護進程,更不需要ftp伺服器啟動。

SFTP同樣是使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由於這種傳輸方式使用了加密/解密技術,所以傳輸效率比普通的FTP要低得多,如果您對網路安全性要求更高時,可以使用SFTP代替FTP。

9.sftp登陸

使用sftp登陸遠程伺服器,可以

sftp [email protected]

也可以指定埠號

sftp -oPort=22 [email protected]

10.使用sftp進行文件上傳下載

下載

語法

get [-afPpRr] remote [local]

下載遠程文件到本地目錄

get /tmp/test.c ~/

下載遠程文件夾到本地目錄

get -r /tmp/test.c ~/

上傳

語法

put [-afPpRr] local [remote]

上傳本地文件到遠程文件夾

put ~/test.c /tmp/

上傳本地文件夾到遠程目錄(會上傳本地文件夾下的所有文件)

put ~/test /tmp/

11.更多sftp命令

輸入 help 命令可以查看sftp支持的命令操作:

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會話環境下執行本地命令怎麼辦?只需要在本地命令之前加嘆號!即可,示例如下:

!ls

退出會話

無論是在 ssh 還是 sftp,都可以使用 exit 退出當前會話,sftp 還可以使用 quit 命令退出。

12.結語

相信本文足以可以讓你解決使用終端過程中碰到的絕大多數問題了。

我是薛勤,咱們下期見!關注我,帶你領略更多編程技能!

參考文章:cnblogs.com/ftl1012/p/s

推薦閱讀:

相關文章