Linux shell/bash 程式碼中的 sshpass 替代方案

Linux shell/bash 程式碼中的 sshpass 替代方案

sshpass這些是從檔案或作為參數讀取密碼的標準命令。

user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$

user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$

expect如果不可用,是否可以在 shell 中編寫相同的程式/腳本?

Public/privatekey 不是這種情況下的選項。

如果有可用的程式碼可以提供與sshpass現有相同的功能,請告訴我。

程式碼越簡單越好。

答案1

你可以script(1)作為一個小期望,只要你可以應付調整任意超時,這當然是相當笨拙的:

{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'

或使用 BSD 的語法script(1)

{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD

sleep是必要的,因為ssh在讀取密碼之前會耗盡 tty 的輸入緩衝區(並丟棄已寫入的內容)。如果遠端伺服器是有時如果反應速度慢,使用「夠大」的超時可能不切實際。

sshpass等等會在將密碼寫入 pty 的主端之前expect等待ssh寫入提示來處理該問題。... password:從標準 shell 執行此操作既不簡單,也不是很健全。這是使用命名管道的拼湊:

passwdcmd(){
    t=$(mktemp -u); mkfifo "$t" || return
    script /dev/null -qc "$2" <>"$t" | { dd count=1 2>/dev/null; echo "$1" >"$t"; rm "$t"; cat; }
}

passwdcmd PASSWD 'ssh user@host CMD'

當然,這不是很安全,特別是因為echo可能不是內建的 shell。對於 ssh 的任何非互動式使用,使用公鑰認證

答案2

剛剛發現了令人驚嘆的 bash 腳本,它在純 bash 上實現了 sshpass:

相關內容