在Mac下登陸遠程服務(wù)器并沒有Windows那么方便的使用XShell,相比較而言,在Mac下更多的是依賴終端輸入SSH命令登錄遠程服務(wù)器。
使用SSH命令行的好處就是可以近距離接觸底層,用的越多,用的越溜,對SSH的原理就越了解。相反,使用現(xiàn)成的SSH工具(PuTTY、XShell),我們其實并不會有涉及使用ssh命令的機會,對大多數(shù)人而言,怕是只知道最基本的ssh root@ip。

本文將帶大家了解ssh的原理與使用技巧,幫助更多終端愛好者更方便更隨心所欲的使用終端。
1.SSH是什么
SSH服務(wù)其實是一個守護進程(demon),系統(tǒng)后臺會監(jiān)聽客戶端的連接,ssh服務(wù)端的進程名為sshd,負責(zé)實時監(jiān)聽客戶端的請求(IP 22端口),包括公共秘鑰等交換等信息。SSH服務(wù)端由2部分組成:openssh(提供ssh服務(wù))、openssl(提供加密的程序)。
2.對稱加密和非對稱加密
在學(xué)習(xí)SSH的工作機制之前,我們需要了解對稱加密和非對稱加密的原理。
對稱加密
所謂對稱加密,是采用對稱密碼編碼技術(shù)的加密措施,它的特點是文件加密和解密都是使用相同的密鑰。
這種方法在密碼學(xué)中叫做對稱加密算法,對稱加密算法使用起來簡單快捷,密鑰較短,且破譯困難,除了數(shù)據(jù)加密標(biāo)準(zhǔn)(DES),另一個對稱密鑰加密系統(tǒng)是國際數(shù)據(jù)加密算法(IDEA),它比DES的加密性好,而且對計算機功能要求也沒有那么高。
非對稱加密
與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。
公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進行加密,那么只有用對應(yīng)的公開密鑰才能解密。
因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。
3.SSH如何工作
了解了對稱加密和非對稱加密是什么之后,再來了解SSH如何使用非對稱加密技術(shù),大致流程如下:
在服務(wù)器啟動的時候會產(chǎn)生一個密鑰(也就是768bit公鑰),本地的ssh客戶端發(fā)送連接請求到ssh服務(wù)器,服務(wù)器檢查連接點客戶端發(fā)送的數(shù)據(jù)和IP地址,確認合法后發(fā)送密鑰(768bits公鑰)給客戶端,此時客戶端將本地私鑰(256bit)和服務(wù)器的公鑰(768bit)結(jié)合成密鑰對key(1024bit),發(fā)回給服務(wù)器端,服務(wù)端利用自己的私鑰解密,讀取出客戶端的本地私鑰,建立連接通過key-pair數(shù)據(jù)傳輸,在此之后,服務(wù)端與客戶端就愉快的使用客戶端私鑰進行溝通。
4.SSH命令詳解
SSH命令最簡單的用法只需要指定用戶名和主機名參數(shù)即可,主機名可以是 IP 地址或者域名。
ssh root@192.168.0.1
指定端口號
SSH 默認連接到目標(biāo)主機的 22 端口上,我們可以使用 -p 選項指定端口號。
ssh -p 22 root@192.168.0.1
追加命令
使用 SSH 在遠程主機執(zhí)行一條命令并顯示到本地,然后繼續(xù)本地工作,只需要直接連接并在后面加上要執(zhí)行的命令。
ssh -p 22 root@192.168.0.1 ls -l
圖形界面
在遠程主機運行一個圖形界面的程序,只需使用SSH的-X選項,然后主機就會開啟 X11轉(zhuǎn)發(fā)功能。
ssh -X 22 root@192.168.0.1
綁定源地址
如果你的客戶端有多于兩個以上的 IP 地址,你就不可能分得清楚在使用哪一個 IP 連接到 SSH 服務(wù)器。為了解決這種情況,我們可以使用 -b 選項來指定一個IP 地址。這個 IP 將會被使用做建立連接的源地址。
ssh -b 192.168.0.200 root@192.168.0.103
對所有數(shù)據(jù)請求壓縮
使用 -C 選項,所有通過 SSH 發(fā)送或接收的數(shù)據(jù)將會被壓縮,并且仍然是加密的。
ssh -b 192.168.0.200 root@192.168.0.103
打開調(diào)試模式
因為某些原因,我們想要追蹤調(diào)試我們建立的 SSH 連接情況。SSH 提供的 -v 選項參數(shù)正是為此而設(shè)的。其可以看到在哪個環(huán)節(jié)出了問題。
ssh -v root@192.168.0.103
5.SSH免密登陸
通過SSH命令登陸遠程服務(wù)器需要手動的每次輸入密碼,解決這個問題其實非常簡單,通過 ssh-keygen 生成本地公鑰和私鑰,將公鑰Copy到遠程服務(wù)器就可以。
1.構(gòu)建 SSH 密鑰對
使用 ssh-keygen -t +算法名,現(xiàn)在大多數(shù)都使用 RSA 或者 DSA 算法。
如果你在安裝Git時已經(jīng)做過此步驟,那么忽略這一步即可。
ssh-keygen -t rsa
2.拷貝本地公鑰給遠程服務(wù)器
ssh-copy-id root@192.168.25.110
你可以通過參數(shù) -i 指定公鑰文件
ssh-copy-id -i id_dsa.pub omd@192.168.25.110
3.查看是否已經(jīng)添加了對應(yīng)主機的密鑰
使用 -F 選項
ssh-keygen -F 192.168.0.1
4.刪除主機密鑰
使用-R選項,也可以在 ~/.ssh/known_hosts 文件中手動刪除
ssh-keygen -R 192.168.0.1
6.如何配置 SSH
SSH 的配置文件在 /etc/ssh/sshd_config 中,你可以看到端口號,空閑超時時間等配置項。
cat /etc/ssh/sshd_config
/etc/ssh/sshd_config 配置文件詳細說明
#############1. 關(guān)于 SSH Server 的整體設(shè)定##############
#Port 22
##port用來設(shè)置sshd監(jiān)聽的端口,為了安全起見,建議更改默認的22端口為5位以上陌生端口
#Protocol 2,1
Protocol 2
##設(shè)置協(xié)議版本為SSH1或SSH2,SSH1存在漏洞與缺陷,選擇SSH2
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress用來設(shè)置sshd服務(wù)器綁定的IP地址
##監(jiān)聽的主機適配卡,舉個例子來說,如果您有兩個 IP, 分別是 192.168.0.11 及 192.168.2.20 ,那么只想要
###開放 192.168.0.11 時,就可以設(shè)置為:ListenAddress 192.168.0.11
####表示只監(jiān)聽來自 192.168.0.11 這個 IP 的SSH聯(lián)機。如果不使用設(shè)定的話,則預(yù)設(shè)所有接口均接受 SSH
#############2. 說明主機的 Private Key 放置的檔案##########
#ListenAddress ::
##HostKey用來設(shè)置服務(wù)器秘鑰文件的路徑
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
##設(shè)置SSH version 1 使用的私鑰
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
##設(shè)置SSH version 2 使用的 RSA 私鑰
#HostKey /etc/ssh/ssh_host_dsa_key
##設(shè)置SSH version 2 使用的 DSA 私鑰
#Compression yes
##設(shè)置是否可以使用壓縮指令
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
##KeyRegenerationInterval用來設(shè)置多長時間后系統(tǒng)自動重新生成服務(wù)器的秘鑰,
###(如果使用密鑰)。重新生成秘鑰是為了防止利用盜用的密鑰解密被截獲的信息。
#ServerKeyBits 768
##ServerKeyBits用來定義服務(wù)器密鑰的長度
###指定臨時服務(wù)器密鑰的長度。僅用于SSH-1。默認值是 768(位)。最小值是 512 。
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
##SyslogFacility用來設(shè)定在記錄來自sshd的消息的時候,是否給出“facility code”
#LogLevel INFO
##LogLevel用來設(shè)定sshd日志消息的級別
#################3.安全認證方面的設(shè)定################
#############3.1、有關(guān)安全登錄的設(shè)定###############
# Authentication:
##限制用戶必須在指定的時限內(nèi)認證成功,0 表示無限制。默認值是 120 秒。
#LoginGraceTime 2m
##LoginGraceTime用來設(shè)定如果用戶登錄失敗,在切斷連接前服務(wù)器需要等待的時間,單位為妙
#PermitRootLogin yes
##PermitRootLogin用來設(shè)置能不能直接以超級用戶ssh登錄,root遠程登錄Linux很危險,建議注銷或設(shè)置為no
#StrictModes yes
##StrictModes用來設(shè)置ssh在接收登錄請求之前是否檢查用戶根目錄和rhosts文件的權(quán)限和所有權(quán),建議開啟
###建議使用默認值"yes"來預(yù)防可能出現(xiàn)的低級錯誤。
#RSAAuthentication yes
##RSAAuthentication用來設(shè)置是否開啟RSA密鑰驗證,只針對SSH1
#PubkeyAuthentication yes
##PubkeyAuthentication用來設(shè)置是否開啟公鑰驗證,如果使用公鑰驗證的方式登錄時,則設(shè)置為yes
#AuthorizedKeysFile .ssh/authorized_keys
##AuthorizedKeysFile用來設(shè)置公鑰驗證文件的路徑,與PubkeyAuthentication配合使用,默認值是".ssh/authorized_keys"。
###該指令中可以使用下列根據(jù)連接時的實際情況進行展開的符號: %% 表示'%'、%h 表示用戶的主目錄、%u 表示該用戶的用戶名
####經(jīng)過擴展之后的值必須要么是絕對路徑,要么是相對于用戶主目錄的相對路徑。
#############3.2、安全驗證的設(shè)定###############
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
##是否使用強可信主機認證(通過檢查遠程主機名和關(guān)聯(lián)的用戶名進行認證)。僅用于SSH-1。
###這是通過在RSA認證成功后再檢查 ~/.rhosts 或 /etc/hosts.equiv 進行認證的。出于安全考慮,建議使用默認值"no"。
# similar for protocol version 2
#HostbasedAuthentication no
##這個指令與 RhostsRSAAuthentication 類似,但是僅可以用于SSH-2。
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
##IgnoreUserKnownHosts用來設(shè)置ssh在進行RhostsRSAAuthentication安全驗證時是否忽略用戶的“/$HOME/.ssh/known_hosts”文件
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
##IgnoreRhosts用來設(shè)置驗證的時候是否使用“~/.rhosts”和“~/.shosts”文件
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
##PasswordAuthentication用來設(shè)置是否開啟密碼驗證機制,如果用密碼登錄系統(tǒng),則設(shè)置yes
#PermitEmptyPasswords no
#PermitEmptyPasswords用來設(shè)置是否允許用口令為空的賬號登錄系統(tǒng),設(shè)置no
#PasswordAuthentication yes
##是否允許使用基于密碼的認證。默認為"yes"。
PasswordAuthentication yes
# Change to no to disable s/key passwords
##設(shè)置禁用s/key密碼
#ChallengeResponseAuthentication yes
##ChallengeResponseAuthentication 是否允許質(zhì)疑-應(yīng)答(challenge-response)認證
ChallengeResponseAuthentication no
########3.3、與 Kerberos 有關(guān)的參數(shù)設(shè)定,指定是否允許基于Kerberos的用戶認證########
#Kerberos options
#KerberosAuthentication no
##是否要求用戶為PasswdAuthentication提供的密碼必須通過Kerberos KDC認證,要使用Kerberos認證,
###服務(wù)器必須提供一個可以校驗KDC identity的Kerberos servtab。默認值為no
#KerberosOrLocalPasswd yes
##如果Kerberos密碼認證失敗,那么該密碼還將要通過其他的的認證機制,如/etc/passwd
###在啟用此項后,如果無法通過Kerberos驗證,則密碼的正確性將由本地的機制來決定,如/etc/passwd,默認為yes
#KerberosTicketCleanup yes
##設(shè)置是否在用戶退出登錄是自動銷毀用戶的ticket
#KerberosGetAFSToken no
##如果使用AFS并且該用戶有一個Kerberos 5 TGT,那么開啟該指令后,
###將會在訪問用戶的家目錄前嘗試獲取一個AFS token,并嘗試傳送 AFS token 給 Server 端,默認為no
####3.4、與 GSSAPI 有關(guān)的參數(shù)設(shè)定,指定是否允許基于GSSAPI的用戶認證,僅適用于SSH2####
##GSSAPI 是一套類似 Kerberos 5 的通用網(wǎng)絡(luò)安全系統(tǒng)接口。
###如果你擁有一套 GSSAPI庫,就可以通過 tcp 連接直接建立 cvs 連接,由 GSSAPI 進行安全鑒別。
# GSSAPI options
#GSSAPIAuthentication no
##GSSAPIAuthentication 指定是否允許基于GSSAPI的用戶認證,默認為no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
##GSSAPICleanupCredentials 設(shè)置是否在用戶退出登錄是自動銷毀用戶的憑證緩存
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
##設(shè)置是否通過PAM驗證
UsePAM yes
# Accept locale-related environment variables
##AcceptEnv 指定客戶端發(fā)送的哪些環(huán)境變量將會被傳遞到會話環(huán)境中。
###[注意]只有SSH-2協(xié)議支持環(huán)境變量的傳遞。指令的值是空格分隔的變量名列表(其中可以使用'*'和'?'作為通配符)。
####也可以使用多個 AcceptEnv 達到同樣的目的。需要注意的是,有些環(huán)境變量可能會被用于繞過禁止用戶使用的環(huán)境變量。
#####由于這個原因,該指令應(yīng)當(dāng)小心使用。默認是不傳遞任何環(huán)境變量。
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設(shè)置是否允許允許tcp端口轉(zhuǎn)發(fā),保護其他的tcp連接
#GatewayPorts no
##GatewayPorts 設(shè)置是否允許遠程客戶端使用本地主機的端口轉(zhuǎn)發(fā)功能,出于安全考慮,建議禁止
#############3.5、X-Window下使用的相關(guān)設(shè)定###############
#X11Forwarding no
##X11Forwarding 用來設(shè)置是否允許X11轉(zhuǎn)發(fā)
X11Forwarding yes
#X11DisplayOffset 10
##指定X11 轉(zhuǎn)發(fā)的第一個可用的顯示區(qū)(display)數(shù)字。默認值是 10 。
###可以用于防止 sshd 占用了真實的 X11 服務(wù)器顯示區(qū),從而發(fā)生混淆。
X11DisplayOffset 10
#X11UseLocalhost yes
#################3.6、登入后的相關(guān)設(shè)定#################
#PrintMotd yes
##PrintMotd用來設(shè)置sshd是否在用戶登錄時顯示“/etc/motd”中的信息,可以選在在“/etc/motd”中加入警告的信息
#PrintLastLog yes
#PrintLastLog 是否顯示上次登錄信息
#TCPKeepAlive yes
##TCPKeepAlive 是否持續(xù)連接,設(shè)置yes可以防止死連接
###一般而言,如果設(shè)定這項目的話,那么 SSH Server 會傳送 KeepAlive 的訊息給 Client 端,以確保兩者的聯(lián)機正常!
####這種消息可以檢測到死連接、連接不當(dāng)關(guān)閉、客戶端崩潰等異常。在這個情況下,任何一端死掉后, SSH 可以立刻知道,而不會有僵尸程序的發(fā)生!
#UseLogin no
##UseLogin 設(shè)置是否在交互式會話的登錄過程中使用。默認值是"no"。
###如果開啟此指令,那么X11Forwarding 將會被禁止,因為login不知道如何處理 xauth cookies 。
####需要注意的是,在SSH底下本來就不接受 login 這個程序的登入,如果指UsePrivilegeSeparation ,那么它將在認證完成后被禁用。
UserLogin no
#UsePrivilegeSeparation yes
##UsePrivilegeSeparation 設(shè)置使用者的權(quán)限
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
##UseDNS是否使用dns反向解析
#PidFile /var/run/sshd.pid
#MaxStartups 10
##MaxStartups 設(shè)置同時允許幾個尚未登入的聯(lián)機,當(dāng)用戶連上ssh但并未輸入密碼即為所謂的聯(lián)機,
###在這個聯(lián)機中,為了保護主機,所以需要設(shè)置最大值,預(yù)設(shè)為10個,而已經(jīng)建立聯(lián)機的不計算入內(nèi),
####所以一般5個即可,這個設(shè)置可以防止惡意對服務(wù)器進行連接
#MaxAuthTries 6
##MaxAuthTries 用來設(shè)置最大失敗嘗試登陸次數(shù)為6,合理設(shè)置辭職,可以防止攻擊者窮舉登錄服務(wù)器
#PermitTunnel no
############3.7、開放禁止用戶設(shè)定############
#AllowUsers<用戶名1> <用戶名2> <用戶名3> ...
##指定允許通過遠程訪問的用戶,多個用戶以空格隔開
#AllowGroups<組名1> <組名2> <組名3> ...
##指定允許通過遠程訪問的組,多個組以空格隔開。當(dāng)多個用戶需要通過ssh登錄系統(tǒng)時,可將所有用戶加入一個組中。
#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
7.sftp是什么
SFTP是Secure FileTransferProtocol的縮寫,安全文件傳送協(xié)議。
SFTP和FTP是兩種協(xié)議,它們是不同的,sftp是ssh內(nèi)含的協(xié)議,只要sshd服務(wù)器啟動了,它就可用,它本身沒有單獨的守護進程,更不需要ftp服務(wù)器啟動。
SFTP同樣是使用加密傳輸認證信息和傳輸?shù)臄?shù)據(jù),所以,使用SFTP是非常安全的。但是,由于這種傳輸方式使用了加密/解密技術(shù),所以傳輸效率比普通的FTP要低得多,如果您對網(wǎng)絡(luò)安全性要求更高時,可以使用SFTP代替FTP。
8.sftp登陸
使用sftp登陸遠程服務(wù)器,可以
sftp root@192.168.0.1
也可以指定端口號
sftp -oPort=22 root@192.168.0.1
9.使用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/
10.更多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
執(zhí)行本地命令
如果我們想在進入sftp會話環(huán)境下執(zhí)行本地命令怎么辦?只需要在本地命令之前加嘆號!即可,示例如下:
!ls
退出會話
無論是在 ssh 還是 sftp,都可以使用 exit 退出當(dāng)前會話,sftp 還可以使用 quit 命令退出。
11.結(jié)語
相信本文足以可以讓你解決使用終端過程中碰到的絕大多數(shù)問題了。