1. 程式人生 > >SSH客戶端 (通過密匙連線遠端linux主機)

SSH客戶端 (通過密匙連線遠端linux主機)

導讀:

在這篇文章中,主要談及如何利用ssh-keygen生成密匙對,並且在windows本地機利用密匙遠端連線linux主機,而程式碼將用python來實現。

1. ssh-keygen

1.1SSH金鑰

SSH金鑰可以認為是和另一臺電腦通訊時的唯一的識別證,利用SSH金鑰對可以讓我們方便的登入到 SSH 伺服器,這樣不需要輸入密碼,也更加安全。而這裡我們利用ssh-keygen來生成ssh 金鑰。

服務端在後臺執行並響應來自客戶端的連線請求,預設在22埠進行監聽,服務端一般是sshd程序,提供了對遠端連線的處理,一般包括金鑰認證、金鑰交換、對稱金鑰加密和非安全連線。

客戶端包含ssh程式以及像scp(遠端拷貝)、slogin(遠端登陸)、sftp(安全檔案傳輸)等應用程式。

1.2利用ssh-keygen生成ssh 金鑰

利用ssh-keygen生成ssh 金鑰:

命令:ssh-keygen -t [rsa|dsa]

加密方式rsa、dsa均可選,預設是dsa。執行命令將會生成私鑰檔案和公鑰檔案 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub。

如果在root使用者下生成密匙對,那麼檔案在/root/.ssh下。

生成密匙的時候,可以通過-f指定生成檔案的檔名,例如:

 ssh-keygen-t rsa -f ~/.ssh/id_rsa

2.用Python寫的SSH客戶端

在ssh_key.py新增如下程式碼:

#-*- coding:utf-8 -*-
import paramiko

#使用金鑰連線遠端主機
def ssh_command(ip,port,username,command):
    # 建立SSH物件
    client = paramiko.SSHClient()
    # 允許連線不在know_hosts檔案中的主機
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #利用密匙
    key="G:/root/ssh/id_rsa"
    client.load_system_host_keys()
    #連線伺服器
    client.connect(ip, port, username, key_filename=key)
    # 直接使用SSHClient物件的exec_command()在服務端執行命令
    stdin,stdout,stderr = client.exec_command(command)
    receive = stdout.read()
    # 列印輸出
    print receive.decode('utf-8')
    # 關閉連線
    client.close()
ssh_command('192.168.1.175',22,'root','ls')

3.在win10下利用密匙遠端連線Linux主機

3.1製作金鑰對

在遠端主機linux上的終端執行以下命令,通過-f指定了生成檔案的檔名,通過-P指定了無密碼:

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P""

在/root/.ssh下可以看到,已經生成了私匙和公鑰。

3.2在遠端主機linux上配置公鑰

公鑰一般命名為authorized_keys,這是因為sshd的配置檔案預設名字是這個,為了避免出現奇怪的問題,最好這樣命名。所以我們進入/root/.ssh/目錄下,把id_rsa.pub拷貝到authorized_keys檔案中,在終端執行命令如下:

cd /root/.ssh/

cat id_rsa.pub >> authorized_keys

設定一下檔案許可權:

chmod 600 authorized_keys

chmod 700 ~/.ssh

3.3在本地主機win10上配置私匙

我們在Linux上已經配置好了公鑰,現在是時候在本地主機win10上配置私匙了。

選擇一個磁碟,把剛才製作的私匙檔案id_rsa放在“G:\root\ssh”目錄下,注意一定要把磁碟的名字改為英文,中文會出問題。

3.4配置sshd_config

開啟/etc/ssh/sshd_config,我們需要配置它。在sshd_config檔案中,預設將金鑰認證這種登入方式給註釋了,所以我們需要去掉前面的註釋符號#。

3.5利用python程式碼去遠端連線Linux

執行python2 ssh_key.py,結果如下,我們成功的在win10上利用私匙遠端連線了linux。