Linux之SSH協議知識點總結

roc_guo發表於2021-12-09

最近在寫自動化測試用例的時候經常會用python 語言去實現檔案的上傳下載功能,這裡主要用到的就是SSH 協議。為了更好的理解SSH 協議,我就翻看了手頭的書,回顧SSH 的相關知識點,今天就把它總結下,希望對用到SSH 協議的小夥伴能夠有所幫助。

一、何為 SSH 協議?

SSH 是一種不同於HTTP 協議的網路協議,用於伺服器之間的加密登入。如果一個使用者想從本地使用SSH 協議登入另一臺遠端伺服器,需要對方伺服器的使用者名稱,密碼,地址。這是目前Linux 系統進行遠端管理的首選方式。最開始的時候,網際網路都是明文通訊,一旦被截獲,資訊就被暴露無遺,因此很不安全,很容易被黑攻擊而導致網站癱瘓。自從SSH 協議問世之後,因其安全性很快成為Linux 系統的標配。

二、如何配置 sshd 服務

我們說系統中一切皆檔案,那麼作為Linux 系統遠端管理的首選,我們要對哪個檔案做怎樣的配置呢?sshd 服務的配置在系統的/etc/ssh/sshd_config 檔案中,我們可以開啟此檔案看看裡邊都有啥配置。這個配置檔案我用的最多的就是開啟虛機的root 許可權,可以用vim 文字編輯器開啟此配置檔案,然後把第48 #PermitRootLogin yes 引數前的# 去掉,然後儲存檔案並退出,僅僅是這樣檔案是沒生效的,一定要記得重啟sshd 服務,也就是在系統中執行service sshd restart 命令,這樣才算真正把該虛機的root 許可權開啟。這裡附上用python 語言實現該功能的程式碼:

def create_ssh_connect_object(ip_remote, port_remote, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        print('Connecting to {0}:{1}'.format(ip_remote, port_remote))
        ssh.connect(ip_remote, port_remote, username=username, password=password, timeout=TIMEOUT)  # timeout protection
        return ssh
    except:
        print('Failed to connect {0}, now will retry'.format(ip_remote))
        ssh.connect(ip_remote, port_remote, username=username, password=password, timeout=TIMEOUT)  # timeout re-try
        print('Retry failed, please check the IP, port, account

and password')

 

def permit_root_login():
    """
    Enable ssh connection for root
    """
    ssh = create_ssh_connect_object(VXM_IP, 22, VXM_USER, VXM_PASSWORD)
    print('Connecting to new VxRail Manager with mystic')
    channelSSHOb = ssh.invoke_shell()
    remove_offending_key_cmd = 'ssh-keygen -R {0} -f /root/.ssh/known_hosts'.format(NEW_VXM_IP)
    channel_exe_cmd(channelSSHOb, remove_offending_key_cmd)
    connect_to_new_vxm_cmd = 'ssh -o "StrictHostKeyChecking no" mystic@{0}'.format(NEW_VXM_IP)
    if channel_exe_cmd(channelSSHOb, connect_to_new_vxm_cmd).endswith(u"Password: "):
        print('Entering the password for mystic')
        mystic_pwd = 'mystic'
        channel_exe_cmd(channelSSHOb, mystic_pwd)
    change_to_root_cmd = 'su'
    if channel_exe_cmd(channelSSHOb, change_to_root_cmd).endswith(u"Password: "):
        print('Switch user to root')
        root_pwd = 'Passw0rd!'
        channel_exe_cmd(channelSSHOb, root_pwd)
    print('Permit root login for SSH')
    permit_root_login_cmd = "sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"
    channel_exe_cmd(channelSSHOb, permit_root_login_cmd)
    restart_sshd_cmd = 'service sshd restart'
    channel_exe_cmd(channelSSHOb, restart_sshd_cmd)
    ssh.close()

 

三、安全金鑰驗證

SSH 作為一種安全的遠端登入協議,它是怎麼實現安全驗證的呢?

SSH 提供了兩種安全的驗證方法:

1.       基於口令的驗證,也就是用賬戶和密碼來進行登入驗證。如:

mystic@mystic-vm:~$ ssh root@20.10.115.201

Password:

這種方式需要使用者提供使用者名稱和密碼,很像我們看的抗日戰爭片中,共產黨想要夜襲日本的軍備司令部,想要進入大門,經常會要對暗號,這個暗號就像密碼,對,則放行,不對,則攔截。

2.       基於金鑰的驗證,這種方法類似於需要用鑰匙開門,一把鑰匙開一個門,鑰匙不對,則門就打不開,不管你是誰。我只認鑰匙。作為一個碼農,這個是在我們使用Github 的時候使用SSH 協議克隆程式碼經常會用到的,我們想要在某臺虛機上克隆github 的程式碼,就先要在該虛機上生成金鑰對,然後把金鑰對中的公鑰上傳至github ,讓該虛機和github 相互識別,然後才能成功的把程式碼克隆到該虛機。

四、遠端傳輸命令

在我們的日常工作中,經常會涉及到檔案在不同伺服器之間的上傳下載,最方便快速的方式是使用scp 命令,scp 也是基於SSH 協議的,scp 的語法格式:

  把本地檔案上傳到遠端伺服器:Scp  [ 引數] 本地檔案 遠端賬戶@ 遠端IP 地址:/ 遠端目錄

  把遠端伺服器檔案下載到本地:Scp  [ 引數] 遠端賬戶@ 遠端IP 地址:/ 遠端目錄 本地目錄

使用scp 命令進行檔案的上傳下載時,一定要寫清楚檔案的具體位置,如果是壓縮檔案,記得加引數-r 進行遞迴操作。只要檔案地址正確,遠端伺服器的賬戶密碼正確,就可以開始檔案的傳輸工作,這種方式比我們用檔案傳輸工具傳輸檔案更高效,省去了登入工具的麻煩,同時傳輸效率也更快。

以上就是我日常工作中經常用到SSH 協議的使用場景,總結的可能不是很全面,畢竟認知有限,有疏漏的地方歡迎大家給予指正,如果說剛好你的工作中也需要用到這些,希望對你有所幫助。如果你還想對SSH 協議有更深層次的理解,但苦於找不到好資料,這裡推薦給你 這本書,這本書的第9 章很全面的介紹了SSH 協議,從配置到使用都有很詳細的介紹。不管你處於什麼水平,都很適合你去查閱。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2846626/,如需轉載,請註明出處,否則將追究法律責任。

相關文章