
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/private
key 不是這種情況下的選項。
如果有可用的程式碼可以提供與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: