Linux Command – sshpass

有時候不想登入到遠端伺服器,只需要傳送一個指令到遠端伺服器並回傳其結果(常用於自動化腳本 script),這時候就可以透過 sshpass 來解決.

測試環境為

  • SSH Server ( CentOS 7 x86_64 虛擬機) – IP : 192.168.95.150
  • SSH Client ( CentOS 7 x86_64 虛擬機) – IP : 192.168.95.129

所需套件.

[root@localhost ~]# yum install sshpass

一般使用 SSH 連線,不想要使用密碼驗證,需要產生公私鑰,SSH 金鑰的安全驗證採用 RSA , DSA 認證步驟如下:

  1. SSH Server 會把他的公開金鑰提供給 SSH Client 來作加密使用.
  2. SSH 伺服器會檢查 SSH Client 指定的使用者是否有儲存公開金鑰在 $HOME/.ssh/authorized_key 檔案中.
    • 沒有 – 基於密碼的安全驗證,SSH Server 會提示使用者輸入使用者密碼.
    • – 基於金鑰的安全驗證.
      1. SSH Server 會請求 SSH Client 作身份驗證.
      2. SSH Client 會檢查自己的 $HOME/.ssh 目錄下,看看你是否擁有私鑰 (名稱 id_dsa)
      3. 如果私鑰存在,SSH 會提示你輸入此私鑰的通行證 passphrase ,接下來會使用這私鑰來建立簽章並傳給 SSH Server.
      4. 如果 SSH Server 用 SSH Client 公鑰驗證,驗證成功就不需要使用者輸入密碼了.

關於詳細 SSH 身份驗證請參考 http://benjr.tw/301

如果不想要使用這一堆公私鑰,有沒有辦法使用基於密碼的安全驗證又可以跳過使用者輸入使用者密碼,這時候可以使用 sshpass 來做.

SSH Server 公開金鑰

  1. 在開始使用 sshpass 要注意一下,我們還是需要先取得遠端的 SSH Server 公開金鑰 (Public key),最快的方式就先用 SSH 登入到遠方伺服器,並回答 Yes 以取得公開金鑰.
    [root@localhost ~]# ssh root@192.168.95.150
    The authenticity of host '192.168.95.150 (192.168.95.150)' can't be established.
    ECDSA key fingerprint is SHA256:jL8K1jigH4CPZ1/atCSs8OU20Ecb0G7LhHO5t8yJGik.
    ECDSA key fingerprint is MD5:b3:ff:1f:39:ec:df:28:80:19:34:80:f7:96:7d:1b:88.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.95.150' (ECDSA) to the list of known hosts.
    root@192.168.95.150's password: 
    Last login: Tue Oct 30 04:35:26 2018 from 192.168.95.1
    [root@localhost ~]# exit
    logout
    Connection to 192.168.95.150 closed.
    [root@localhost ~]# cat .ssh/known_hosts 
    192.168.95.150 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGg9t63E3sLXbJFeHwI0EEHsgFdOBg534PGx6ktp2AGzXwobK493CS3YJyWHsUCyPPqBdF3Mkn1ERoIYeVbNkZ8=
    
  2. 或是在 SSH Client 修改 /etc/ssh/ssh_config ,讓預設都是直接接收公開金鑰 (SSH Client 不需要輸入 yes).
    [root@localhost ~]# vi /etc/ssh/ssh_config
    StrictHostKeyChecking no 
    [root@localhost ~]# systemctl restart sshd
    [root@localhost ~]# systemctl status sshd
    ● sshd.service - OpenSSH server daemon
       Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
       Active: active (running) since 二 2018-10-30 22:20:23 EDT; 6s ago
         Docs: man:sshd(8)
               man:sshd_config(5)
     Main PID: 2152 (sshd)
        Tasks: 1
       CGroup: /system.slice/sshd.service
               └─2152 /usr/sbin/sshd -D
    
  3. 或是在使用 SSH 使用參數 StrictHostKeyChecking no
    [root@localhost ~]# ssh -o StrictHostKeyChecking=no root@192.168.95.150
    

下面範例透過 sshpass 來獲取遠端伺服器的資訊.

[root@localhost ~]# sshpass -p "111111" ssh root@192.168.95.150 "hostname" 
localhost.localdomain

密碼與要傳送到遠端的指令,使用 ” , “” 似乎並不影響.

[root@localhost ~]# sshpass -p 111111 ssh root@192.168.95.150 "hostname" 
localhost.localdomain
[root@localhost ~]# sshpass -p 111111 ssh root@192.168.95.150 hostname
localhost.localdomain
[root@localhost ~]# sshpass -p '111111' ssh root@192.168.95.150 "hostname"
localhost.localdomain

關於密碼的部分,剛剛使用的是明碼.

  • -p password : Provide password as argument (security unwise).

還有下列幾種方式來處理密碼問題.

  • -f filename : Take password to use from file.
    密碼可以寫在檔案中.

    [root@localhost ~]# vi sshpass
    111111
    [root@localhost ~]# sshpass -f sshpass ssh root@192.168.95.150 "hostname"
    localhost.localdomain
    
  • -d number : Use number as file descriptor for getting password.
    這樣的用法大多用於 script 需要使用者輸入參數時使用.

    [root@localhost ~]# echo "111111" | sshpass -d 0 ssh root@192.168.95.150 "hostname"
    localhost.localdomain
    
  • -e : Password is passed as env-var “SSHPASS”.
    使用環境變數 $SSHPASS

    [root@localhost ~]# export SSHPASS='111111'
    [root@localhost ~]# echo $SSHPASS
    111111
    [root@localhost ~]# sshpass -e ssh root@192.168.95.150 "hostname"
    localhost.localdomain
  • 可以將 export SSHPASS=’111111′ 寫入 /etc/profile 檔案,這樣重開機就不需要重新設定了.

常見問題
執行後無顯示遠端指令結果,可能還沒有取得遠端 SSH Server 的公開金鑰 (Public key),需先登入到遠端伺服器,再試試看.

[root@localhost ~]# sshpass -p '111111' ssh root@192.168.95.150 "hostname"
沒有解決問題,試試搜尋本站其他內容

One thought on “Linux Command – sshpass

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料