有時候不想登入到遠端伺服器,只需要傳送一個指令到遠端伺服器並回傳其結果(常用於自動化腳本 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 epel-release [root@localhost ~]# yum install sshpass
一般使用 SSH 連線,不想要使用密碼驗證,需要產生公私鑰,SSH 金鑰的安全驗證採用 RSA , DSA 認證步驟如下:
- SSH Server 會把他的公開金鑰提供給 SSH Client 來作加密使用.
- SSH 伺服器會檢查 SSH Client 指定的使用者是否有儲存公開金鑰在 $HOME/.ssh/authorized_key 檔案中.
- 沒有 – 基於密碼的安全驗證,SSH Server 會提示使用者輸入使用者密碼.
- 有 – 基於金鑰的安全驗證.
- SSH Server 會請求 SSH Client 作身份驗證.
- SSH Client 會檢查自己的 $HOME/.ssh 目錄下,看看你是否擁有私鑰 (名稱 id_dsa)
- 如果私鑰存在,SSH 會提示你輸入此私鑰的通行證 passphrase ,接下來會使用這私鑰來建立簽章並傳給 SSH Server.
- 如果 SSH Server 用 SSH Client 公鑰驗證,驗證成功就不需要使用者輸入密碼了.
關於詳細 SSH 身份驗證請參考 https://benjr.tw/301
如果不想要使用這一堆公私鑰,有沒有辦法使用基於密碼的安全驗證又可以跳過使用者輸入使用者密碼,這時候可以使用 sshpass 來做.
SSH Server 公開金鑰
- 在開始使用 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=
- 或是在 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
- 或是在使用 SSH 使用參數 StrictHostKeyChecking no
[root@localhost ~]# ssh -o StrictHostKeyChecking=no root@192.168.95.150
下面範例透過 sshpass 來獲取遠端伺服器的資訊,除了 ssh 指令外 scp 也可以用.
[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”